Я физик, немного изучал программирование и встречал много людей, использующих кватернионы для вращения вместо того, чтобы писать что-то в матричной / векторной форме.
В физике есть очень веские причины, по которым мы не используем кватернионы (несмотря на странные истории, которые иногда рассказывают о Гамильтоне / Гиббсе и т. Д.). Физика требует, чтобы наши описания обладали хорошим аналитическим поведением (это имеет точно определенное значение, но в некоторых довольно технических аспектах, которые выходят далеко за рамки того, что преподается в обычных вводных классах, поэтому я не буду вдаваться в подробности). Оказывается, кватернионы не обладают таким хорошим поведением, поэтому они бесполезны, в отличие от векторов / матриц, поэтому мы их используем.
Однако, ограничиваясь жесткими поворотами и описаниями, которые не используют никаких аналитических структур, трехмерные вращения могут быть эквивалентно описаны в любом случае (или несколькими другими способами).
Как правило, нам просто нужно отображение точки 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 в полярных координатах (якобиан теряет ранг)), что означает, что это только локальная проблема и может быть решена переключением координат, вращением вне вырождения, или используя две перекрывающиеся системы координат.
Я менее уверен в числовых проблемах, так как я не знаю подробно, как оба из них (и любые альтернативы) будут реализованы. Я читал, что перенормировать кватернион проще, чем сделать это для матрицы вращения, но это верно только для общей матрицы; вращение имеет дополнительные ограничения, которые упрощают это (которые встроены в определение кватернионов) (на самом деле, это должно быть правдой, поскольку они имеют одинаковое количество степеней свободы).
Так в чем же причина использования кватернионов вместо векторов или других альтернатив?
Ответы:
Блокировка кардана является одной из причин, хотя, как вы говорите, это проблема только с углами Эйлера и легко решаема. Углы Эйлера все еще используются, когда требуется память, так как вам нужно сохранить только 3 числа.
Для кватернионов по сравнению с матрицей вращения 3x3 кватернион имеет преимущество в размере (4 скаляра против 9) и скорости (умножение кватернионов намного быстрее, чем умножение матрицы 3x3).
Обратите внимание, что все эти представления поворотов используются на практике. Углы Эйлера занимают меньше всего памяти; матрицы используют больше памяти, но не страдают от блокировки кардана и обладают хорошими аналитическими свойствами; и кватернионы обеспечивают хороший баланс обоих, будучи легкими, но без блокировки кардана.
источник
Ну, я тоже физик. А бывают ситуации, когда кватернионы просто качаются! Например, сферические гармоники. У вас есть два атома, которые рассеиваются, обмениваясь электроном: что такое орбитальный перенос спина? Для кватернионов это просто умножение, т.е. суммирование показателей базовых функций SH, выраженных в кватернионах. (Хотя преобразование полиномов Лежандра в кватернионную нотацию немного утомительно).
Но я согласен, они не универсальный инструмент, и особенно в механике твердого тела они были бы очень громоздкими в использовании. Тем не менее, чтобы процитировать Бертрана Рассела, ответ на вопрос студента о том, сколько математики необходимо знать физику: "Как можно больше!"
В любом случае: почему мы любим кватернионы в компьютерной графике? Потому что у них есть ряд привлекательных свойств. Во-первых, их можно красиво интерполировать, что важно, если вы анимируете вращающиеся объекты, например, конечности вокруг сустава. С кватернионом это просто скалярное умножение и нормализация. Выражение этого с помощью матрицы требует вычисления sin и cos, а затем построения матрицы вращения. Тогда умножение вектора на кватернион все еще дешевле, так как полное умножение векторной матрицы, также все еще дешевле, если впоследствии добавить перевод. Если вы рассматриваете систему скелетной анимации для человеческого персонажа, в которой нужно оценивать множество перемещений / вращений для большого количества вершин, это имеет огромное влияние.
Еще один приятный побочный эффект использования кватернионов заключается в том, что любое преобразование по своей сути ортонормировано. При использовании матриц перевода необходимо повторно ортонормировать каждую пару шагов анимации из-за ошибок округления чисел.
источник
Многие 3D-приложения используют углы Эйлера для определения ориентации объекта. В частности, для авиасимуляторов они представляют собой теоретически полезный способ сохранения ориентации таким образом, чтобы его можно было легко изменить.
Вы также должны знать, что такие вещи, как «переключение координат, вращение вне вырождения или использование двух перекрывающихся систем координат» - все это требует усилий. Усилия - это код. А код означает производительность. Потеря производительности, когда в этом нет необходимости, не очень хорошо для многих 3D-приложений. В конце концов, что можно получить с помощью всех этих уловок, если просто использование кватернионов даст вам все, что вам нужно.
Числовые проблемы возникают при работе с несколькими последовательными поворотами ориентации. Представьте, что у вас есть объект в космосе. И каждый временной отрезок вы вносите в него небольшое изменение рыскания. После каждого изменения нужно повторно нормализовать ориентацию; В противном случае возникнут проблемы с точностью и все испортят.
Если вы используете матрицы, каждый раз, когда вы выполняете матричное умножение, вы должны повторно ортонормировать матрицу. Матрица , что вы orthonormalizing не пока матрица поворота, так что я бы не слишком уверен , что легко ортогонализации. Однако в этом я могу быть уверен:
Это будет не так быстро, как нормализация 4D векторов. Это то, что кватернионы используют для нормализации после последовательных вращений.
Нормализация кватернионов стоит недорого. Даже специализированная нормализация матрицы вращения будет не такой дешевой. Опять же, производительность имеет значение.
Есть еще одна проблема, с которой матрицы справиться нелегко: интерполяция между двумя разными ориентациями.
Имея дело с трехмерным персонажем, вы часто имеете ряд преобразований, определяющих расположение каждой кости в персонаже. Эта иерархия костей представляет персонажа в определенной позе.
В большинстве систем анимации для вычисления позы персонажа в определенное время выполняется интерполяция между преобразованиями. Это требует интерполяции соответствующих преобразований.
Интерполяция двух матриц ... нетривиально. По крайней мере, если вы хотите что-то, напоминающее матрицу вращения в конце. В конце концов, цель интерполяции состоит в том, чтобы произвести нечто промежуточное между двумя преобразованиями.
Для кватернионов все, что вам нужно, это четырехмерный лерп, за которым следует нормализация. Вот и все: возьмите два кватерниона и линейно интерполируйте компоненты. Нормализовать результат.
Если вам нужна более качественная интерполяция (а иногда и требуется ), вы можете выделить сферический лерп . Это улучшает поведение интерполяции для более разнородных ориентаций. Эта математика намного сложнее и требует больше операций с матрицами, чем с кватернионами.
источник
Мнение: Кватернионы хороши.
Матрица вращения: Незначительный недостаток : умножение матриц в ~ 2 раза медленнее, чем кватернионы. Незначительное преимущество : умножение матрицы на вектор примерно в 2 раза быстрее и больше. Огромный минус : Нормализация! Грам-Шмит асимметричен, что не дает точного ответа более высокого порядка при выполнении дифференциальных уравнений. Более сложные методы очень сложны и дороги.
Ось (угол = длина оси) Незначительное преимущество : Маленький. Умеренный недостаток : умножение и применение к вектору происходит медленно с триггером. Умеренный недостаток : сингулярность северного полюса длиной = 2 * пи, поскольку все направления осей ничего не делают. Больше кода (и отладки) для автоматического масштабирования, когда он приближается к 2pi.
источник
Мы абсолютно не просто хотим. Есть очень важная тонкость, которую многие люди упускают . Конструкция, о которой вы говорите (нарисуйте треугольники, используйте триггер и т. Д.), Будет правильно вращать один вектор в другой. Но есть бесконечно много вращений, которые сделают это. В частности, я могу пойти с вами после того, как вы сделаете поворот, а затем повернуть всю систему вокруг вектора X '. Это никак не изменит положение X '. Комбинация вашего и моего вращения эквивалентна другому одиночному вращению (поскольку вращения образуют группу ). В общем, вы должны иметь возможность представить любое такое вращение.
Оказывается, это можно сделать только с вектором. (Это представление осевого угла для вращений .) Но объединить повороты в представлении осевого угла сложно. Кватернионы упрощают это, наряду со многими другими вещами. По сути, кватернионы обладают всеми преимуществами других представлений и не имеют недостатков. (Хотя я допускаю, что могут быть определенные приложения, для которых другое представление может быть лучше.)
источник
И это веские причины.
Как вы уже, кажется, понимаете, кватернионы кодируют одно вращение вокруг произвольной оси в отличие от трех последовательных вращений в трехмерном пространстве Эйлера. Это делает кватернионы невосприимчивыми к блокировке кардана .
Кроме того, некоторые формы интерполяции становятся удобными и простыми в использовании, например SLERP .
Почему ваше решение лучше с точки зрения производительности?
Я мог бы продолжить, но кватернионы - лишь один из возможных инструментов. Если они вам не подходят, не используйте их.
источник
Стоит иметь в виду, что все свойства, относящиеся к вращению, на самом деле не являются свойствами кватернионов: это свойства параметризации Эйлера-Родригеса , которая представляет собой реальную структуру из 4 элементов, используемую для описания трехмерного вращения.
Их связь с кватернионами объясняется исключительно статьей Кэли «О некоторых результатах, связанных с кватернионами», в которой автор наблюдает за корреляцией между умножением кватернионов и комбинацией параметризаций Эйлера-Родригеса. Это позволило применить аспекты теории кватернионов к представлению вращений и особенно к интерполяции между ними.
Вы можете прочитать статью здесь: https://archive.org/details/collmathpapers01caylrich . Но в то время не было связи между кватернионами и ротацией, и Кэли был весьма удивлен, обнаружив, что есть:
Однако в кватернионах нет ничего особенного, что дает какую-либо пользу вращению. Кватернионы не избегают блокировки кардана; Параметризация Эйлера-Родригеса делает. Очень немногие компьютерные программы, выполняющие ротацию, вероятно, действительно реализуют типы Quaternion, которые представляют собой первоклассные сложные математические значения. К сожалению, непонимание роли кватернионов, похоже, где-то просочилось, в результате чего довольно много сбитых с толку студентов-графиков изучают детали сложной математики с множеством мнимых констант, а затем не понимают, почему это решает проблемы с вращением.
источник
Ответ, который кто-то может прочитать: утомительные проблемы со всеми представлениями. Кватернионы меньше матриц, но умножение кватернионов не является простым векторным скалярным произведением или чем-то подобным, и фактически требует больше времени на компьютере, чем скалярное произведение двух матриц 3x3. (Компьютеры очень хорошо умеют работать с обычными матрицами)
У матриц есть и другие неприятные особенности. Например, они не стабильные существа в долгосрочной перспективе. При моделировании вращения в 3D-пространстве, как правило, один накапливает вращения на верхней части друг друга в матрицу ориентации, то есть только один матрица поворота хранения ориентации опорного кадра. Этот процесс в течение миллионов добавлений приведет к отклонению O-матрицы от формы матрицы строгого вращения. Этого можно избежать, периодически изменяя конфигурацию матрицы, но есть условия, когда это нетривиально. А именно случай единичной матрицы без вращения.
Вы можете найти представление осевого угла (или представление кватерниона) вращения, а затем воспроизвести для этого матрицу. Большинство алгоритмов генерируют нулевой вектор, а затем в этом случае сталкиваются с нулевым делением. В таких случаях также, как правило, плохая идея избегать таких случаев с помощью решений типа «если 0, то ...», так как а) вилки работают медленно и б) вы все равно можете закончить машинный эпсилон, кроме необычность и приводят к ужасающим ошибкам.
источник