
Кватернионы и вращение векторов с их помощью. Часть 1.
JazzyJohn
опубликовал в
Программирование
Пространство вращения
Начнем с того что определим понятие вращения.Любое трехмерное вращение можно описать с помощью вектора, который является осью, и скаляра, который является углом вращения вокруг оси. Для наглядности давайте попробуем описать частный случай: вращение вокруг оси лежащей в плоскости XY. Мы можем описать одну из таких осей как точку пересечение нашего вектора и окружности, радиусом которой является угол нашего поворота.Все вращения вокруг осей лежащих в XY представляют собой сферу. Определим северный полюс нашей сферы как вращение с 0 углом. Сечения это сферы параллельные плоскости XY представляют собой вращения вокруг оси в плоскости XY на угол определяемый широтой, на которой мы делаем сечения. Широта равна половине угла вращения, т.е. широта меняется от 0 до 180, сам же угол от 0 до 360.

Сфера вращений вокруг оси лежащей в XY
Отметим пару удобных свойств такого представления. Во первых это представление неразрывно, т.е. близкие повороты находятся рядом на сфере, получается дальнейшие интерполяции будут идти по кратчайшему пути. Во вторых каждое вращение представлено двумя точками на сфере, которые соединены прямой проходящей через центр сферы, это отражает общее свойство вращения: любое вращение можно представить как вращение вокруг оси смотрящей в противоположном направлении на обратный угол.
Теперь расширяем нашу модель на любое вращение: Вращение на определенный угол представляет собой Сферу( окружность для частного случая). А вращение на любой угол набор сначала расходящихся сфер(до 180 градусов) и затем сходящихся(после 180 и до 360) и вместе представляют собой 3-сфера, т.е. четырехмерную сферу(это обычная сфера для частного случая). Вот и все мы получили возможность описывать любые вращения в трехмерном пространстве.
Теперь давайте параметризируем наше представление. Для нашего частного случая возможна следующая параметризация: поместим сферу в трехмерное пространство с декартовыми координатами (w, x, y), северный полюс определим как (w, x, y) = (1, 0, 0), южный полюс как (w, x, y) = (-1, 0, 0), экватор, тогда определяется как кривая удовлетворяющая
{w = 0, x² + y² = 1 }. Все точки на сфере удовлетворяют уравнению w² + x² + y² = 1. Получились две степени свободы и три координаты. Координаты (w, x, y) описывают вращение вокруг осей лежащих в XY (x,y,0) на угол α= 2arccos(w)= 2 arrcos((x² + y²)^0.5). Для нашей четырехмерной сферы понадобится еще одна координата: (w, x, y, z) и условием для точки на сфере w² + x² + y² + z² = 1, и одна точка на сфере описывает поворот вокруг оси (x,y,z) на угол α= 2arccos(w)
Кватернионы
Гамильтон в 1843 году предложил систему гиперкомплексных чисел(это все числа которые расширяют вещественные, в том числе и обычные комплексные числа), с помощью которых очень удобно описывать 3-х и 4-х мерные пространства. Называются они кватернионы.Формальная запись кватерниона:
p = a +ib+jc+kd, где i,j,k мнимые единицы i*i=j*j=*k*k=j*k*i= -1
Также кватерниона можно представить как скаляр с вектором [u,w], где u вектор (b, с,d)
Вот таблица умножения мнимых единиц:

У такого числа огромное количество интересных свойств и не тривиальных операций( и если кому-то интересно я расскажу о них). Сейчас определим одно свойство: существование обратного по умножение элемента. Для начала определим операцию сопряжения над кватернионом, согласовываясь с логикой обычных комплексных чисел:
ṕ = a -ib-jc-kd, этот кватернион является сопряженным к p.
Модуль кватерниона назовем
|p| = (pṕ)^½ = (a² + b² + c² + d²)^½
Тогда:
p^-1=ṕ /|p|
Определим умножения для кватерниона в векторном представлении как:
[v,v]=[x,x][y,y]= [xy+yx+x*y,xy-xy]
Теперь вернемся к нашей 4-х мерной сфере, единичный кватернион идеально описывает точки на нашей сфере, и используя дополненную формулу Эйлера имеем:
p = w +ix+jy+kz =

Теперь поворот вектора q вокруг оси u на угол w получается следующим образом
q`= pq(p^-1)
Докажем это утверждение: Представим q как чисто мнимый кватернион [V,0], тогда, нам надо доказать что операция умножения переведет q тоже в чисто мнимый кватернион.
Докажем, что вещественная часть произведения равна 0:
q`=[q`,q`]=[p,p][q,q][p,-p]
[q,q][p,-p]=[qp+qp,pq-qp-q*p]=[qp,pq-q*p]
q`=[q`,q`]=[p,p][qp,pq-q*p]
q`=ppq-ppq+pq*p=0
Следовательно вещественная часть результата равна 0. Значит мы определили операцию поворота с помощью кватерниона.
Часть 2: http://gamesetup.ru/topic/621.html
6 комментариев
Так же по этой теме есть хорошая статья на gamedev.