Почему кватернионы используются для вращения?

108

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

В физике есть очень веские причины, по которым мы не используем кватернионы (несмотря на странные истории, которые иногда рассказывают о Гамильтоне / Гиббсе и т. Д.). Физика требует, чтобы наши описания обладали хорошим аналитическим поведением (это имеет точно определенное значение, но в некоторых довольно технических аспектах, которые выходят далеко за рамки того, что преподается в обычных вводных классах, поэтому я не буду вдаваться в подробности). Оказывается, кватернионы не обладают таким хорошим поведением, поэтому они бесполезны, в отличие от векторов / матриц, поэтому мы их используем.

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

Как правило, нам просто нужно отображение точки X = (x, y, z) в новую точку X '= (x', y ', z') при условии, что X 2 = X ' 2 . И есть много вещей, которые это делают.

Наивный способ - просто нарисовать треугольники, которые он определяет, и использовать тригонометрию, или использовать изоморфизм между точкой (x, y, z) и вектором (x, y, z) и функцией f (X) = X 'и матрица MX = X ', либо использование кватернионов, либо проецирование компонентов старого вектора вдоль нового с использованием какого-либо другого метода (x, y, z) T. (a, b, c) (x', y ', z ') и т. д.

С математической точки зрения все эти описания эквивалентны в данном контексте (как теорема). Все они имеют одинаковое количество степеней свободы, одинаковое количество ограничений и т. Д.

Так почему же кватернионы кажутся более предпочтительными, чем векторы?

Обычные причины, которые я вижу, - это отсутствие блокировки кардана или числовые проблемы.

Аргумент без блокировки кардана кажется странным, поскольку это проблема только углов Эйлера. Это также только координатная проблема (точно так же, как сингулярность при r = 0 в полярных координатах (якобиан теряет ранг)), что означает, что это только локальная проблема и может быть решена переключением координат, вращением вне вырождения, или используя две перекрывающиеся системы координат.

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

Так в чем же причина использования кватернионов вместо векторов или других альтернатив?

JMP
источник
2
В любом случае, идея «без блокировки кардана» - это ложь. У вас есть та же проблема с блокировкой кардана, что и с углами Эйлера, если вы используете два ортогональных поворота с кватернионом. У вас нет проблем только с одним вращением, так как это 1 операция, а не 3.
Дэймон
2
@Damon Это не совсем так. См. Mathoverflow.net/a/95908/97344
Plasmacel

Ответы:

63

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

Для кватернионов по сравнению с матрицей вращения 3x3 кватернион имеет преимущество в размере (4 скаляра против 9) и скорости (умножение кватернионов намного быстрее, чем умножение матрицы 3x3).

Обратите внимание, что все эти представления поворотов используются на практике. Углы Эйлера занимают меньше всего памяти; матрицы используют больше памяти, но не страдают от блокировки кардана и обладают хорошими аналитическими свойствами; и кватернионы обеспечивают хороший баланс обоих, будучи легкими, но без блокировки кардана.

Питер Александр
источник
Но матрица вращения не имеет так много независимых компонентов - она ​​ограничена. Двумерный поворот задается тремя координатами в трех измерениях, независимо от представления. В общем, матрицы имеют больше компонентов, потому что они могут делать больше, чем вращение. Но в случае вращения дополнительные компоненты определяются в терминах других.
JMP
2
@JMP: Ты прав. Многие люди «сжимают» матрицу, так что вы храните столько информации, сколько необходимо, но со сжатой матрицей работать труднее, поэтому вы теряете производительность. Все дело в компромиссах в памяти и производительности.
Питер Александр
11
@JMP Стандартные процедуры умножения матриц требуют все 9 значений. Несмотря на то, что только 3 из них являются независимыми, для фактического выполнения математических расчетов все равно требуется память на 9 чисел (опять же, если вы действительно выполняете матричное умножение на компьютере).
David Z
1
«Умножение кватернионов намного быстрее, чем умножение матрицы 3x3» Правда? Для вращения кватернионов требуется 24 операции сложения / умножения (из-за двойных операций перекрестного произведения и дополнительных операций), для матрицы 3x3 требуется всего 15 операций сложения / умножения.
Марат Бухаров 06
Можно использовать только 2 вектора (6 поплавков) для полного представления трехмерной ориентации, 3-й вектор - это просто крест. Преимущество матриц в том, что они уже находятся в форме, готовой к использованию во многих приложениях. И Эйлер, и Кватс требуют упаковки (из матрицы) и распаковки (в матрицу), что требует дополнительной обработки. Эйлер и Кватс могут быть полезны для компактного длительного хранения.
user3015682
40

В физике есть очень веские причины, по которым мы не используем кватернионы (несмотря на странные истории, которые иногда рассказывают о Гамильтоне / Гиббсе и т. Д.). Физика требует, чтобы наши описания обладали хорошим аналитическим поведением (это имеет точно определенное значение, но в некоторых довольно технических аспектах, которые выходят далеко за рамки того, что преподается в обычных вводных классах, поэтому я не буду вдаваться в подробности). Оказывается, кватернионы не обладают таким хорошим поведением, поэтому они бесполезны, в отличие от векторов / матриц, поэтому мы их используем.

Ну, я тоже физик. А бывают ситуации, когда кватернионы просто качаются! Например, сферические гармоники. У вас есть два атома, которые рассеиваются, обмениваясь электроном: что такое орбитальный перенос спина? Для кватернионов это просто умножение, т.е. суммирование показателей базовых функций SH, выраженных в кватернионах. (Хотя преобразование полиномов Лежандра в кватернионную нотацию немного утомительно).

Но я согласен, они не универсальный инструмент, и особенно в механике твердого тела они были бы очень громоздкими в использовании. Тем не менее, чтобы процитировать Бертрана Рассела, ответ на вопрос студента о том, сколько математики необходимо знать физику: "Как можно больше!"

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

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

свидание
источник
1
У вас есть справочник по сферическим гармоникам / полиномам Лежандра с кватернионами? Я собираюсь подать статью по связанным темам и хотел бы увидеть (иметь возможность цитировать) другие работы по этому поводу.
Майк,
4
@Mike: Из головы, к сожалению, ничего не опубликовано. К сожалению, кватернионы до сих пор остаются непонятными для физиков. Я просто помню это, потому что мой наставник по квантовой механике 2 сделал это упражнение, и я был потрясен этим. По сути, мы использовали термин exp ((a · iω + b · jθ + c · kη + d) r), где само r было комплексной переменной. Если вы построите это график, вы получите трехмерное распределение (сначала нам пришлось разработать экспоненциальный ряд по отношению к переменной кватерниона). Это позволяет выполнять "преобразование Фурье", в результате чего можно преобразовать в известные термины SH.
datenwolf
32

Аргумент без блокировки кардана кажется странным, поскольку это проблема только углов Эйлера. Это также только координатная проблема (точно так же, как сингулярность при r = 0 в полярных координатах (якобиан теряет ранг)), что означает, что это только локальная проблема и может быть решена переключением координат, вращением вне вырождения, или используя две перекрывающиеся системы координат.

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

Вы также должны знать, что такие вещи, как «переключение координат, вращение вне вырождения или использование двух перекрывающихся систем координат» - все это требует усилий. Усилия - это код. А код означает производительность. Потеря производительности, когда в этом нет необходимости, не очень хорошо для многих 3D-приложений. В конце концов, что можно получить с помощью всех этих уловок, если просто использование кватернионов даст вам все, что вам нужно.

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

Числовые проблемы возникают при работе с несколькими последовательными поворотами ориентации. Представьте, что у вас есть объект в космосе. И каждый временной отрезок вы вносите в него небольшое изменение рыскания. После каждого изменения нужно повторно нормализовать ориентацию; В противном случае возникнут проблемы с точностью и все испортят.

Если вы используете матрицы, каждый раз, когда вы выполняете матричное умножение, вы должны повторно ортонормировать матрицу. Матрица , что вы orthonormalizing не пока матрица поворота, так что я бы не слишком уверен , что легко ортогонализации. Однако в этом я могу быть уверен:

Это будет не так быстро, как нормализация 4D векторов. Это то, что кватернионы используют для нормализации после последовательных вращений.

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

Есть еще одна проблема, с которой матрицы справиться нелегко: интерполяция между двумя разными ориентациями.

Имея дело с трехмерным персонажем, вы часто имеете ряд преобразований, определяющих расположение каждой кости в персонаже. Эта иерархия костей представляет персонажа в определенной позе.

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

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

Для кватернионов все, что вам нужно, это четырехмерный лерп, за которым следует нормализация. Вот и все: возьмите два кватерниона и линейно интерполируйте компоненты. Нормализовать результат.

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

Никол Болас
источник
8

Мнение: Кватернионы хороши.

Матрица вращения: Незначительный недостаток : умножение матриц в ~ 2 раза медленнее, чем кватернионы. Незначительное преимущество : умножение матрицы на вектор примерно в 2 раза быстрее и больше. Огромный минус : Нормализация! Грам-Шмит асимметричен, что не дает точного ответа более высокого порядка при выполнении дифференциальных уравнений. Более сложные методы очень сложны и дороги.

Ось (угол = длина оси) Незначительное преимущество : Маленький. Умеренный недостаток : умножение и применение к вектору происходит медленно с триггером. Умеренный недостаток : сингулярность северного полюса длиной = 2 * пи, поскольку все направления осей ничего не делают. Больше кода (и отладки) для автоматического масштабирования, когда он приближается к 2pi.

Кевин Костлан
источник
6

Как правило, нам просто нужно отображение точки X = (x, y, z) в новую точку X '= (x', y ', z') при условии, что X ^ 2 = X '^ 2. И есть много вещей, которые это делают.

Мы абсолютно не просто хотим. Есть очень важная тонкость, которую многие люди упускают . Конструкция, о которой вы говорите (нарисуйте треугольники, используйте триггер и т. Д.), Будет правильно вращать один вектор в другой. Но есть бесконечно много вращений, которые сделают это. В частности, я могу пойти с вами после того, как вы сделаете поворот, а затем повернуть всю систему вокруг вектора X '. Это никак не изменит положение X '. Комбинация вашего и моего вращения эквивалентна другому одиночному вращению (поскольку вращения образуют группу ). В общем, вы должны иметь возможность представить любое такое вращение.

Оказывается, это можно сделать только с вектором. (Это представление осевого угла для вращений .) Но объединить повороты в представлении осевого угла сложно. Кватернионы упрощают это, наряду со многими другими вещами. По сути, кватернионы обладают всеми преимуществами других представлений и не имеют недостатков. (Хотя я допускаю, что могут быть определенные приложения, для которых другое представление может быть лучше.)

Майк
источник
5

Обычные причины, которые я вижу, - это отсутствие блокировки подвеса или числовые проблемы.

И это веские причины.

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

Кроме того, некоторые формы интерполяции становятся удобными и простыми в использовании, например SLERP .

... или используя две перекрывающиеся системы координат.

Почему ваше решение лучше с точки зрения производительности?

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

Мудрец Джерард
источник
Тем не менее, матрицы вращения делают то же самое, а также имеют больше алгебраических свойств, которые можно аккуратно использовать. Вдобавок к этому манипуляции с матрицами - одна из вещей, в которой компьютеры особенно хороши.
paul23
4

Стоит иметь в виду, что все свойства, относящиеся к вращению, на самом деле не являются свойствами кватернионов: это свойства параметризации Эйлера-Родригеса , которая представляет собой реальную структуру из 4 элементов, используемую для описания трехмерного вращения.

Их связь с кватернионами объясняется исключительно статьей Кэли «О некоторых результатах, связанных с кватернионами», в которой автор наблюдает за корреляцией между умножением кватернионов и комбинацией параметризаций Эйлера-Родригеса. Это позволило применить аспекты теории кватернионов к представлению вращений и особенно к интерполяции между ними.

Вы можете прочитать статью здесь: https://archive.org/details/collmathpapers01caylrich . Но в то время не было связи между кватернионами и ротацией, и Кэли был весьма удивлен, обнаружив, что есть:

На самом деле формулы в точности те, которые приведены для такого преобразования М. Олинде Родригес Лиувилль, tv, "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (или Comb. Math. Journal, t. III, стр. 224 [6]). Было бы интересно объяснить априори появление здесь этих коэффициентов.

Однако в кватернионах нет ничего особенного, что дает какую-либо пользу вращению. Кватернионы не избегают блокировки кардана; Параметризация Эйлера-Родригеса делает. Очень немногие компьютерные программы, выполняющие ротацию, вероятно, действительно реализуют типы Quaternion, которые представляют собой первоклассные сложные математические значения. К сожалению, непонимание роли кватернионов, похоже, где-то просочилось, в результате чего довольно много сбитых с толку студентов-графиков изучают детали сложной математики с множеством мнимых констант, а затем не понимают, почему это решает проблемы с вращением.

Марк Грин
источник
2

Ответ, который кто-то может прочитать: утомительные проблемы со всеми представлениями. Кватернионы меньше матриц, но умножение кватернионов не является простым векторным скалярным произведением или чем-то подобным, и фактически требует больше времени на компьютере, чем скалярное произведение двух матриц 3x3. (Компьютеры очень хорошо умеют работать с обычными матрицами)

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

Вы можете найти представление осевого угла (или представление кватерниона) вращения, а затем воспроизвести для этого матрицу. Большинство алгоритмов генерируют нулевой вектор, а затем в этом случае сталкиваются с нулевым делением. В таких случаях также, как правило, плохая идея избегать таких случаев с помощью решений типа «если 0, то ...», так как а) вилки работают медленно и б) вы все равно можете закончить машинный эпсилон, кроме необычность и приводят к ужасающим ошибкам.

Элмор
источник