avatar

Кватернионы и вращение векторов с их помощью. Часть 1.

опубликовал в Программирование

Пространство вращения


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

Сфера вращений вокруг оси лежащей в XY
Сфера вращений вокруг оси лежащей в 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

P.S.

Я хотел всю информацию о кватернион заключить в одну статью, но глядя на стену текста выше, решил что лучше разбить её на несколько частей. В следующей части планирую показать практику использования кватернион в том числе работу с компонентами непосредственно, связь этого всего с углами эйлера, и рассмотреть разные способы их реализации.

P.P.S

В этой статье вообще нет программирования, и много математики. К сожалению без математического введения, тут писать было бы либо не о чем, либо было ничего не понятно. Так что эта часть чистая математика, в следующих будет уже и код))
+6
1
4745
  • 6 комментариев

    avatar
    Я ничего не понял :D
    avatar
    Тогда задавай вопросы)))
    avatar
    А можно как то на пальцах объяснить?
    avatar
    На пальцах вращение есть вектор и угол, если их особым образом записать можно проводить особые операции которые поворачивают вектор. Я думаю в следующей части когда будет практика все станет понятнее
    avatar
    Полезная информация для программиста графики. Лови плюс :)
    Так же по этой теме есть хорошая статья на gamedev.
    avatar
    Спасибо, статья реально хорошая))
    Чтобы оставить комментарий необходимо .