LSL Quaternion/ru
LSL Портал | | | Функции | | | События | | | Типы | | | Константы | | | Потоки | | | Библиотека Скриптов | | | Учебники |
Help Portal: |
Avatar | Bug Fixes | Communication | Community | Glossary | Land & Sim | Multimedia | Navigation | Object | Video Tutorials | Viewer | Wiki | Misc |
Справочный портал: |
Аватары | Устранённые ошибки | Коммуникация | Сообщество | Глоссарий | Земля и Симы | Мультимедиа | Навигация | Объект | Видеоуроки | Вьювер | Wiki | Остальное |
quaternion
Ключевое слово quaternion
, поддерживаемое компилятором LSL, означает то же самое, что и взаимозаменяемое с rotation
.
Определение и свойства:
Кватернионы обобщение комплексных чисел, изобретенные Уильям Роуэн Гамильтон в середине 19-го века. Напомним, что комплексное число является суммой обычного вещественного числа и мнимого числа Bi, где я определяется по формуле:
i2 = -1
Для построения кватернионная введем дополнительные обобщенные мнимые единицы J и К с предположениями:
j2 = -1; k2 = -1; ijk = -1
Из этих основных определений легко получить умножение соотношений для этих обобщенных мнимых величин:
ij = k; jk = i; ki = j
и
ji = -k; kj = -i; ik = -j
То есть, умножение кватернионов не является коммутативной. В то время как некоммутативные операции в настоящее время известной чертой матричной алгебры и векторного и тензорного анализа, на момент их изобретения идея была радикальной.
Кватернион затем число вида
Q = a + bi + cj + dk
где a,b и c - обычные действительные числаДобавление кватернионам достаточно легко, нужно только добавляет соответствующие коэффициенты:
(a + bi + cj + dk) + (e + fi + gj + hk) = ( a+e) + (b+f)i + (c+g)j + (d+h)k
Результат умножения двух кватернионов могут быть разработаны с использованием продукта отношениях выше, не забывая сохранять порядок терминов в i,j,k, так как мнимые единицы не коммутируют.
QR = (a + bi + cj + dk)(e + fi + gj + hk)
=
ae + afi + agj + ahk + bei - bf + bgij + bhik + cej + cfji - cg + chjk + dek + dfki + dgkj - dh
=
ae + afi + agj + ahk + bei - bf + bgk - bhj + cej - cfk - cg + chi + dek + dfj - dgi - dh
=
(ae - bf - cg - dh) + (af + be + ch - dg)i + (ag -bh + ce + df)j + (ah + bg - cf + de)k
А вы думали, умножение комплексных чисел был беспорядок!
Теперь мы можем определить аналог комплексно сопряженные (мы будем использовать обозначения *, но и другие обозначения являются общими):
Q*= a - bi - cj - dk
Произведение кватернионов и сопряженное является:
QQ* = (a + bi + cj + dk)(a - bi - cj - dk) =
=
(a2 + b2 + c2 + d2) + (-ab + ba - cd + dc)i + (-ac + bd + ca - db)j + (-ad - bc + cb + da)k
=
(a2 + b2 + c2 + d2)
который выглядит скорее как квадрат евклидовой длины. Если рассматривать тройка (B, C, D) в качестве вектора V, мы можем переписать это квадрат длины, как:
QQ* = a2 + ||V||2
Первый член, таким образом, часто упоминается как скалярное или иногда действительной части кватерниона, а триплет (б, в, г) в виде векторной части.
quaternion и rotation:
Поэтому мы заботимся о том, что кватернионам Second Life использует их для представления вращений. Как это делается? Рассмотрим кватернионная представление вектора V = (b,c,d), который находится всего в кватернионов с нулевой вещественной частью:
Q(V) = 0 + bi + cj + dk
Если мы умножим Q некоторыми другими кватернионов, в общем мы получим ненулевой действительной частью, то есть, мы изменили вектор в не-вектор кватернион, который не смотрел на все вроде вращения. Тем не менее, если мы умножим на одной стороне кватернион z, а с другой стороны по мультипликативным обратным z, z-1, мы получим результат с 0-значение вещественной части:
Re[zQ(V)z-1] = 0
-- то есть, мы укажем вектор в вектор. Чтобы увидеть, что это так, заметим, что из формулы умножения, действительная часть произведения двух кватернионов инвариантной к порядку умножения, а именно:
Re[QR] = Re[RQ].
Так что мы можем поменять местами первый и (второй * третий) кватернионов в отображение без изменения реальной части:
Re[z(Q(V)z-1)] = Re[(Q(V)z-1)z] = Re[Q(V)(z-1z)] = 0
с кватернионная умножение ассоциативно, и мы предполагали, что Q имеет нулевое значение вещественной части. Эта операция левого умножения кватернионов и правого умножения его на обратной известен как сопряжение z. Читатели, знакомые с матричной алгебре распознает его как похож на разложении матрицы во вращение и масштабирование чистой (диагональная матрица).
При каких условиях сопряжение кватернионов вернуть оригинальные кватернионов?
zQz-1 = Q подразумевает zQ = Qz
(Который может быть легко показано правой умножения первого выражения z). Когда делать кватернионам коммутируют? Из выражения для произведения двух кватернионов, напомнив, что реальная коммутирующих частей в целом, у нас есть, например, для умножения часть i:
(af + be + ch - dg)i + ... = (eb+ fa + gd - hc)i + ...
в случае, когда умножение коммутативно. Это может быть правдой, если ch - dg = 0 or c/d = g/h, то есть наклон вектора участие в (j,k) план такой же, как для кватернионов. Так как нет ничего особенного я, это также должно быть верным (i,j) и (i,k) планов, то есть два кватернионов должны быть вектором части, которые ориентированы в том же направлении, или, другими словами, чтобы лежат на одной прямой.
Это не слишком трудно показать, что сопряжение также линейна (то есть, сопряженное суммы равно сумме сопряженных), и это легко видеть, что длина вектора часть Q сохраняется при сопряжении. Какой длины с сохранением линейное преобразование сохраняет вектор только тогда, когда его ось совпадает с вектором? Почему -- вращение, конечно. Так сопряжением Q на z эквивалентна вращающихся векторная часть Q вокруг оси определяется вектором часть z.
Давайте попробуем простой случай. Рассмотрим вектор V = (1,0,0) и соответствующие кватернионов Q = 0 + i. Вращаться вокруг z-оси мы должны кватернионную z вида a + ck. Тогда сопряжения:
Q' = (a+c k)(i)(a + ck)-1
Что такое обратная z? Легко видеть, что если мы выбираем и С, так что длина кватернионов равно 1, то обратная равно сопряженное:
len(z) = 1 = zz* implies z* = z-1
так что мы можем написать:
Q' = (a+c k)(i)(a - ck) = (a+c k)(ai + cj) = a2i + acj + caj - c2i = ( a2- c2)i + 2acj
с ограничением:
a2+ c2 = 1
это означает, что мы можем написать a = cos(θ/2), b = sin(θ/2) для некоторого угла θ (резон фактора 1/2 станет ясно чуть позже).
Теперь, в условиях я и j соответственно стали:
cos2(θ/2) - sin2(θ/2) = cos(θ)
и
2 cos(θ/2) sin(θ/2) = sin(θ)
Таким образом, это действительно представляет собой вращение k (z) оси на угол θ. Мы можем сделать вывод, что в общем случае, для поворота вектора V вокруг оси A= (b,c,d) (предполагается нормированной, то есть ||A|| = 1) на угол θ, построим кватернионная
z = cos(θ/2) + sin(θ/2)A = cos(θ/2) + sin(θ/2){bi + cj + dk}
а затем сопряженных кватернионов Q = 0 + V with z :
Q' = zQz*
, из которых мы извлекаем векторной части:
Q' = 0 + V'
V' есть повернутый вектор V. В Second Life, представляющая кватернионам вращения приведены в виде четырех чисел с плавающей точкой. Первые три векторной части, а последний является скалярной части: Q = <Q.x, Q.y, Q.z, Q.s>. Что касается второго направления жизни региона, между Восток-Запад направлении оси х, Север-Юг является y-оси, а вверх-вниз является z-оси. Напомним, что x-карты к мнимой оси i, у к j и z-k. Мы можем видеть, что это правая система координат, если вы расположите правую руку так, что, не меняя его ориентацию, расширенной показывать пальцем в направлении Plus x-направление (Восток) и сгибания пальцев направить их в положительном направлении y-направление (север), затем распространяются пальцем, в плоскости ладони и перпендикулярно к вам пальцы, указывает в направлении плюс z-направление (вверх).
По умолчанию углы поворота определяются в радианах, от -π (-pi) до +π (-pi); то есть, мы можем вращать против часовой стрелки (в положительном направлении - от плюс вращающейся оси x (Восток) через ось Y плюс (Север) в минус оси x (Запад)) на полпути вокруг, или в направлении по часовой (отрицательные - от плюс вращающиеся оси x (Восток) через минус оси у (юг) до минус оси x (Запад)) направлении половину наоборот, с двух направлений дает тот же физический результат на угол поворота 3,141 радиан или 180 градусов. Таким образом, вращение против часовой стрелки лица указывая Запад, вокруг оси z на 90 градусов (к точке Южной) составляет:
<0, 0, 0.707, 0.707>
так как синус и косинус π/4 (половина от угла поворота) есть оба 1/20.5.
Продолжая вокруг к точке на Востоке является либо
<0, 0, 1, 0> or <0, 0, -1, 0>
Наклон объекта вправо (то есть, повернув его против часовой стрелки вокруг оси х), например, путем 90 градусов описывается следующим образом:
<0.707, 0, 0, 0.707>
качки и вперед (по часовой стрелке вокруг оси у) на ту же сумму в
<0, -0.707, 0, 0.707>.
Важно заметить, что отображение одного вектора не уникально определяют соответствующее вращение кватернионов. Например, на рисунке ниже мы видим ряд способов для поворота оси х на оси у. Различные вращение приводит к различным окончательной ориентации ортогональной (y, z) направление.