LSL Quaternion/ru

From Second Life Wiki
Jump to navigation Jump to search

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.

Example rotation.jpg

Продолжая вокруг к точке на Востоке является либо

<0, 0, 1, 0> or <0, 0, -1, 0>

Наклон объекта вправо (то есть, повернув его против часовой стрелки вокруг оси х), например, путем 90 градусов описывается следующим образом:

<0.707, 0, 0, 0.707>

качки и вперед (по часовой стрелке вокруг оси у) на ту же сумму в

<0, -0.707, 0, 0.707>.

Важно заметить, что отображение одного вектора не уникально определяют соответствующее вращение кватернионов. Например, на рисунке ниже мы видим ряд способов для поворота оси х на оси у. Различные вращение приводит к различным окончательной ориентации ортогональной (y, z) направление.

Alternate rotations.jpg