Кватернионы - прекрасный инструмент описания поворотов в трехмерном пространстве. По сравнению с описанием поворотов матрицами, кватернионы обладают несколькими весомыми преимуществами:

  1. численная устойчивость;

  2. возможность интерполяции;

  3. легкость выделения оси и угла поворота из заданного кватернионного представления.

Но есть с кватернионами и проблема... Часто в статьях и туториалах они даются просто как факт: есть такой вот объект \mathbf{q}=a+b\mathbf{i}+c\mathbf{j}+d\mathbf{k}и вот так \mathbf v^{'}=\mathbf{q} \cdot \mathbf v \cdot \mathbf{q^*}он применяется для поворота вектора \mathbf v. Такой подход оставляет много вопросов:

  • почему кватернионы описываются 4-мя параметрами, хотя действуют в 3-х мерном пространстве?

  • почему мы считаем оси мнимыми?

  • почему мы разбиваем кватернион на 2 части и применяем с двух сторон?

  • почему они некоммутативны по произведению?

И как сказано вот в этой публикации:

Мы просто принимаем на веру странные таблицы умножения и другие загадочные определения, и используем их как «чёрные ящики», поворачивающие векторы так, как нам нужно

На самом деле, кватернионы не так сложны и они совсем не черные ящики, если понимать теорию групп. Возможно, именно на таких читателей и рассчитано большинство статей! Шутка :) Я думаю, что самом деле авторы многих статей просто сами не понимают механизм действия кватернионов и «принимают их на веру».

Тех, кто литературе предпочитает кинематограф, приглашаю сюда (не забываем про лайки, подписку и колокольчик):

В данной работе я предлагаю попробовать понять как действуют кватернионы. Шаг за шагом, начиная с простой очевидной геометрии, без гэпов в духе: "вот вам готовый математический объект, пользуйтесь".

1. Что такое повороты в 3D и какая у них размерность?

* 1.1. Модель вращения

* 1.2. Какая размерность у вращения в 3D?

* 1.3 Коммутативность и третья ось

* 1.4 Углы Крылова и углы Эйлера

* 1.5 Матрицы поворота

2. Кватернионы

* 2.1  Мнимые числа и двумерное вращение

* 2.2 Гиперкомплексные числа

* 2.3 Три мнимых оси

* (*)

* 2.4 некоторые свойства кватернионов

* 2.5 Вращаем вектор

* 2.6 Ось и угол вращения

* 2.7 С точки зрения алгебры

* 2.8 Интерполяция поворотов

Заключение

1. Что такое повороты в 3D и какая у них размерность?

1.1. Модель вращения

Для начала, давайте разберемся с решаемой задачей с геометрической точки зрения. Нам нужно понять преобразование, которое мы называем поворотом в 3-х мерном пространстве. И на этом этапе даже "понятные" матрицы поворота нам не подходят.

Давайте рассмотрим глобус!

Думаю, все представляют себе этот девайс, и как он работает: мы вращаем шарик, закрепленный. на оси и смотрим на сферическую карту Земли.

Вращать глобус можно по разному. Рассмотрим такую технику, ставим палец на какую-то точку и перемещаем, не отрывая от поверхности. Очевидно, что двигать палец получится только вдоль параллели. Можно поместить палец в одну произвольную точку и сместить его в другую произвольную (но лежащую на одной параллели с первой точкой). Каждой такой паре точек будет соответствовать какой-то поворот. А множество всех возможных пар точек, таким образом, будут описывать множество всех возможных поворотов шарика вокруг заданной оси. Причем, каждому повороту будет соответствовать целое множество пар точек. Но это не страшно, главное, что все возможные повороты будут учтены :)

Вот такое представление поворотов давайте рассмотри детально. Пусть у нас есть сфера, с центром в начале координат. Радиус сферы примем за единицу. Любое преобразование сферы, не изменяющее ее положения, не меняющее расстояние между точками ее поверхности, не выворачивающее ее на изнанку и отображающее множество всех точек сферы в себя же, будет вращением. На поверхности сферы определим две точкиA=\left(a_x,a_y,a_z\right)иB=\left(b_x,b_y,b_z\right). Поворот сферы будем описывать как результат преобразования, удовлетворяющего условиям ращения сферы и переводящее точкуAв точкуB: R_{A,B}(рисунок 1.1).

Рисунок 1.1: описание поворота парой точек на поверхности сферы
Рисунок 1.1: описание поворота парой точек на поверхности сферы

Такой поворот может быть представлен как результат вращения сферы в плоскости \left( AOB\right), где O- центр окружности. Но даже определившись с плоскостью вращения, или с осью (перпендикуляром к \left( AOB\right)), что в трехмерном случае эквивалентно, нас все равно останется неоднозначность по углам: все повороты на углы \alpha + 2\pi k , где k \in Nбудут эквивалентны повороту на угол \alpha в силу периодической природы вращения. Вернемся чуть позже и к такому определению поворота, а пока поговорим о размерности.

1.2. Какая размерность у вращения в 3D?

Для подсчета степеней свободы произвольного поворота введем такое понятие как поворот вокруг оси T: R_T- поворот, не меняющий проекцию точек на ось T, где T \in \left({X, Y, Z} \right). А также орбиту точки Cотносительно оси T: O_{C,T}- множество всех точек поверхности сферы, в которые может перейти точка Cв результате всевозможных поворотов R_T. Это и есть параллель на глобусе, если считать Tосью Земли.

Теперь рассмотрим орбиты точки Aотносительно осей Xи Y: O_{A,X}и O_{A,Y}(рисунок 1.2). O_{A,X}- то множества точек, у которых X-компонента совпадает с a_x, а O_{A,Y}- это множество точек у которых Y-компонента совпадает с a_y. Ось Zабсолютно равноправна остальным осям, поэтому мы могли выбрать произвольно любые две оси. Наша задача сейчас - показать, что для описания поворотов сферы нам достаточно всего двух осей!

Рисунок 1.2: орбиты точки  относительно осей и
Рисунок 1.2: орбиты точки A относительно осей Xи Y

Давайте рассмотрим множество всех точек A_{X,i}, в которые может переместиться точка A, двигаясь по своей орбите относительно оси X. Среди них выделим точки A_{Y}^{-}и A_{Y}^{+} - точки с минимальным и максимальным значением координаты Y, среди всех точек O_{A,X}соответственно. Для каждой точки A_{X,i}рассмотрим орбиту относительно оси Y: O_{A_{X,i},Y}, в том числе O_{A_{Y}^{-},Y} и O_{A_{Y}^{+},Y}- орбиты относительно оси Y точек A_{Y}^{-}и A_{Y}^{+}соответственно (рисунок 1.3).

Рисунок 1.3: орбиты точек
Рисунок 1.3: орбиты точек A_{X,i}

Теперь мы можем найти область сферы P_A^{X,Y}, в которую точкаAможет переместить в результате композиции двух: поворотов вокруг оси X, а затем вокруг оси Y. Эта область как раз и состоит из всего множества точек орбит O_{A_{X,i},Y}. Первый поворот вокруг оси Xпереместит нашу точку A в положение точки A_{X,i}, а затем поворот вокруг оси Yпереместит ее в любую точку орбиты O_{A_{X,i},Y}. Область P_A^{X,Y}состоит из всех точек поверхности сферы, ограниченных орбитами O_{A_Y^-,Y}и O_{A_Y^+,Y}(рисунок 1.4).

Рисунок 1.4: област сферы , в которую может переместиться точка в результате композиции поворотов вокруг оси и оси
Рисунок 1.4: област сферы P_A^{X,Y}, в которую может переместиться точка Aв результате композиции поворотов вокруг оси Xи оси Y

Как видно из построения, точка Bоказалась в этой области, а значит поворотR_{A,B}в данном конкретном случае может реализоваться как композиция поворотов вокруг оси X, а затем вокруг оси Y.

Теперь давайте проведём аналогичные рассуждения для оси Y. Рассмотрим множество всех точек A_{ Y,i}, в которые может переместиться точка A, двигаясь по своей орбите относительно оси Y. Среди них выделим точки A_{X}^{-}и A_{X}^{+} - точки с минимальным и максимальным значением координаты X, среди всех точек O_{A,Y}соответственно. Для каждой точки A_{Y,i}рассмотрим орбиту относительно оси X: O_{A_{Y,i},X}, в том числе O_{A_{X}^{-},X} и O_{A_{X}^{+},X}- орбиты относительно оси X точек A_{X}^{-}и A_{X}^{+}соответственно.

И найдем область сферы P_A^{Y,X}, в которую точкаAможет переместить в результате композиции двух: поворотов вокруг оси Y, а затем вокруг оси X. Эта область состоит из всего множества точек орбит O_{A_{Y,i},X}. Область P_A^{Y,X}состоит из всех точек поверхности сферы, ограниченных орбитами O_{A_X^-,X}и O_{A_X^+,X}(рисунок 1.5).

Рисунок 1.5: область сферы , в которую может переместиться точка в результате композиции поворотов вокруг оси , а затем вокруг оси . Желтым цветом обозначен участок области , видимы с внутренней стороны сферы.
Рисунок 1.5: область сферы P_A^{Y,X}, в которую может переместиться точка Aв результате композиции поворотов вокруг оси Y, а затем вокруг оси X. Желтым цветом обозначен участок области P_A^{Y,X}, видимы с внутренней стороны сферы.

Как видно из построения, точка Bоказалась и в этой области тоже, а значит поворотR_{A,B}в данном конкретном случае может также реализоваться и как композиция поворотов вокруг оси Y, а затем вокруг оси X. Ура, повороты коммутативные! На самом деле нет, но об этом ниже :)

Теперь давайте найдем найдем условия попадания точки B в области P_A^{X,Y} и P_A^{Y,X}.

Как было сказано выше, область P_A^{X,Y}ограничена орбитами относительно оси Yточек A_Y^-и A_Y^+ - точек с орбиты Aотносительно оси X, имеющих минимальную и максимальную проекцию на ось Y. То есть, это множества точек, имеющих значения компоненты Y, совпадающие с минимальным и максимальным значением компоненты Y, среди точек орбиты O_{A,X}. Но учитывая, что весе точки орбиты O_{A,X}имеют одинаковую X-компоненту a_xи сумма квадратов всех компонент любой точки сферы C равна радиусу сферы ( c_x^2+c_y^2+c_z^2=1), экстремальные значения Y- компоненты  \pm \sqrt{1-a_x^2}точек орбиты O_{A,X}будут достигаться при обнулении Z-компоненты. Тогда можно найти условиях попадания произвольной точки Cв область P_A^{X,Y}следующим образом:

|c_y | \leq \sqrt {1 - a_x^2} или c_y^2 \leq 1 - a_x^2 или c_y^2 \leq a_y^2+a_z^2

Проведя аналогичные рассуждения для области P_A^{Y,X}, мы обнаружим, что эта область состоит из точек C, X-компонеты которых лежат между значениями X-компонент точек A_X^-и A_X^+. Которые могут быть найдены как \pm \sqrt{1-a_y^2}. Таким образом, получаем условия попадания точки Cна поверхности сферыв область P_A^{Y,X}:

|c_x | \leq \sqrt {1 - a_y^2} или c_x^2 \leq 1 - a_y^2 или c_x^2 \leq a_x^2+a_z^2

Теперь предположим, сто на поверхности сферы есть такая точка C, в которую нельзя перевести точку A, применив к ней композицию двух поворотов вокруг осей Xи Yпо одному повороту в любом порядке. Тогда координаты точки Cдолжны удовлетворять паре условий: c_y^2 > a_y^2+a_z^2и c_x^2 > a_x^2+a_z^2

Сложим левые и правые части неравенств и получим, что должно выполняться следующее:

c_x^2 +c_y^2 > a_x^2+a_y^2+a_z^2+a_z^2>1+a_z^2>1, что противоречит условию нахождения точки на поверрхности сферы.

А что это все значит? Это значит, что для перевода точки A в любую другую точки поверхности сферы вращением, а значит и для описания любого вращения нам достаточно всего двух элементарных вращений: вокруг оси Xи вокруг оси Yв нашем примере. В общем случае это могут быть любые две оси в силу симметрии задачи.

Давайте пока просто запомним этот факт №1.

Любой поворот в трехмерном пространстве может быть описан всего двумя параметрами - углами поворотов вокруг осей Xи Y!!!

1.3 Коммутативность и третья ось

Итак, вращение в 3D может быть представлено как двумерное преобразование, мы это показали выше. Любое вращение, преобразующее точку сферы Aв точку сферы B можно представить как композицию вращений вокруг осей Xи Y: R_{A,B}=R_{A,B}^X \circ R_{A,B}^Yили R_{A,B}=R_{A,B}^Y \circ R_{A,B}^X, где R_{A,B}^Xи R_{A,B}^Y- повороты точки Aвокруг осей Xи Y соответственно.

А можем ли мы утверждать, что вращения коммутативные? То есть утверждать, что R_{A,B}^X \circ R_{A,B}^Y=R_{A,B}^Y \circ R_{A,B}^X? Очевидно - нет! Ведь если бы вращения были бы коммутативны, то области сферы P_A^{X,Y}и P_A^{Y,X}совпадали бы. Но в общем случае это не так. Точки, принадлежащие области P_A^{X,Y} \setminus P_A^{Y,X}могут быть получены как преобразование точки Aтолько в результате поворота вокруг оси X, а затем вокруг оси Y. Аналогично, в точки области P_A^{Y,X} \setminus P_A^{X,Y}точка Aможет превратиться только в результате поворота вокруг оси Y, а затем вокруг оси X. Таким образом, вращения не коммутативны в принципе! Поэтому даже для области P_A^{Y,X} \cap P_A^{X,Y}у нас нет основания полагать, что выражения R_{A,B}=R_{A,B}^X \circ R_{A,B}^Yи R_{A,B}=R_{A,B}^Y \circ R_{A,B}^Xравносильны, если речь идет о поворотах на одни и те же значения углов!

Несмотря на то, что мы можем описать любой поворот всего двумя углами, пользоваться этой концепцией не всегда удобно, так как приходится отслеживать еще порядок применения поворотов. Отложим эту идею, чтобы вернуться к ней, когда речь пойдет о кватернионах. А пока подумаем, как нам зафиксировать порядок вращений вокруг осей. Но рассмотрим уже все три оси.

Используя выведеденное ранее выражение, получим условия принадлежности произвольной точки Cобласти сферы P_A^{Y,Z} - условие того, что точка Cможет быть получена из точки Aв результате поворота вокруг оси Y, а затем вокруг оси Z. Из соображений равноправности осей и симметричности задачи, поменяем местами индексы xи z:

|c_z | \leq \sqrt {1 - a_y^2} или c_z^2 \leq 1 - a_y^2 или c_z^2 \leq a_x^2+a_z^2

Может ли произвольная точка сферы Cне принадлежать областям P_A^{X,Y}и P_A^{Y,Z}одновременно? Для этого необходимо, чтобы для нее одновременно выполнялись условияc_y^2 > a_y^2+a_z^2и c_z^2 > a_x^2+a_z^2. Сложим левые и правые части этих неравенств и получим, что должно выполняться следующее:

c_x^2 +c_z^2 > a_y^2+a_z^2+a_x^2+a_z^2>1+a_z^2>1, что противоречит условию нахождения точки на поверрхности сферы. То есть получается, что каждая точка сферы принадлежит либо областиP_A^{X,Y}, либо областиP_A^{Y,Z}, либо обеим областям одновременно. И что это означает?

А означает это следующее: точка Aможет переместиться в любую точку сферы Cв результате последовательности трех поворотов в фиксированном порядке: вокруг оси X, вокруг оси Yи вокруг оси Z. Если точка Cпринадлежит только одной из областей P_A^{X,Y}, P_A^{Y,Z} недостающий поворот можно предполагать формально существующим, но выполненным на нулевой угол.

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

1.4 Углы Крылова и углы Эйлера

Если для описания ориентации в пространстве плавательного или летательного аппарата ввести ортогональные оси, ориентированные вдоль направления движения, вертикальную, и ортогональную к продольной и вертикальной, то повороты вокруг этих осей будут однозначно описывать итоговую ориентацию объекта (только надо зафиксировать порядок поворотов). Углы этих поворотов называются углами Крылова, а вращения вокруг этих осей называются "лебедь", "щука" и "рак". Постите, не удержался! :)) Нет, эти повороты могут называться по разному, в зависимости от области применения. Например, в авиации они называются "крен (Roll)", "тангаж (Pitch)" и "рысканье (Yaw)" (рисунок 1.6).

Есть в таком подходе к описанию поворотов неочевидный нюанс. После выполнения каждого поворота, две оси системы координат смещаются. Таким образом каждый поворот, кроме первого осуществляется не вокруг первоначальных координатных осей, а вокруг осей, которые трансформируются вместе с изменением ориентации объекта в пространстве - отсюда и название системы Накой системы координат: связанная система координат.

Рисунок 1.6: связанная система координат самолета. Авторство: Kirill Borisenko. Этот файл является производной работой от: Yaw Axis Corrected.svg, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=77539856
Рисунок 1.6: связанная система координат самолета. Авторство: Kirill Borisenko. Этот файл является производной работой от: Yaw Axis Corrected.svg, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=77539856

Альтернативой углам Крылова является система углов Эйлера. В системе Эйлера произвольный поворот описывается как поворот вокруг оси Zна угол \alpha - прецессия, затем поворот вокруг оси узлов N (это ось, в которую превратилась ось Xпосле прецессии) на угол \beta - нутация и вновь вокруг оси Z' (в которую превратилась ось Zпосле прецессии и нутации) на угол \gamma- собственный поворот (рисунок 1.7 и 1.8).

Рисунок 1.7: углы Эйлера. Авторство: User:PAR. Собственная работа, CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=532343
Рисунок 1.7: углы Эйлера. Авторство: User:PAR. Собственная работа, CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=532343
Рисунок 1.8: повороты на углы Эйлера. Авторство: Euler2.gif: Juansemperederivative work: Xavax. Этот файл является производной работой от: Euler2.gif:, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=24338647
Рисунок 1.8: повороты на углы Эйлера. Авторство: Euler2.gif: Juansemperederivative work: Xavax. Этот файл является производной работой от: Euler2.gif:, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=24338647

1.5 Матрицы поворота

Хоть эта публикация и о кватернионах, я все же приведу матричные форма поворотом, чтобы потом можно было оценить всю лаконичность кватернионов по сравнению с матрицами.

Повороты вокруг отдельных осей X, Y, Zна углы \alpha, \beta, \gammaсоответственно задаются следующими матрицами:

R_{X,\alpha}=\left(\begin{array} {}1 &0&0\\0&\cos \alpha & -\sin \alpha\\0& \sin \alpha & \cos \alpha \end{array} \right),

R_{Y,\beta} = \left( \begin{array}{} \cos \beta & 0 & \sin \beta \\ 0 & 1 & 0 \\ -\sin \beta & 0 & \cos \beta \end{array} \right),

R_{Z,\gamma} = \left( \begin{array}{} \cos \gamma & -\sin \gamma & 0 \\ \sin \gamma & \cos \gamma & 0 \\ 0 & 0 & 1 \end{array} \right)

Результирующий поворот задается матрицей, состоящей их матриц соответствующих поворотов вокруг осей. Поворот, заданный углами Крылова, будет описываться матрицей R_{\alpha,\beta,\gamma}=R_{X,\alpha} R_{Z,\gamma} R_{Y,\beta}, а заданный углами Эйлера - R_{\alpha,\beta,\gamma}=R_{Z,\gamma}R_{X,\beta}R_{Z,\alpha} (обратите внимание, на два поворота вокруг оси Z). Обратите внимание, что у матрицы поворота вокруг оси Yпереставлены местами знаки при синусах. Это особенность оси Y, связанная с направлением поворота. Поворот в плоскости \left(X,Z\right) должен выполняться в направлении от Zк X, Но угол обычно отсчитываю от оси X:) В кватернионном варианте, как мы увидим, тоже ось Yнемного отличается.

Ну, и наконец запишем для полного драматизма матрицы поворота вокруг произвольной оси a=\left(a_x,a_y,a_x\right), a_x^2+a_y^2+a_z^2=1на угол \phiпротив часовой стрелки:

R_{a,\phi}=\left( \begin{array}{} \cos \phi+C \cdot a_x^2 & C \cdot a_x a_y-a_z \sin \phi & C \cdot a_xa_z+a_y \sin \phi \\ C \cdot a_ya_x+a_z \sin \phi & \cos \phi +C \cdot a_y^2 & C \cdot a_ya_z-a_x \sin \phi \\  C \cdot a_za_x - a_y \sin \phi & C \cdot a_za_y+a_x \sin \phi &\cos \phi +C \cdot a_z^2 \end{array} \right),

где C=\left(1-\cos \phi \right)

Главное, что мы смогла найти представление произвольного поворота. Но матричное представление оставляет вопросы:

  • во-первых, совсем не тривиальная задача найти ось и угол результирующего поворота по заданной матрице;

  • во-вторых, как построить интерполяцию между двумя поворотами, заданными в матричном виде? В матричном виде никак, надо искать ось и угол - смотри "во-ревых";

  • в-третьих, в статьях встречаются упоминания о том, что матрица обладают низкой численной устойчивостью, а значит плохо подходят для интегрирования поворотов. Например, задача состоит в том, чтобы найти результирующее преобразование серии поворотов. Если таких поворотов много, то в матрице начнут накапливаться ошибки и результирующий поворот может оказаться некорректным.

Но не смотря на эти вопросы, хочется сказать в оправдание матриц поворота, что удобный инструмент для аналитической работы с преобразованиями пространств. Матрицы поворота легко выделить из аффинного преобразования, например.

2. Кватернионы

2.1  Мнимые числа и двумерное вращение

Итак, с постановкой задачи ознакомились, вариант ее решения через матрицы рассмотрели, недостатки выявили, теперь идем в кватернионы. Но сначала рассмотрим более простой вариант: обычную мнимую единицу и ее вращательные возможности для 2D-задачи.

Мнимая единица появляется при попытке решить уравнение x^2+1=0. Можно доказать, что решений этого уравнения нет среди действительных чисел. Поэтому мы вводим новый математический объект, который называем мнимой единицей, обозначаем iи определяем так: i^2=-1. Заодно сразу введем понятия мнимого числа: m=biи комплексного числа: z=a+bi, где a,b-действительные числа.

Тут есть соблазн сразу вспомнить про свойства комплексных чисел, в частности про формулу Эйлера: e^{i\omega}= \cos \omega + i \cdot \sin \omega, многие авторы так и делают. Но это как раз то, с чем мы боремся :) Поэтому сначала докажем эту формулу, а потом уже поговорим про вращение.

Для начала вспомним, что представляет ряд Макларена (ряд Тейлора в окрестности 0) функций синуса, косинуса и экспоненты:

\sin \omega = \sin 0 + \omega \sin'0+\frac{\omega^2 \sin''0}{2!}+\frac{\omega^3 \sin'''0}{3!}+\frac{\omega^4 \sin''''0}{4!}+\ldots =\\ = \sin 0 + \omega \cos 0-\frac{\omega^2 \sin0}{2!}-\frac{\omega^3 \cos0}{3!}+\frac{\omega^4 \sin0}{4!}+\ldots = \\ =\omega-\frac{\omega^3}{3!}+\frac{\omega^5}{5!}-\frac{\omega^7}{7!}+\frac{\omega^9}{9!}-\ldots

\cos \omega = \cos 0 + \omega \cos'0+\frac{\omega^2 \cos''0}{2!}+\frac{\omega^3 \cos'''0}{3!}+\frac{\omega^4 \cos''''0}{4!}+\ldots =\\ = \cos 0 - \omega \sin0-\frac{\omega^2 \cos0}{2!}+\frac{\omega^3 \sin0}{3!}+\frac{\omega^4 \cos0}{4!}+\ldots = \\ =1-\frac{\omega^2}{2!}+\frac{\omega^4}{4!}-\frac{\omega^6}{6!}+\frac{\omega^8}{8!}-\ldots

e^x = e^0 + x  \left(e^x\right)'|_0 + \frac{x^2  \left(e^x\right)''|_0}{2!}+ \frac{x^3 \left(e^x\right)'''|_0}{3!}+ \frac{x^4 \left(e^x\right)''''|_0}{4!} + \ldots = \\ =  e^0 + x e^0 + \frac{x^2 e^0}{2!}+ \frac{x^3 e^0}{3!}+ \frac{x^4 e^0}{4!}+\ldots = \\ =  1+ x + \frac{x^2}{2!}+ \frac{x^3}{3!}+ \frac{x^4}{4!} + \ldots

Теперь подставим в формулу экспоненты вместо xi \omega , перегруппируем степени так, чтобы нечетные степени имели отдельный множитель i, в четных степенях учтем свойство i^2=-1. Затем вынесем за скобки iи увидим, как у нас соберутся ряды для синуса и косинуса:

e^{i\omega}=1+i\omega+\frac{\left(i\omega\right)^2}{2!}+\frac{\left(i\omega\right)^3}{3!}+\frac{\left(i\omega\right)^4}{4!}+\frac{\left(i\omega\right)^5}{5!}+\frac{\left(i\omega\right)^6}{6!}+\frac{\left(i\omega\right)^7}{7!}+\frac{\left(i\omega\right)^8}{8!}+\ldots =\\=1+i\omega+i^2\frac{\left(\omega\right)^2}{2!}+i^3\frac{\left(\omega\right)^3}{3!}+i^4\frac{\left(\omega\right)^4}{4!}+i^5\frac{\left(\omega\right)^5}{5!}+i^6\frac{\left(\omega\right)^6}{6!}+i^7\frac{\left(\omega\right)^7}{7!} +\ldots =\\=1+i\omega+i^2\frac{\left(\omega\right)^2}{2!}+ii^2\frac{\left(\omega\right)^3}{3!}+\left(i^2\right)^2\frac{\left(\omega\right)^4}{4!}+\\+i\left(i^2\right)^2\frac{\left(\omega\right)^5}{5!}+\left(i^2\right)^3\frac{\left(\omega\right)^6}{6!}+i\left(i^2\right)^3\frac{\left(\omega\right)^7}{7!}+\left(i^2\right)^4\frac{\left(\omega\right)^8}{8!}+\ldots=\\=1+i\omega+\left(-1\right)\frac{\left(\omega\right)^2}{2!}+i\left(-1\right)\frac{\left(\omega\right)^3}{3!}+\left(-1\right)^2\frac{\left(\omega\right)^4}{4!}+\\+i\left(-1\right)^2\frac{\left(\omega\right)^5}{5!}+\left(-1\right)^3\frac{\left(\omega\right)^6}{6!}+i\left(-1\right)^3\frac{\left(\omega\right)^7}{7!}+\left(-1\right)^4\frac{\left(\omega\right)^8}{8!}+\ldots=\\=1+i\omega-\frac{\left(\omega\right)^2}{2!}-i\frac{\left(\omega\right)^3}{3!}+\frac{\left(\omega\right)^4}{4!}+i\frac{\left(\omega\right)^5}{5!}-\frac{\left(\omega\right)^6}{6!}-i\frac{\left(\omega\right)^7}{7!}+\frac{\left(\omega\right)^8}{8!}+\ldots=\\=\left(1-\frac{\left(\omega\right)^2}{2!}+\frac{\left(\omega\right)^4}{4!}-\frac{\left(\omega\right)^6}{6!}+\frac{\left(\omega\right)^8}{8!}+\ldots\right)+\\+i\left(\omega-\frac{\left(\omega\right)^3}{3!}+\frac{\left(\omega\right)^5}{5!}-\frac{\left(\omega\right)^7}{7!}+\ldots\right)=\\=\cos\omega+i\sin\omega

Как видим, это никакая не магия, а обычная алгебра. Теперь вспомним еще некоторые определения, связанный с комплексными числами.

Так как iне принадлежит множеству действительных чисел, ни одно число вида  biне может быть линейно выражено через действительные числа. А это значит, что значения aи ibявляются линейно независимыми. Поэтому мы не можем комплексному числу z=a+biпоставить в соответствие точку на какой-то числовой оси, в отличие действительного числа. Но можем поставить в соответствие точку на плоскости, в которой заданы две ортогональные оси: ось действительных (x) и ось мнимых чисел (y). Но, если на плоскости задана декартова система координат, можно ввести и полярную систему. Тогда комплексное число будет описываться своим абсолютным значением |z| и углом отклонения от положительного направления действительной оси против часовой стрелки \phi- этот угол называется аргументом комплексного числа (рисунок 2.1).

Рисунок 2.1: представление комплексного числа на плоскости
Рисунок 2.1: представление комплексного числа на плоскости

По формулам, связывающим полярную и декартову системы координат, можем утверждать следующее: a=|z|\cos \phi, b=|z| \sin \phi. А значит z=|z| \cos \phi + |z| i \sin \phi = |z| \left(\cos \phi + i \sin \phi \right), что по формуле Эйлера дает нам выражение z=|z|e^{i\phi}.

А вот теперь можно и повращать! Если мы хотим повернуть точку на комплексной плоскости вокруг начала координат на угол \omega, то нам надо комплексное число, соответствующее вращаемой точке, умножить на e^{i\omega}: z'=ze^{i\omega}=|z|e^{i\phi}e^{i\omega}=|z|e^{i\left(\phi+\omega\right)}. Как видим, аргумент числа zизменился на значение \omega. Если \omega=0, то множитель e^{i\omega}=1.

Давайте пока запомним этот факт №2: чтобы применить поворот на угол \omega, мы его превращаем в множитель вида e^{i \omega}!

Ну и еще несколько соотношений, которые нам понадобятся в исследовании кватернионов. Если мы возьмем число z^*=|z|e^{-i\phi}, то есть число с такам же моделей, как у z, но с противоположным по знаку аргументом (повернутое на такой же угол, но в противоположном направлении), то такое число будет называться комплексно-сопряженным к z, оно будет отличаться знаком мнимой части: z^*=|z|\cos -\phi + |z|i \sin -\phi = |z|\cos \phi -|z| i \sin \phi = a -ib. Очевидно, что число zявляется комплексно-сопряженным к числу z^*, а сама операция комплексного сопряжения является самообратной. Произведение числа с его комплексно-сопряженныйм даст нам квадрат модуля: zz^*=|z|e^{i\phi}|z|e^{-i\phi}=|z|^2e^{i\left(\phi-\phi\right)}=|z|^2.

Тогда можно сконструировать обратное число кz: z^{-1}=\frac{z^*}{|z|^2} (полагаем |z|\ne0).

Произведения чисел zиz^{-1}в любом порядке даст нам 1:

zz^{-1}=z^{-1}z=\frac{zz^*}{|z|^2}=\frac{z^*z}{|z|^2}=\frac{|z|^2}{|z|^2}=1. Само число zявляется обратным к z^{-1}.

Если |z|=1, то z^{-1}=z^*. Это как раз выполняется для комплексных чисел вида e^{i\omega}. Преобразование, обратное повороту e^{i\omega} - поворот в противоположную сторону на тот же угол e^{-i\omega}.

Также заметим, что произведение комплексных чисел коммутативно: z_1z_2=z_2z_1. И еще одно вроде бы очевидное замечание: e^{i\frac{\omega}{2}}ze^{i\frac{\omega}{2}}=ze^{i\omega} - такая конструкция выполняет поворот комплексного числаzна угол \omega. А можно ли выполнить поворот комплексного числа zна угол \omega, используя множитель r=pe^{i\frac{\omega}{2}}( p\ne0), который в общем случает имеет отличную от 0 абсолютную величину? Можно! Для этого нужно сделать следующее:

z'=r\left(r^{-1}\right)^*z=pe^{i\frac{\omega}{2}}\left(\frac{pe^{-i\frac{\omega}{2}}}{|p|^2}\right)^z*=e^{i\frac{\omega}{2}}\left(e^{-i\frac{\omega}{2}}\right)^*z=e^{i\frac{\omega}{2}}e^{i\frac{\omega}{2}}z=e^{i\omega}z.

Или можно даже так, в силу коммутативности произведения комплексных чисел: z'=rz\left(r^{-1}\right)^*. Пока не понятно, зачем так сложно, но позже это нам пригодится. Это уже даже чем-то похоже на действия с кватернионами :)

2.2 Гиперкомплексные числа

Теперь попробуем обобщит эту концепцию описания поворотов на трехмерный случай. Из факта №1, который мы запомнили ранее, следует, что нам нужно сделать два независимых "вращателя". Значит одной мнимой единицей мы ника не обойдемся. Давайте предположим, что существует два "сорта" мнимых единиц iи j: i^2=j^2=-1, но i\neq j. Каждая из них по отдельности порождает обычную систему комплексных чисел. Но эти системы комплексных чисел ассоциируется с разными плоскостями и оси, соответствующиеiи j- ортогональны, то естьjне может быть линейно выражено через iи наоборот. И можно даже построить гиперкомплексное число, у которого будет две мнимые части! На рисунке 2.2 показаны комплексные числа из них разных системz_i=a+ib, z_j=c+jd и z_{i,j}=x+iy+jz.

Рисунок 2.2: гиперкомплексные числа с двумя мнимыми единицами
Рисунок 2.2: гиперкомплексные числа с двумя мнимыми единицами

Ура, теперь мы можем произвольный поворот описать через два угла поворота в виде e^{i\alpha}e^{j\beta}или e^{j\beta}e^{i\alpha}, останется только умножить эти "вращатели" на какое-то представление поворачиваемого вектора в гиперкомплексном виде!

На самом деле, так и есть! Это и есть описание произвольного поворота в комплексном виде. Но есть нюанс! Не может существовать пространства только с двумя комплексными единицами. Мы будем вынуждены ввести третью!

2.3 Три мнимых оси

Ну вот все же было хорошо, почти построили поворот. Зачем нам третья мнимая единица?

Проблема возникает при попытке расписать выведенное нами выражение поворота:

e^{i\alpha}e^{j\beta}=\left(\cos\alpha+i\sin\alpha\right)\left(\cos\beta+j\sin\beta\right)=\\=\cos \alpha \cos \beta + i\sin\alpha \cos\beta+j\sin\beta\cos\alpha+\mathbf{ij}\sin \alpha \sin \beta

Вот что за множитель ijпри последнем слагаемом? Может не надо вводить для него отдельную мнимую единицу? Может он как-то может выразиться линейным образом через 1, iи j? Нет! И мы это сейчас докажем.

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

Предположим, что ijможно выразить как: ij=ai+bj+c, где a,b,c- действительные числа. Домножим выражение слева на iи вспомним, что i^2=-1: iij=-j=-a+ijb+ci. Теперь подставим во второе слагаемое правой части ij=ai+bj+c: -j=-a+\left(ai+bj+c\right)b-ci=-a-ci+abi+b^2j+bc. Откуда получим:bc=a, ab=-cи b^2=-1. Если первыми двумя выражениями можно как-то жить, то утверждение b^2=-1противоречит изначальной посылке о том, что b- дейтвительное число. А значит мы пришли к противоречию иijнелья выразить как: ij=ai+bj+c, где a,b,c- действительные числа. Значит нам нужно вводить еще один объект, не являющийся действительным числом. Попробуем найти его среди мнимых единиц, предположим, что есть третий "сорт" мнимых единиц: k^2=-1. Ну собственно проверять законность такого предположения мы не будем, просто попробуем построить повороты в такой системе. И если все будет успешно, значит наше предположение о существовании k- оправдано :)

Поисследуем это явление. Найдем, чему равно ijk: ijk=\left(ij\right)k=kk=k^2=-1. Вот это и есть знаменитое открытие Гамильтона: i^2=j^2=k^2=ijk=-1. Отсюда следуют все превращения мнимых единиц друг в друга.

Домножим ijk=-1слева на i: iijk=-i~\rightarrow~-jk=-i=>jk=i

Теперь jk=iдомножим слева на j: jjk=ji~\rightarrow~ji=-k. Упс, как говорится! Оказывается наши мнимые единица не коммутативные по произведению, а антикоммутативны: ij=k, но ji=-k! В общем-то, для задачи описания поворотов - самое то. Предметная область то у нас тоже некоммутативная :)

И выражений ij=kи ji=-k, домножая их слева и справа на iи jнайдем остальные соотношения: kj=-i, jk=i, ik=-j, ki=j.

Это и есть та самая загадочная таблица умножения, которую тяжело принять на веру, не понимая откуда что произошло (рисунок 2.4).

Рисунок 2.4: таблица умножения единиц
Рисунок 2.4: таблица умножения единиц

Ну, и еще раз попробуем расписать произведение двух комплексных чисел z_i=a+ibи z_j=c+jd, построенных на основе разных единиц:

z_iz_j=\left(a+ib\right)\left(c+jd\right)=\left(ac\right)+i\left(bc\right)+j\left(ad\right)+k\left(bd\right)

Как видим, такое гиперкомплексное число состоит из 4-я линейно независимых слагаемых, отсюда и название "кватернион".

(*)

Для больших любителей теории групп и линейной алгебры можно привести другое доказательство существования kи его свойств. Это не относится к основной нити повествования, лирическое отступление со звездочкой, так сказать.

Обычную единицу и мнимую можно представить в матричном виде:

1=\left(\begin{array}{}1&0\\0&1\end{array}\right), i=\left(\begin{array}{}0&-1\\1&~~~0\end{array}\right).

Эти объекты удовлетворяют необходимыми нам свойствами: линейная независимость, коммутативность по сложению, коммутативность по произведению и

i^2=\left(\begin{array}{}-1&~~~0\\~~~0&-1\end{array}\right)=-1\left(\begin{array}{}1&0\\0&1\end{array}\right).

Как нам построить аналогичным образом матричное представление для набора 1,i,j? В варианте 2\times2 - никак! А в варианте 3\times3? Тоже никак! Только в варианте 4\times4, используя механизм блочных матриц можем сконструировать, например вот такое:

1=\left(\begin{array}{}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{array}\right),~~~i=\left(\begin{array}{}0&-1&~~~0&~~~0\\1&~~~0&~~~0&~~~0\\0&~~~0&~~~0&-1\\0&~~~0&~~~1&~~~0\end{array}\right),~~~j=\left(\begin{array}{}~~~0&~~~0&~~~1&~~~0\\~~~0&~~~0&~~~0&-1\\-1&~~~0&~~~0&~~~0\\~~~0&~~~1&~~~0&~~~0\end{array}\right)

Тут, как и в варианте 2\times2выполняются соотношения:

i^2=j^2=\left(\begin{array}{}-1&~~~0&~~~0&~~~0\\~~~0&-1&~~~0&~~~0\\~~~0&~~~0&-1&~~~0\\~~~0&~~~0&~~~0&-1\end{array}\right)=-1\left(\begin{array}{}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{array}\right)

Но, если мы захотим посчитать выражение k=ij, то получим вот такю конструкцию:

k=\left(\begin{array}{}~~~0&~~~0&~~~0&~~~1\\~~~0&~~~0~&~~~1&~~~0\\~~~0&-1&~~~0&~~~0\\-1&~~~0&~~~0&~~~0\end{array}\right), k^2=\left(\begin{array}{}-1&~~~0&~~~0&~~~0\\~~~0&-1&~~~0&~~~0\\~~~0&~~~0&-1&~~~0\\~~~0&~~~0&~~~0&-1\end{array}\right)=-1\left(\begin{array}{}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{array}\right)

Все взаимопревращения мнимых единиц в таком матричном представлении и антикоммутативность произведений тоже выполняются.

2.4 некоторые свойства кватернионов

Итак, мы ввели понятие кватерниона. Это конструкция в четыре мерном пространстве. Как нам его соотнести с нашим пространством трехмерным? Очевидно, из четырех осей пространства кватернионов надо выбрать три оси. Какие именно? Можно было бы взять одну действительную ось и две комплексные, но это не логично с точки зрения равнозначности осей. Поэтому соотнесем комплексные оси \left(i, j, k\right)с координатными осями 3D-пространства.

Таким образом, кватерниону можно поставить в соответствие вектор в трехмерном пространстве и одно скалярное число. Может показаться, что действительная ось тут избыточна, мы ведь собираемся заниматься геометрией в трехмерном пространстве. Но на самом деле эта ось нам понадобится.

Мнимые единицы в геометрической интерпретации кватерниона соответствуют единичным векторам, определяющим оси X, Yи Z- ортам \mathbf i, \mathbf j и \mathbf k. Векторные произведения ортов соответствуют произведениям мнимых единиц: \mathbf i \times \mathbf j = \mathbf k, \mathbf j \times \mathbf i = -\mathbf k, \mathbf i \times \mathbf k = -\mathbf j, \mathbf k \times \mathbf i= \mathbf j, \mathbf j \times \mathbf k = \mathbf i, \mathbf k \times \mathbf j = -\mathbf i. Что подтверждает правильность выбора трех мнимых осей кватерниона для описания осей 3D-пространства.

Это, на самом деле, и есть основной довод в пользу того, чтобы сопоставить трем осям пространства мнимые единицы. Слово мнимые не должно пугать. Ведь в математике мнимость не означает "ненастощесть", как в литературном варианте употребления этого слова. Мнимый в математике - это обладающий определенным набором свойств и не более того.

Таким образом получается, что кватернион можно интерпретировать как набор четырех чисел, три из которых умножаются на мнимые единицы \mathbf q=a+bi+cj+dk и как вектор и скаляр \mathbf q=\left(a,\vec v\right), где v=b\mathbf i + c\mathbf j+ d\mathbf k. В любой интерпретации у кватерниона выделяется действительная часть, а остальные слагаемые образуют мнимую или векторную часть.

Другие форма представления кватерниона связаны с возможностью выделить одну из комплексных единиц (любую) как общий множитель двух слагаемых: \mathbf q=a+bi +\left(c+di\right)j=z_1+z_2j, важно соблюдать порядок умножения комплексных единиц. Ну и еще одна форма представления, это та, с которой мы начинали: \mathbf  q=\left(a'+b'i\right)\left(c'+d'j\right)=z_{1,i}z_{2,j}. Эти формы задействую только две мнимые единицы.

В зависимости от задач удобно использовать разные формы представления кватернионов. Умножение на скаляр выполняется тривиально в любой форме представления: умножается каждая компонента. Для сложения и разности кватернионов удобны векторная и комплексная формы.

Для произведения кватернионов удобно использовать векторную форму. Пусть у нас есть кватернионы \mathbf q_1=\left(a_1,\vec v_1\right)и \mathbf  q_2=\left(a_2,\vec v_2\right), тогда \mathbf q_1\cdot \mathbf q_2=\left(a_1a_2-\left<\vec v_1,\vec v_2\right>,a_1 \vec v_2 + a_2 \vec v_1 +\vec v_1 \times \vec v_2\right), где \left<\vec v_1, \vec v_2 \right>- скалярное проиведение \vec v_1и \vec v_2. Это выражение можно получить из комплексной формы кватерниона, аккуратно раскрыв все произведения и выделив общие множители. Оставим это для самостоятельной работы :)

Как и в случае комплексных чисел, для кватерниона \mathbf q=a+bi+cj+dk=\left(a,\vec v\right)определена абсолютная величина |q|=\sqrt{a^2+b^2+c^2+d^2}и комплексно-сопряженный \mathbf q^*=a-bi-cj-dk=\left(a,-\vec v\right). Операция сопряжения само-обратна. Абсолютная величина комплексно-сопряженных кватернионов одинакова, а отличаются они знаком векторной части. Произведение комплексно-сопряженных кватернионов равно квадрату их модуля:

\left(a,\vec v\right)\left(a,-\vec v\right)=\left(a^2-\left<\vec v, -\vec v\right>,a\vec v-a\vec v-\vec v \times\vec v\right)=\\=a^2+\left<\vec v, \vec v \right>=a^2+b^2+c^2+d^2=|q|^2

Также можно определить обратный кватернион: \mathbf q^{-1}=\frac{\mathbf q^*}{|\mathbf q|^2}.

Несмотря на то, что произведение кватернионов не коммутативно, кватернион и обратный к нему можно умножать в любом порядке: \mathbf q\cdot \mathbf q^{-1}=\mathbf q^{-1} \cdot \mathbf q = 1. Если абсолютная величина кватерниона равна единице, обратный кватернион совпадает с комплексно-сопряженным: |\mathbf q|=1~\rightarrow~ \mathbf q^{-1}=\mathbf q^*.

Что к касается сопряжения и произведения, то можно вспомнить такое свойство: \left(\mathbf q_1 \cdot \mathbf q_2\right)^*=\mathbf q_2^*\cdot \mathbf q_1^*, это легко можно доказать, не будем тут расписывать.

Лучше подробно рассмотрим частный случай этого свойства, назовем его "переход через мнимую единицу". Пусть у нас есть неполный кватернион без одного из мнимых слагаемых например без j: \mathbf q_1=a +bi +dk. Также пусть у нас есть еще один неполный кватернион, состоящий только и одной компоненты, которая отсутствует в \mathbf q_1: \mathbf q_2=cj. Тогда мы можем менять их местами в произведении, выполняя сопряжение только q_1:

\mathbf q_1 \cdot \mathbf q_2=\left(a+bi+dk\right)\cdot cj = acj +bc\left(ij\right)+dc\left(kj\right)=\\=acj- dc\left(ji\right)-dc\left(jk\right)=cj \cdot \left(a-bi-dk\right)=\mathbf q_2 \cdot \mathbf q_1^*

\mathbf q_2 \cdot \mathbf q_1=cj \cdot \left(a+bi+dk\right) = acj +bc\left(ji\right)+dc\left(jk\right)=\\=acj- dc\left(ij\right)-dc\left(kj\right)=\left(a-bi-dk\right) \cdot cj=\mathbf q_1^* \cdot \mathbf q_2

Этот трюк нам понадобится для понимания поворотов.

Ну, а теперь давайте наконец-то вращать!

2.5 Вращаем вектор

Первое, что нам надо сделать, чтобы вектор \vec v=\left(v_x,v_y,v_z\right) мог как-то взаимодействовать с кватернионами поворота - это представить вектор в виде кватерниона \mathbf v. Ну, с векторной частью все довольно просто - она равна \vec v. Но что делать со скалярной частью, каткое там должно быть значение? Почти во всех источника утверждается, что вектор в кватернионной представлении должен обладать нулевой скалярной частью: \mathbf v = \left(0,\vec v\right). Но на самом деле, в скалярную часть можно записать любое значение, оно останется неизменным при повороте векторной части. Пока давайте будем предполагать общий случай \mathbf v = \left(a_v,\vec v\right), где a_v-  произвольное действительное число. Значение действительной части кватернионного представления преобразуемого вектора мы постигнем, когда будем говорить про бикватернионы (в следующей публикации). Итак, представляем вектор как кватернион: \mathbf v=a_v+v_x i+v_y j +v_z k.

Как мы выяснили ранее, любой поворот вектора можно реализовать через повороты вокруг осей. Рассмотрим поворот вокруг оси Xна угол \alpha. Что должно произойти с вращаемым кватернионом \mathbf v=a_v+v_x i+v_y j +v_z k? Его скалярная часть и проекция на ось Xдолжны сохраниться неизменными, а проекции на оси Yи Zдолжны поменяться, мы ведь выполняем поворот в плоскости \left(Y,Z\right). Разобьем \mathbf vна два слагаемых: \mathbf v=\left(a_v+v_x i \right)+\left(v_y j+v_z  k\right). Теперь вспомним, что k=ijи вынесем jза скобки во втором слагаемом: \mathbf v=\left(a_v+v_x i \right)+\left(v_y +v_z  i\right) j. Вращаем вокруг оси X, поэтому вращающий множитель построим с мнимой единицейi: e^{i\alpha}. согласно установленного раньше факта №2. Умножим на кватернион слева (можно попробовать и справа, столкнемся с аналогичными сложностями): \mathbf {v'}=e^{i\alpha} \cdot \mathbf v = e^{i\alpha}\left(a_v+v_x i \right)+e^{i\alpha}\left(v_y +v_z  i\right) j. Со вторы слагаемым все хорошо, комплексное число \left(v_y +v_z  i\right)действительно повернется на угол  \alphaпри умножении на e^{i\alpha}. Но вот с первым слагаемым проблемы. Наши скалярная часть и Xкомпонента тоже повернулись как комплексное число. Надо придумать. как действовать вращателем e^{i\alpha}только на второе слагаемое...

Решение такое: разобъем угол \alphaпополам и используем мнимую единицу jпри втором слагаемом для изменения сопряженности множителя справа, мы называли это переходом через мнимую единицу. То есть сделаем так: \mathbf {v'} =e^{i\frac{\alpha}{2}} \cdot \mathbf v \cdot e^{-i\frac{\alpha}{2}}. Тогда со скалярной частью и X-компонентой ничего не произойдет: e^{i\frac{\alpha}{2}} \cdot \left(a_v+v_xi\right) \cdot e^{-i\frac{\alpha}{2}}=e^{i\frac{\alpha}{2}} \cdot e^{-i\frac{\alpha}{2}} \cdot \left(a_v+v_xi\right) =\left(a_v+v_xi\right) . А с проекцией на плоскость \left(Y,Z\right)произойдет требуемый поворот поворот: e^{i\frac{\alpha}{2}} \cdot \left(a_y+v_zi\right)\cdot j \cdot e^{-i\frac{\alpha}{2}}=e^{i\frac{\alpha}{2}} \cdot \left(a_y+v_zi\right) \cdot e^{i\frac{\alpha}{2}}\cdot j=e^{i\alpha} \cdot \left(a_y+v_zi\right)\cdot j, что и требовалось.

Таким образом, чтобы выполнить поворот вокруг оси Xна угол \alphaмы вводим кватернион \mathbf {q_x}=e^{i\frac{\alpha}{2}}. И чтобы повернуть \mathbf v, мы выполняем операцию \mathbf{v'}=\mathbf{q_x} \cdot \mathbf v \cdot \mathbf {q_x^*} .

Аналогичной цепочкой рассуждений можно показать, что поворот на угол \beta вокруг оси Yвыполняется кватернионом \mathbf {q_y}=e^{j\frac{\beta}{2}}: \mathbf{v'}=\mathbf{q_y} \cdot \mathbf v \cdot \mathbf {q_y^*}. В этом случае вращаемый кватернион \mathbf vмы разбиваем на такие слагаемые: \mathbf v=\left(a_v+v_y j \right)+\left(v_x i+v_z  k\right)=\left(a_v+v_y j \right)+\left(v_x j+v_z \right)k=\left(a_v+v_y j \right)+i\left(v_x+v_z j\right), первое из которых должно остаться неизменным, а второе повернуться. Тут надо обратить внимание, что в случае оси Y, поворот осуществляется как бы в обратную сторону, что видно из необычного порядка слагаемых в  \left(v_x j+v_z \right)kили необычного положения мнимого множителя вi\left(v_x+v_z j\right). Это особенность оси Y, поворот вокруг нее выполняется от оси Z к оси X. Либо в обратном направлении, но на противоположный угол :)

Ну, и наконец, ось Z. Для поворота на угол \gammaвокруг оси Zмы вводим кватернион \mathbf {q_z}=e^{k\frac{\gamma}{2}}. Сам поворот выполняется аналогично: \mathbf{v'}=\mathbf{q_z} \cdot \mathbf v \cdot \mathbf {q_z^*}. Чтобы понять его механизм, разбиваем кватернион \mathbf vследующим образом: \mathbf v=\left(a_v+v_z k \right)+\left(v_x i+v_y  j\right)=\left(a_v+v_z k \right)+\left(v_x +v_z k\right)i, первое слагаемое остается неизменным, а второе поворачивается как комплексное число.

Ну, и как мы ранее выясняли, любой поворот можно описать двумя поворотами вокруг ортогональных осей. Поэтому кватернион любого поворота можно представить в виде \mathbf {q}=e^{i\frac{\alpha}{2}} \cdot e^{j\frac{\beta}{2}}либо в виде \mathbf {q}= e^{j\frac{\beta}{2}} \cdot e^{i\frac{\alpha}{2}}, для некоторых поворотов доступна только одна из этих форм. Как это работает? Возьмем для примера второй вариант и применим его к \mathbf v( только еще вспомним свойство сопряжения произведения кватернионов):

\mathbf v''=\mathbf{q\cdot v \cdot q^*}=e^{j\frac{\beta}{2}} \cdot e^{i\frac{\alpha}{2}} \cdot  \mathbf v\cdot \left(e^{j\frac{\beta}{2}} \cdot e^{i\frac{\alpha}{2}}\right)^*=e^{j\frac{\beta}{2}} \cdot e^{i\frac{\alpha}{2}} \cdot  \mathbf v\cdot \left(e^{i\frac{\alpha}{2}}\right)^* \cdot \left(e^{j\frac{\beta}{2}}\right)^*=\\=e^{j\frac{\beta}{2}} \cdot e^{i\frac{\alpha}{2}} \cdot  \mathbf v\cdot e^{-i\frac{\alpha}{2}} \cdot e^{-j\frac{\beta}{2}}=e^{j\frac{\beta}{2}} \cdot  \mathbf v' \cdot e^{-j\frac{\beta}{2}},~~~\mathbf{v'}=e^{i\frac{\alpha}{2}} \cdot  \mathbf v \cdot e^{-i\frac{\alpha}{2}}

Что, очевидно, является поворотом вокруг оси Y, того, что получилось после поворота вокруг оси X. Из этого примера вы видим, что цепочка последовательных поворотов может выражаться одним кватернионом, который строится как произведение кватернионов соответствующих поворотов. Для углов Крылова и углов Эйлера тоже можно поставить в соответствие кватернионы \mathbf {q}= e^{k\frac{\gamma}{2}} \cdot e^{j\frac{\beta}{2}} \cdot e^{i\frac{\alpha}{2}} и \mathbf {q}= e^{k\frac{\gamma}{2}} \cdot e^{i\frac{\beta}{2}} \cdot e^{k\frac{\alpha}{2}}соответственно.

Ну, и последний штрих. Для всех кватернионов, которые строятся из поворотов, заданных в виде экспонент, всегда будет выполняться условие |\mathbf q|=1. Но на самом деле поворот вектора можно выполнить и не единичным кватернионом, аналогично тому, как мы это делали для комплексных чисел. Только в этом случае права множитель будет не просто комплексно сопряженным, а обратным: пусть |\mathbf q|=1и \mathbf{q'}=p\mathbf q ( p\ne 0).

Тогда \mathbf{v'=q' \cdot v \cdot q'^{-1}}=\mathbf{v'}=p\mathbf q \cdot \mathbf v \cdot\frac{ p\mathbf q^*}{|p|^2}=\mathbf {q \cdot v \cdot q^*}. Это более общий случай, но если строить кватернионы только из экспонент и их произведений, то можно оставить только сопряжение.

2.6 Ось и угол вращения

Ну вот выполнили мы ряд поворотов, получили через произведения кватернионов этих поворотов кватернион итогового поворота. И согласно ранее остановленного факта №1, это все эквивалентно одному итоговому повороту. А как из кватерниона выделить итоговый поворот в виде оси, вокруг которой выполняется итоговый поворот, и значения угла?

Для ответа на этот вопрос давайте зайдем с другой стороны. Пусть задан поворот в виде оси \vec o=\left(o_x,o_y,o_z\right) единичной длины |\vec o|=1(\left<\vec o, \vec o \right>=1) и угла поворота вокруг этой оси по часовой стрелке \theta. Представим эту ось и угол в виде одного вектора, сонаправленного с осью вращения и с длиной, равной углу поворота: \vec r =\theta \vec o. Именно таким образом в физических задачах задается вращение.

Теперь еще раз вспомним установленный раннее факт №2, утверждающий, что поворот в комплексной плоскости на угол \omegaосуществляется множителем e^{i\omega}. Учитывая, что повороты в 3D описываются аналогичными комплексными категориями, кватернион поворота должен являться экспонентой некоторой величины. Очевидным кандидатом на аргумент экспоненты как раз и является \vec r - это ведь и есть количественное выражение поворота. Но, в отличие от \omega, его не нужно умножать на мнимую единицу и вот почему: экспонента мнимой величины 2\piпериодична, что соответствует природе вращения. Собственно, это и объясняет, почему в выражении e^{i\omega}при \omegaстоит множитель i. Что касается осей трехмерного пространства, мы их объявили мнимыми, а значит вращение вдоль любой оси \vec oавтоматически 2\piпериодично.

Значит нам надо построить кватернион поворота как экспоненту \vec r. Для этого мы превращаем \vec rв кватернион \mathbf r=\left(0,\vec r\right) и ищем кватернион поворота как \mathbf q=e^\frac{\mathbf r}{2}. Деление на 2 тут по той же причине, по которой мы делили пополам углы, кватернион будет применяться по схеме \mathbf {v'=q \cdot v \cdot q^*}.

Осталось только понять, как найти экспоненту от кватерниона... Так через ряд Макл jрена же! Для простоты, давайте найдем e^\mathbf r=e^{\left(0,\theta\vec o\right)}, а с делением пополам потом разберемся. Итак:

e^{\mathbf r}=1+\mathbf r+\frac{\mathbf r^2}{2!}+\frac{\mathbf r^3}{3!}+\frac{\mathbf r^4}{4!}+\frac{\mathbf r^5}{5!}+\ldots=\left(1,\vec0\right)+\mathbf r+\frac{\mathbf r^2}{2!}+\frac{\mathbf r^3}{3!}+\frac{\mathbf r^4}{4!}+\frac{\mathbf r^5}{5!}+\ldots

Единицу представили как кватернион с нулевой векторной частью и единичной скалярной. Для дальнейших рассуждений за метим две вещи.

Вещь первая.  Пусть вектора \vec xи \vec yколлинеарны ( \vec x \times \vec y=\vec 0) тогда кватрнионы без скаларных частей, но с оответствующими векторными частями будут умножаться следующим образом:

\left(0,\vec x\right) \cdot \left(0,\vec y\right) = \left(0-\left<\vec x, \vec y\right>, 0\vec x + 0 \vec y + \vec x \times \vec y\right)= \left(-\left<\vec x, \vec y\right>, \vec 0\right)

Вещь вторая.  Пусть у нас есть два кватерниона, один без скалярной части \left(0, \vec x\right), а второй без векторной \left(y, \vec 0\right). Тогда их произведение:

\left(0,\vec x\right)\cdot \left(y, \vec 0\right)=\left(0\cdot y - \left<\vec x, \vec 0 \right>, 0 \cdot \vec 0 + y \cdot \vec x + \vec x \times \vec 0 \right) = \left(0, y \cdot \vec x \right)

С учетом этих замечаний становится понятно, что в степенях \mathbf r будут чередоваться кватернионы без векторной части (для четных степеней) и без скалярной (для нечетных степеней):

\mathbf r^1 = \left(0, \theta \vec o\right),

\mathbf r^2=\left(0, \theta \vec o\right) \cdot \left(0, \theta \vec o\right) = \left(-\theta^2\left<\vec o, \vec o\right>, \vec 0\right)=\left(-\theta^2, \vec 0\right)

\mathbf r^3=\left(-\theta^2, \vec 0\right) \cdot \left(0, \theta \vec o\right) = \left(0, -\theta^3\vec o\right)

\mathbf r^4=\left(-\theta^2, \vec 0\right) \cdot \left(-\theta^2, \vec 0\right) = \left(\theta^4, \vec 0 \right)

\mathbf r^5=\mathbf r^2 \cdot \mathbf r^3=\left(-\theta^2, \vec 0\right) \cdot \left(0, -\theta^3 \vec o\right) = \left(0, \theta^5\vec o\right)

\mathbf r^6=\mathbf r^3 \cdot \mathbf r^3 = \left(0,-\theta^3 \vec 0\right) \cdot  \left(0,-\theta^3 \vec 0\right) = \left(\theta^6, \vec o\right)

И так далее, получаем чередование безвекторных и безскалярных неполных кватернионов, чередование знаков через две степени и растущую степень \theta. Теперь еще раз запишем разложение экспоненты в ряд, но с учетом формул для степеней:

e^{\mathbf r}=\left(1, \vec 0 \right) + \left(0, \theta \vec o\right)+\frac{\left(-\theta^2, \vec 0\right)}{2!}+\frac{\left(0, -\theta^3\vec o\right)}{3!}+\frac{\left(\theta^4, \vec 0 \right)}{4!}+\frac{ \left(0, \theta^5\vec o\right)}{5!}+\frac{\left(\theta^6, \vec o\right)}{6!}+\ldots

Теперь соберем э этого всего один кватернион, учитывая линейность его компонент, и вынесем \vec oза скобки в векторной части:

e^{\mathbf r}=\left(1-\frac{\theta^2}{2!}+\frac{\theta^4}{4!}-\frac{\theta^6}{6!}+\ldots, \theta \vec o -\frac{\theta^3 \vec o}{3!}+\frac{\theta^5 \vec o}{5!}-\frac{\theta^7 \vec o}{7!} + \ldots \right)=\\=\left(\left(1-\frac{\theta^2}{2!}+\frac{\theta^4}{4!}-\frac{\theta^6}{6!}+\ldots\right), \left(\theta -\frac{\theta^3}{3!}+\frac{\theta^5}{5!}-\frac{\theta^7}{7!} + \ldots \right) \vec o\right)

Как видим, а скалярной и векторной частях сформировались ряды Макларена косинуса и синуса \thetaсоответственно. И мы можем записать итоговое выражение: e^{\mathbf r}=\left(\cos \theta, \sin \theta \vec o \right). Это кватернион с единичным абсолютным значением. Произвольный кватернион можно записать по аналогии с экспоненциальной формой комплексного числа: \mathbf q = p\left(\cos \theta, \sin \theta \vec o\right) = pe^{\theta \vec o}( p \geq 0), в этом случае |\mathbf q| = p.

Теперь становится понятен смысл сопряженного кватерниона: \mathbf q=p\left(\cos \theta, -\sin \theta \vec o\right)=p\left(\cos -\theta, \sin -\theta \vec o\right) = pe^{-\theta \vec o}что, как и в случае комплексных чисел, соответствует повороту в противоположном направлении на соответствующий угол.

Заметим еще одно удобное свойство кватерниона: \mathbf q^a=\left(pe^{\theta \vec o}\right)^a=p^ae^{a\theta \vec o}=p^a\left(\cos a\theta, \sin a\theta \vec o\right). Для единичных кватернионов, которыми мы, собственно, и будем пользоваться: \mathbf q^a=\left(\cos a\theta, \sin a\theta \vec o\right).

На самом деле, для поворотов нам нужен кватернион с половинным углом: \mathbf q = e^{\left(0,\frac{\theta}{2} \vec o\right)}=\left(\cos \frac{\theta}{2}, \sin \frac{\theta}{2} \vec o \right).

Теперь давайте посмотрим, как такой кватернион поворачивает вектор.

Мы хотим повернуть при помощи кватерниона \mathbf qвектор \vec v(получим вектор \vec v'), который мы решили представлять кватернионом \mathbf v=\left(a_v, \vec v\right)с произвольной скалярной частью a_v. Разобьем вектор на два слагаемых: \vec v = \vec v_\parallel+\vec v_\perp, первое из которых коллинеарно \vec o: \vec v_\parallel \times \vec o =\vec 0, а второе - перпендикулярно: \left<\vec v_\perp, \vec o\right>=0. Соберем из них новые кватернионы, скалярную часть отнесем к параллельной части: \mathbf v = \mathbf {v_\parallel} +\mathbf{v_\perp}=\left(a_v, \vec v_\parallel\right)+\left(0,\vec v_\perp\right). Преобразуем их по отдельности: \mathbf {v'}=\mathbf{q \cdot v \cdot q^*}=\mathbf{q \cdot v_\parallel \cdot q^*}+\mathbf{q \cdot v_\perp \cdot q^*}=\mathbf{v'_\parallel}+\mathbf{v'_\perp}=\left(a_v,\vec v'_\parallel\right)+\left(0,\vec v'_\perp\right). Из геометрических соображений понятно, что измениться должна только перпендикулярная часть: \mathbf {v'_\perp}=\mathbf {v_\perp}, ее вращение произойдет в плоскости \left(\vec v_\perp,\vec o \times\vec v_\perp \right)на угол \theta(рисунок 2.5).

Рисунок 2.5: поворот вектора вокруг оси  на угол
Рисунок 2.5: поворот вектора \vec vвокруг оси \vec o на угол \theta

Давайте применим поворот к \mathbf{v_\parallel}:

\mathbf{v'_\parallel}=\mathbf{q \cdot v'_\parallel \cdot q^*}=\left(\cos \frac{\theta}{2},\sin \frac{\theta}{2}\vec o\right) \cdot \left(a_v, \vec v_\parallel\right) \cdot \left(\cos \frac{\theta}{2},-\sin \frac{\theta}{2} \vec o\right) =\\= \left(a_v \cos \frac{\theta}{2} -\left< \vec v_\parallel, \vec o \right> \sin \frac{\theta}{2},\cos \frac {\theta}{2} \vec v_\parallel+a_v \sin \frac{\theta}{2} \vec o\right) \cdot \left(\cos \frac{\theta}{2},-\sin \frac{\theta}{2} \vec o\right)=\\=\left(a_v \cos^2 \frac{\theta}{2} -\left< \vec v_\parallel, \vec o \right> \sin \frac{\theta}{2} \cos\frac{\theta}{2}+\sin \frac {\theta}{2}\cos \frac {\theta}{2} \left<\vec v_\parallel,\vec o \right>+a_v \sin^2 \frac{\theta}{2} \left<\vec o, \vec o\right>,\\\cos \frac {\theta}{2} \vec v_\parallel+a_v \sin \frac{\theta}{2} \cos^2 \frac{\theta}{2}\vec o-a_v \cos \frac{\theta}{2} \sin \frac{\theta}{2} \vec o +\left< \vec v_\parallel, \vec o \right> \sin^2 \frac{\theta}{2} \vec o \right)

Заметим, что \left<\vec v_\parallel, \vec o\right>\vec o = \vec v_\parallel, приведем подобные слагаемые и получим:

\mathbf {v'_\parallel}=\mathbf {q \cdot v'_\parallel \cdot q^*}=\left(a_v\left(\cos^2 \frac{\theta}{2}+\sin^2 \frac{\theta}{2}\right), \vec v_\parallel \left(\cos^2 \frac{\theta}{2}+\sin^2 \frac{\theta}{2}\right)\right)=\left(a_v, \vec v_\parallel \right)

Ура! Параллельная часть вектора и скаляр не изменились - есть шанс на то, что этот кватернион действительно описывает нужный нам поворот :) Посмотрим теперь на ортогональную часть вектора:

\mathbf{v'_\perp}=\mathbf{q \cdot v'_\perp \cdot q^*}=\left(\cos \frac{\theta}{2},\sin \frac{\theta}{2}\vec o\right) \cdot \left(0, \vec v_\perp\right) \cdot \left(\cos \frac{\theta}{2},-\sin \frac{\theta}{2} \vec o\right) =\\=\left(0, \cos \frac{\theta}{2}\vec v_\perp+\sin \frac{\theta}{2}\vec o \times \vec v_\perp\right)\cdot \left(\cos \frac{\theta}{2},-\sin \frac{\theta}{2} \vec o\right)=\\=\left(0,\cos^2 \frac{\theta}{2}\vec v_\perp+\sin \frac{\theta}{2}\cos \frac{\theta}{2} \vec o \times \vec v_\perp -\sin \frac{\theta}{2}\cos \frac{\theta}{2} \vec v_\perp \times \vec o -\sin^2 \frac{\theta}{2} \vec o \times \vec v_\perp \times \vec o\right)

Теперь вспомним, что \vec v_\perp \times \vec o=-\vec o \times \vec v_\perp, а также вспомним про тригонометрические формулы двойного угла и про раскрытие двойного векторного произведения по формуле Лагранжа ("бац минус цаб"):

\vec a \times \vec b \times \vec c =\vec b \left<\vec a, \vec c\right>-\vec c \left<\vec a, \vec b \right>,

что в нашем случае дает:

\vec o \times \vec v_\perp \times \vec o =\vec v_\perp \left<\vec o, \vec o\right>-\vec o \left<\vec o, \vec v_\perp \right>=\vec v_\perp

\mathbf{v'\perp}=\mathbf{q \cdot v'\perp \cdot q^*}=\left(0,\left(\cos^2 \frac{\theta}{2}-\sin^2 \frac{\theta}{2}\right)\vec v_\perp +2\sin \frac{\theta}{2}\cos \frac{\theta}{2} \vec o \times \vec v_\perp\right) =\\=\left(0, \cos \theta ~\vec v_\perp + \sin \theta~\vec o \times \vec v_\perp\right)

Что как раз и соответствует повороту \vec v_\perp в плоскости \left(\vec v_\perp,\vec o \times\vec v_\perp \right)на угол \theta!

Таким образом получается, что кватернион, осуществляющий поворот вокруг оси \vec oна угол \thetaмы находим как \mathbf q =e^{\left(0,\frac{\theta}{2} \vec o\right)}. Так же верно и обратное: \ln \mathbf q =\left(0,\frac{\theta}{2} \vec o\right).

Тут \mathbf q- это "половинный" кватернион.

Значения угла и компонент оси можно найти из компонент кватерниона \mathbf q =a+bi+cj+dk:

\vec o =\frac{\left(b, c, d\right)}{\sqrt{b^2+c^2+d^2}}, \theta=\arctan \frac{\frac{b}{o_x}}{a} (можно испольовать любую компоненту векторной части).

Если \mathbf q = \left(1, \vec 0\right) , то тогда ось может быть выбрана произвольно, а угол аоврота равен 0, то есть сам вектор поворота \vec r =\left(0,0,0\right). Ну и e^0=1, что мы и получили в кватернионном виде.

Но надо иметь ввиду, что если мы угол "перекрутили" за полный оборот, то кватернион нам покажет только остаток от полного оборота.

2.7 С точки зрения алгебры

Геометрический подход нагляден. Но мне больше нравится своей лаконичностью. Хотя, тут трудно провести четкую границу. Предлагаю просто рассмотреть еще один подход у описанию вращения.

Рассмотрим неполный кватернион без скалярной части \mathbf a = a_xi+a_yj+a_zk, причем a_x^2+a_y^2+a_z^2=1. Теперь найдем \mathbf{a \cdot a}=\left<\mathbf a, \mathbf a\right>=a_x^2i^2+a_y^2j^2+a_z^2k^2=-\left(a_x^2+a_y^2+a_z^2\right)=-1. Получается, что этот кватернион работает как мнимая единица. А так как мы рассмотрели произвольный вектор с единичной длиной, то можем сделать вывод, что любой произвольный единичный вектор на мнимых осях может рассматриваться как мнимая единица.

Рассмотрим два ортогональных единичных вектора \vec a = \left(a_x,a_y,a_z\right) и \vec b = \left(b_x,b_y,b_z\right), причем, будем полагать, что a_x^2+a_y^2+a_z^2=1и b_x^2+b_y^2+b_z^2=1. Тогда можем ввести третий вектор \vec c = \vec a \times \vec b. По свойствам векторного произведения можем записать: \vec b \times \vec a=-\vec c, \vec a \times \vec c=-\vec b, \vec c \times \vec a=\vec b, \vec b \times \vec c=\vec a, \vec c \times \vec b=-\vec a. Что соответствует взаимопревращениям мнимых единиц, а скалярные квадраты каждого из этих векторов в кватернионной представлении равны -1.

Значит мы можем ввести альтернативный базис \mathbf {i',j',k'}- который функционирует абсолютно аналогично обычным мнимым единицам.

Теперь, имея ось вращения \vec oи угол \thetaмы можем ввести базис мнимых единиц, одна из которых, например \mathbf i'соответствует \vec o. Тогда поворот будет представлять из себя кватернион \mathbf r=\theta \mathbf{i'}. Вращаемый вектор \vec v =\left(v_x,v_y,v_z\right) представим в том же базисе в виде кватерниона с произвольной скалярной частью: \mathbf v=a_v+v'_x\mathbf {i'}+v'_Y\mathbf {j'}+v'_Z\mathbf {k'}.

А вращение этого кватерниона будет осуществляться как поворот вокруг одной оси: \mathbf {v'}=e^{i'\frac{\theta}{2}} \cdot \mathbf v \cdot e^{-i'\frac{\theta}{2}}. А этот механизм нам уже знаком. Не так очевидно, как в геометрической интерпретации, за то лаконичнее :)

2.8 Интерполяция поворотов

Ну, и, собственно, основное преимущество кватернионов: способность превращать сферическую линейную интерполяцию поворотов в линейную интерполяцию векторов.

Прежде, чем говорить об интерполяции поворотов, давайте разберем постановку задачи сферической линейной интерполяции. Пусть у нас есть две точки, заданные в виде радиус-векторов\vec Bи\vec C, тогда отрезок между этими точками мы можем описать параметром t \in \left[0, 1\right]: lerp\left(\vec B,\vec C, t\right)=\left(1 - t\right)\vec B+t\vec C. При изменении параметра tот 0до 1, Мы будем получать точки отрезка BC, делящие отрезок на две части, пропорционально t. При t=0, результат интерполяции будет совпадать с B, а при t=1- c C(рисунок 2.6).

Но если предположить, что точки\vec Bи\vec Cлежат на поверхности сферы с центром в начале координат O. Если нам нужно при интерполяции получить плоскую дугу, составляющую участок окружности, которая получается при пересечении сферы с плоскостью вращения, заключенной между точками\vec Bи\vec C, то линейная интерполяция нам не подходит. Вместо линейной интерполяции нам нужно использовать линейную сферическую интерполяцию. Линейная сферическая интерполяцию описывает участок дуги параметром \tau \in \left[0,1\right], пропорционально которому будет разбиваться угол дуги между точками \vec Bи\vec C, в отличие от линейной интерполяции:

slerp\left(\vec B,\vec C, \tau\right)=\frac{\sin \left(1 - \tau\right)\omega}{\sin \omega}\vec B+\frac{\sin \tau \omega}{\sin \omega}\vec C, где \omegaугол между векторами \vec Bи \vec C.

При \tau=0, результат интерполяции будет совпадать с B, а при \tau=1- c C(рисунок 2.6) .

Рисунок 2.6: линейная интерполяция lerp и линейная сферическая интерполяция slerp
Рисунок 2.6: линейная интерполяция lerp и линейная сферическая интерполяция slerp

Теперь представим ситуацию, когда нам известны кватернионы поворота объекта\mathbf{q_1}и \mathbf{q_2} в два момента времени t_1и t_2. То есть, каждый вектор, который в начальный момент времени выглядел как \mathbf{v_0}, в момент времени t_1будет иметь значение \mathbf{v_1}=\mathbf{q_1 \cdot v_0 \cdot q_1^*}, а в момент времени t_2будет иметь значение \mathbf{v_2}=\mathbf{q_2 \cdot v_0 \cdot q_2^*} Для реализации плавного изменения ориентации объекта, нам необходимо построить модель интерполяции между \mathbf{q_1}и \mathbf{q_2}. Давайте рассмотрим такие сточки\vec A, \vec B_1и \vec B_2, чтобы первый поворот превращал \vec Aв \vec B_1, а второй превращал \vec Aв \vec B_2. Теперь задачу интерполяции поворотов, описываемых\mathbf{q_1}и \mathbf{q_2}можно свести к построению сферической линейной интерполяции между точками \vec B_1и \vec B_2- равномерно двигаться по углу дуги между этими точками.

Какой кватернион реализует преобразование из ориентации в момент времени t_1в ориентацию в момент времени t_2? Это кватернион, отменяющий \mathbf {q_1}и вводящий в действие \mathbf {q_2}: \mathbf{q_{12}}=\mathbf{q_2} \cdot \mathbf {q_1}^{-1}. У него, как и полагается любому кватерниону, есть соответствующая ось вращения и угол \theta, который нам и нужно поделить на на части пропорционально параметру интерполяции \tau \in \left[0,1\right]. То есть, нам нужно реализовать повороты на углы \tau \theta.

Но мы же помним, что множителю при значении угла соответствует показатель степени кватерниона: \mathbf q^a=\left(\cos a\theta, \sin a\theta \vec o\right). Соответственно, интерполяция поворотов между \mathbf{q_1}и \mathbf{q_2} сводится к следующему выражению: \mathbf {q_{12}}\left(\tau\right)=\left(\mathbf{q_2}\cdot \mathbf {q_1}^{-1}\right)^\tau\cdot \mathbf{q_1}. Очевидно, что при \tau=0и \tau=1итоговая конструкция будет совпадать с \mathbf{q_1}и \mathbf{q_2}соответственно.

Для расчёта степеней кватернионов достаточно найти соответствующие углы и оси и собрать новые кватернионы с аналогичной осью и модифицированным углом. Но это удобно, если повороты изначально заданы в виде кватернионов. Если же повороты изначально заданы осями \vec o_1, \vec o_2и углами \theta_1и \theta_2соответственно, то для интерполяции поворотов удобнее использовать другую формулу. Попробуем степени выразить через экспоненту и логарифмы:

\mathbf {q_{12}}\left(\tau\right)= \left(\mathbf{q_2}\cdot \mathbf {q_1^{-1}}\right)^\tau\cdot \mathbf{q_1}=e^{ln\left( \left(\mathbf{q_2}\cdot \mathbf {q_1}^{-1}\right)^\tau \cdot \mathbf{q_1}\right)}=e^{ln\left(\mathbf{q_1}\right)+\tau\left(ln\left( \mathbf {q_2}\right) - ln\left( \mathbf{q_1}\right) \right)}

Ну, а логарифм кватерниона, как мы помним, это вектор поворота. Соответственно, интерполяция сводится к следующему виду: \mathbf {q_{12}} \left(\tau\right)=e^{\theta_1\vec o_1+\tau\left(\theta_2\vec o_2-\theta_1 \vec o_1\right)}=e^{\theta_2\vec o_2 \cdot \tau+\theta_1 \vec o_1\left(1-\tau\right)}, что соответствует обычной линейной интерполяции вектора поворота.

Заключение

Я постарался изложить теорию последовательно и без "черных ящиков". Надеюсь, у тех, кто осилил дочитать досюда, осталось меньше пробелов в понимании кватернионов и их применения для вращений в трехмерном пространстве.

На самом деле, кватернионы это только один компонент более продвинутой системы - бикватернионов. Но для тех, кто понял кватернионы, у меня есть хорошая новость: переход от кватернионов к бикватернионам проще, чем переход от комплексных чисел к кватернионам. А возможности бикватернионов богаче. Они могут описывать не только повороты вокруг начала координат, но еще параллельный перенос и поворот вокруг произвольного центра - то есть, все виды движения в 3D.

Вот в следующей публикации и поговорим о бикватернионах :)

Комментарии (7)


  1. netricks
    03.10.2023 22:49

    Любой поворот в трехмерном пространстве может быть описан всего двумя параметрами - углами поворотов вокруг осей Xи Y!!!

    Но это же неверно 0_о.


    1. JamaGava Автор
      03.10.2023 22:49

      Докажите обратное


      1. netricks
        03.10.2023 22:49

        Если бы это было так, то уравнение

        q=(a+bi)(c+dj), где q произвольный единичный кватернион, всегда можно было бы решить относительно a,b,c,d. Но несложно показать, что это не выполняется.


      1. netricks
        03.10.2023 22:49

        для описания поворотов сферы нам достаточно всего двух осей!

        Вот это утверждение верно, но это не тоже самое


        1. JamaGava Автор
          03.10.2023 22:49

          Хорошо, давайте попробуем привести пример единичного кватерниона, который нельзя будет представить как q=(a+bi)(c+dj) или как q=(c+dj)(a+bi). Возможно такое? Мне кажется, что нет. Но вдруг...


          1. netricks
            03.10.2023 22:49

            Мне кажется, что поворот на пять градусов вокруг оси Z - это уже контрпример. Если же оно каким-то чудом выражается, завтра прикину условия разрешимости этих уравнений.


            1. netricks
              03.10.2023 22:49

              Впрочем, если он выражается, то утверждение верно. Но он не выражается