![](https://habrastorage.org/webt/wx/yq/yy/wxyqyyeuvo5us3kwciwntw5uigq.png)
От переводчика: ровно 175 лет и 3 дня назад были изобретены кватернионы. В честь этой круглой даты я решил подобрать материал, объясняющий эту концепцию понятным языком.
Концепция кватернионов была придумана ирландским математиком сэром Уильямом Роуэном Гамильтоном в понедельник 16 октября 1843 года в Дублине, Ирландия. Гамильтон со своей женой шёл в Ирландскую королевскую академию, и переходя через Королевский канал по мосту Брум Бридж, он сделал потрясающее открытие, которое сразу же нацарапал на камне моста.
![](https://habrastorage.org/getpro/habr/post_images/b34/87a/8a4/b3487a8a4aa6f5926a9232b84ba317b1.jpg)
Памятная табличка на мосту Брум Бридж через Королевский канал в честь открытия фундаментальной формулы умножения кватернионов.
В этой статье я постараюсь объяснить концепцию кватернионов простым для понимания образом. Я объясню, как можно визуализировать кватернион, а также расскажу о разных операциях, которые можно выполнять с кватернионами. Кроме того, я сравню использование матриц, углов Эйлера и кватернионов, а затем попытаюсь объяснить, когда стоит использовать кватернионы вместо углов Эйлера или матриц, а когда этого делать не нужно.
Содержание
- 1. Введение
- 2. Комплексные числа
- 2.1. Сложение и вычитание комплексных чисел
- 2.2. Умножение комплексного числа на скалярное значение
- 2.3. Произведение комплексных чисел
- 2.4. Квадрат комплексных чисел
- 2.5. Сопряжённые комплексные числа
- 2.6. Абсолютное значение комплексного числа
- 2.7. Частное двух комплексных чисел
- 3. Степени
- 4. Комплексная плоскость
- 4.1. Роторы
- 5. Кватернионы
- 5.1. Кватернионы как упорядоченная пара
- 5.2. Сложение и вычитание кватернионов
- 5.3. Произведение кватернионов
- 5.4. Вещественный кватернион
- 5.5. Умножение кватерниона на скалярную величину
- 5.6. Чистые кватернионы
- 5.7. Аддитивная форма кватерниона
- 5.8. Единичный кватернион
- 5.9. Бинарная форма кватерниона
- 5.10. Сопряжённые кватернионы
- 5.11. Норма кватерниона
- 5.12. Нормализация кватерниона
- 5.13. Обратный кватернион
- 5.14. Скалярное произведение кватернионов
- 6. Повороты
- 7. Интерполяция кватернионов
- 7.1. SLERP
- 7.1.1. Разность кватернионов
- 7.1.2. Возведение кватерниона в степень
- 7.1.3. Дробная разность кватернионов
- 7.1.4. Факторы, которые нужно учитывать
- 7.2. SQUAD
- 7.1. SLERP
- 8. Заключение
- 9. Загрузка демо
- 10. Справочные материалы
Невозможно полностью понять кватернионы за 45 минут.
В этой статье чрезвычайно много математики, так что она не для слабаков.
Введение
В компьютерной графике для описания позиции в пространстве (перемещения), а также ориентации в пространстве (поворота) используются матрицы. Также можно также использовать одну матрицу преобразований для описания масштаба объекта. Эту матрицу можно считать «пространством базиса». Если умножить вектор или точку (или даже другую матрицу) на матрицу преобразований, то мы «преобразуем» этот вектор, точку или матрицу в пространство, представленное этой матрицей.
В этой статье я не буду в подробностях рассказывать о матрицах преобразований. Подробно о матрицах преобразований можно прочитать в моей статье Matrices.
В данной статье я хочу рассказать об альтернативном способе описания ориентации объекта (поворота) в пространстве при помощи кватернионов.
Комплексные числа
Для того, чтобы полностью понять кватернионы, нам сначала нужно понять, откуда они взялись. Принцип кватернионов основан на концепции системы комплексных чисел.
Наряду с хорошо известными множествами чисел (натуральным, целым, вещественным и рациональным), система комплексных чисел добавляет новое множество чисел, называемых мнимыми числами. Мнимые числа были придуманы для решения определённых уравнений, не имевших решений, например:
Чтобы решить это выражение, нам нужно заявить, что
Математики не могли смириться с тем, что выражение не имеет решения, поэтому было изобретено новое понятие — мнимое число, которое можно использовать для решения таких уравнений.
Мнимое число имеет следующий вид:
Не пытайтесь понять это допущение, потому что логичных причин его существования нет. Нам просто нужно принять, что
Множество мнимых чисел можно обозначить как
Множество комплексных чисел (обозначаемое символом
Можно также заявить, что все вещественные числа являются комплексными с
Сложение и вычитание комплексных чисел
Комплексные числа можно складывать и вычитать сложением и вычитанием вещественной и мнимой частей.
Сложение:
Вычитание:
Умножение комплексного числа на скалярное значение
Комплексное число умножается на скаляр умножением каждого члена комплексного числа на скаляр:
Произведение комплексных чисел
Кроме того, комплексные числа можно также перемножать, используя обычные алгебраические правила.
Квадрат комплексных чисел
Также комплексное число можно возвести в квадрат, умножив на само себя:
Сопряжённые комплексные числа
Сопряжённой величиной комплексного числа является комплексное число с изменённым знаком мнимой части, обозначаемой как
Перемножение комплексного числа с его сопряжённой величиной даёт интересный результат.
Абсолютное значение комплексного числа
Мы можем использовать сопряжённое число комплексного числа, чтобы вычислить абсолютное значение (или норму, или величину) комплексного числа. Абсолютное значение комплексного числа — это квадратный корень из комплексного числа, умноженного на его сопряжённое число. Оно обозначается как
Частное двух комплексных чисел
Чтобы вычислить частное двух комплексных чисел, мы умножаем числитель и знаменатель на сопряжённое число знаменателя.
Степени ![$i$](https://habrastorage.org/getpro/habr/formulas/bf8/3b5/32c/bf83b532cd867d34004f8eded8c5c79a.svg)
Если мы утверждаем, что
Если мы продолжим записывать этот ряд, то заметим закономерность
Похожая закономерность возникает при увеличении отрицательных степеней.
Возможно, вы уже видели такую закономерность в математике, но в виде
![](https://habrastorage.org/getpro/habr/post_images/7ee/016/265/7ee016265905a34e6e27021c7a419105.png)
Декартова плоскость
Комплексная плоскость
Мы можем аналогичным образом нанести комплексные числа на двухмерную сетку, называемую комплексной плоскостью, привязав вещественную часть к горизонтальной оси, а мнимую — к вертикальной.
![](https://habrastorage.org/getpro/habr/post_images/e20/914/be6/e20914be6313213d1dd6bd05ca10c7c4.png)
Комплексная плоскость
Как видно из предыдущего ряда, мы можем сказать, что если умножим комплексное число на
Давайте проверим, верно ли это. Мы возьмём на комплексной плоскости произвольную точку
и умножим её на
Умножив
А умножив
А умножив
И мы получили ровно то, с чего начинали (
![](https://habrastorage.org/getpro/habr/post_images/89c/8a2/da0/89c8a2da0a5c3f901a65024022ed2523.png)
Комплексные числа на комплексной плоскости
Теперь мы можем выполнять поворот на комплексной плоскости и по часовой стрелке, умножая комплексное число на
Роторы
Также мы можем выполнять на комплексной плоскости произвольные повороты, задав комплексное число в следующем виде:
При умножении любого комплексного числа на ротор
Что также можно записать в матричном виде:
Что является способом поворота против часовой стрелки произвольной точки на комплексной плоскости относительно точки начала координат.
Кватернионы
Узнав о системе комплексных чисел и комплексной плоскости, мы можем вывести их в трёхмерное пространство, добавив к системе чисел наряду с
Кватернионы имеют следующий обобщённый вид
Где в соответствии со знаменитым выражением Гамильтона:
Можно заметить, что отношения между
Гамильтон также заметил, что мнимые числа
![](https://habrastorage.org/getpro/habr/post_images/e53/8a2/e2b/e538a2e2bdaaeaa1721bba02a0f35708.png)
Графическое представление свойств
На представленном выше изображении графически представлены взаимосвязи между декартовыми единичными векторами в виде
Кватернионы как упорядоченная пара
Также мы можем представить кватернионы в виде упорядоченной пары:
Где
С помощью этой записи мы можем проще представить общие черты кватернионов и комплексных чисел.
Сложение и вычитание кватернионов
Кватернионы можно складывать и вычитать аналогично комплексным числам:
Произведения кватернионов
Также мы можем выразить произведение двух кватернионов:
Что даёт нам ещё один кватернион. Если мы заменим в предыдущем выражении мнимые числа
А подставив обратно в исходное выражение с
Развернув это выражение в сумму упорядоченных пар, получим:
Если умножить на кватернионную единицу и извлечь общие векторые компоненты, то можно переписать это уравнение следующим образом:
Это уравнение даёт нам сумму двух упорядоченных пар. Первая упорядоченная пара — это вещественный кватернион, а вторая — чистый кватернион. Две этих упорядоченных пары можно соединить в одну упорядоченную пару:
Если подставить, то мы получим
Получаем:
Это и есть общее уравнение произведения кватернионов.
Вещественный кватернион
Вещественный кватернион — это кватернион, в который входит вектор
А произведением двух вещественных кватернионов является ещё один вещественный кватернион:
Что аналогично произведению двух комплексных чисел, содержащих нулевой мнимый член.
Умножение кватерниона на скалярную величину
Также мы можем умножать кватернион на скаляр, при этом придерживаясь следующего правила:
Мы можем убедиться в этом с помощью показанного выше произведения вещественных кватернионов, умножив кватернион на скаляр как вещественный кватернион:
Чистые кватернионы
Кроме вещественных кватернионов, Гамильтон также определил чистый кватернион как кватернион с нулевым скалярным членом:
Или если записать по компонентам:
И мы снова можем взять произведение двух чистых кватернионов:
в соответствии с представленным выше правилом произведения кватернионов.
Аддитивная форма кватерниона
Кроме того, мы можем выразить кватернионы как сумму вещественной и чистой частей кватерниона:
Единичный кватернион
Взяв произвольный вектор
Объединив это определение с определением чистого кватерниона, получим:
Также мы можем описать единичный кватернион, имеющий нулевой скаляр и единичный вектор:
Бинарная форма кватерниона
Теперь мы можем объединить определения единичного кватерниона и аддитивную форму кватерниона, получив форму кватернионов, схожую с записью, используемой при описании комплексных чисел:
Что даёт нам способ представить кватернион в форме, очень похожей на комплексные числа:
Сопряжённое число кватерниона
Сопряжённое число кватерниона можно вычислить, взяв противоположную по знаку векторную часть кватерниона:
Произведение кватерниона и его сопряжённого числа даёт нам следующее:
Норма кватерниона
Вспомним определение нормы комплексного числа:
Аналогично, норма (или величина) кватерниона определяется как:
Что позволяет нам выразить норму кватерниона следующим образом:
Нормализация кватерниона
Имея определение нормы кватерниона, мы можем использовать её для нормализации кватерниона. Кватернион нормализуется делением на
Например, давайте нормализуем кватернион:
Сначала нам нужно вычислить норму кватерниона:
Затем мы должны разделить кватернион на норму кватерниона, чтобы вычислить нормализованный кватернион:
Обратный кватернион
Обратный кватернион обозначается как
Чтобы показать это, мы можем воспользоваться определением обратной величины:
И умножить обе стороны на сопряжённое число кватерниона, что даст нам:
Подстановкой мы получаем:
Для единичных кватернионов-норм, норма которых равна 1, мы можем записать:
Скалярное произведение кватернионов
Аналогично скалярному произведению векторов мы можем вычислить скалярное произведение двух кватернионов, перемножив соответствующие скалярные части и просуммировав результаты:
Также мы можем использовать скалярное произведение кватернионов для вычисления угловой разности между кватернионами:
Для единичных кватернионов-норм мы можем упростить уравнение:
Повороты
Напомню, что мы определили особую форму комплексного числа под названием ротор, которую можно использовать для поворота точки на двухмерной плоскости следующим образом:
Благодаря схожести комплексных чисел с кватернионами должна существовать возможность выразить кватернион, который можно использовать для поворота точки в трёхмерном пространстве:
Давайте проверим, верна ли эта теория, вычислив произведение кватерниона
А
Тогда
Мы видим, что результатом является общий кватернион со скалярной и векторной частями.
Давайте сначала рассмотрим «особый» случай, при котором
В таком случае для поворота
Например, давайте повернём вектор
И давайте возьмём вектор
Теперь давайте найдём произведение
Что даёт нам чистый кватернион, повёрнутый на 45° относительно оси
В точности то, чего мы и ожидали!
Мы можем показать это графически следующим изображением:
![](https://habrastorage.org/getpro/habr/post_images/e9d/87b/2c9/e9d87b2c9784e8dfaa4c173efe8adb85.png)
Поворот кватерниона (1)
Теперь давайте рассмотрим кватернион, не ортогональный к
А умножив наш вектор
После подстановки
То есть это больше не чистый кватернион, он не повёрнут на 45° а норма вектора больше не равна 2 (она уменьшилась до
Этот результат можно показать графически.
![](https://habrastorage.org/getpro/habr/post_images/e1d/483/02f/e1d48302f030b7045af4fbbb908a8d23.png)
Поворот кватерниона (2)
Строго говоря, некорректно представлять кватернионв трёхмерном пространстве, потому что на самом деле это четырёхмерный вектор! Ради упрощения я покажу только векторный компонент кватернионов.
Однако не всё потеряно. Гамильтон выяснил (но не опубликовал этого), что если мы затем умножим результат
Для начала давайте вычислим
При
Объединив предыдущее значение
Что является чистым кватернионом, а норма результата равна:
что равно
На изображении ниже показан результат поворота.
![](https://habrastorage.org/getpro/habr/post_images/085/d25/966/085d25966ac77ecfbd94f309c62cab5b.png)
Поворот кватерниона (3)
Мы видим, что результат является чистым кватернионом, а норма исходного вектора сохранилась, но вектор повернулся на 90°, а не на 45°, что вдвое больше необходимого! Поэтому для корректного поворота вектора
Что является общим видом кватерниона поворота!
Интерполяция кватерниона
Одна из самых важных причин использования кватернионов в компьютерной графике заключается в том, что кватернионы очень хорошо описывают повороты в пространстве. Кватернионы избавляют от проблем, отягощающих другие способы поворота точек в 3D-пространстве, такие как складывание рамок, в котором проблема заключается в представлении поворота в углах Эйлера.
С помощью кватернионов мы можем определить несколько методов, представляющих интерполяцию поворота в 3D-пространстве. Первый рассматриваемый мной метод называется SLERP. Он используется для плавной интерполяции точки между двумя ориентациями. Второй метод является развитием SLERP и называется SQUAD. Он используется для интерполяции по ряду ориентаций, задающих путь.
SLERP
SLERP расшифровывается как Spherical Linear Interpolation (сферическая линейная интерполяция). SLERP предоставляет возможность плавной интерполяции точки между двумя ориентациями.
Я обозначу первую ориентацию как
Стандартная формула линейной интерполяции имеет вид:
Вот основные шаги для применения этого уравнения:
- Вычисляем разность между
и
.
- Берём дробную часть этой разности.
- Корректируем исходное значение на дробную разность между двумя точками.
Мы можем использовать тот же основной принцип, чтобы выполнить интерполяцию между двумя ориентациями кватернионов.
Разность кватернионов
Первый шаг означает, что нам нужно вычислить разность между
Возведение кватерниона в степень
На следующем шаге нужно взять дробную часть этой разности. Мы можем вычислить дробную часть кватерниона, возведя его в степень, значение которой находится в интервале
Общая формула возведения кватерниона в степень имеет следующий вид:
Где экпоненциальная функция для кватернионов выглядит так:
А логарифм кватерниона имеет вид:
При
А при
Дробная разность кватернионов
Чтобы вычислить интерполированный угловой поворот, мы изменяем исходную ориентацию
Что является общим видом сферической линейной интерполяции для кватернионов. Однако это не тот вид уравнения SLERP, который обычно используется на практике.
Мы можем применить похожую формулу для выполнения сферической интерполяции векторов в кватернионы. Общий вид сферической интерполяции для векторов задаётся так:
Графически это можно показать следующим изображением.
![](https://habrastorage.org/getpro/habr/post_images/f55/e29/d12/f55e29d12f9d13ed21b51b9e36502e4d.png)
Интерполяция кватернионов
Эту формулу можно без изменений применить к кватернионам:
И мы можем получить угол
Факторы, которые нужно учитывать
У этой реализации есть две проблемы, которые нужно учитывать при использовании.
Во-первых, если скалярное произведение кватернионов оказывается отрицательным значением, то интерполяция пойдёт по «долгому пути» на четырёхмерной сфере, а это не всегда желательно. Чтобы решить эту проблему, мы можем проверить результат скалярного произведения и если он отрицательный, то можно взять значение, противоположное одной из ориентаций. Инвертирование скалярной и векторной части кватерниона не меняет представляемую им ориентацию, но сделав это, мы гарантируем, что поворот будет происходить по «кратчайшему» пути.
Ещё одна проблема возникает, если угловая разность между
SQUAD
Так же, как SLERP можно использовать для интерполяции между двумя кватернионами, SQUAD (Spherical and Quadrangle — сферическая и четырёхугольная) можно использовать для плавной интерполяции по пути поворотов.
Если у нас есть ряд кватернионов:
И мы определили «вспомогательный» кватернион (
Ориентация вдоль части кривой определяется как:
при времени t это даёт нам:
Заключение
Несмотря на сложность для понимания, при работе с поворотами кватернионы обеспечивают несколько очевидных преимуществ по сравнению с матрицами и углами Эйлера.
- Интерполяция кватернионов с помощью SLERP и SQUAD предоставляет способ плавной интерполяции между ориентациями в пространстве.
- Конкатенация поворотов с помощью кватернионов выполняется быстрее, чем объединение поворотов, выраженных в матричном виде.
- Для единичных кватернионов-норм обратная величина поворота берётся вычитанием векторной части кватерниона. Вычисление обратной величины матрицы поворота значительно медленнее, если матрица не ортонормирована (если она ортонормирована, то это всего лишь транспонирование матрицы).
- Преобразование кватернионов в матрицы немного быстрее, чем для углов Эйлера.
- Для описания поворота кватернионам требуется всего 4 числа (3, если они нормализованы. Вещественную часть можно вычислять во время выполнения программы), в то время как матрицам необходимо не менее 9 значений.
Однако наряду со всеми преимуществами использования кватернионов существует также несколько недостатков.
- Кватернионы могут становиться недействительными из-за ошибки округления чисел с плавающей запятой; однако эту «вкравшуюся ошибку» можно устранить ренормализацией кватерниона.
- Вероятно, самое значительное препятствие для применения кватернионов — высокая сложность их понимания. Надеюсь, эту проблему вы решите, прочитав мою статью.
Есть множество математических библиотек, реализующих кватернионы, и только некоторые из них реализуют кватернионы правильно. По моему собственному опыту хорошей математической библиотекой с качественной реализацией кватернионов является GLM (OpenGL Math Library). Если вы хотите использовать кватернионы в собственных приложениях, то рекомендую эту библиотеку.
Загрузка демо
Я создал небольшое демо, демонстрирующее использование кватерниона для поворота объекта в пространстве. Демо было создано в Unity 3.5.2, можете скачать бесплатно скачать этот движок и просмотреть исходный код демо. В файле zip также содержится двоичный исполняемый файл Windows, но в Unity вы можете собрать приложение и для Mac.
Understanding Quaternions.zip
Справочные материалы
![]() Vince, J (2011). Quaternions for Computer Graphics. 1st. ed. London: Springer. | ![]() Dunn, F. and Parberry, I. (2002). 3D Math Primer for Graphics and Game Development. 1st. ed. Plano, Texas: Wordware Publishing, Inc. |