Когда кватернионы должны использоваться для представления вращения и масштабирования в 3D?

13

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

Когда уместно и предпочтительно (из-за скорости, стабильности и т. Д.) Использовать кватернион для представления масштабирования и вращения в трех измерениях вместо соответствующей матрицы преобразования?

es1024
источник

Ответы:

8

Я хочу начать с неправильных представлений:

Современные графические процессоры (NVIDIA в течение долгого времени и AMD со времен Южных островов) не обеспечивают полноценную поддержку векторных / матричных операций на аппаратном уровне. Они являются векторными архитектурами в другом направлении: каждый компонент вектора (x, y, z) обычно имеет 32- или 64-значное значение и содержит значения для каждого элемента в дорожке. Таким образом, трехмерный точечный продукт обычно не является инструкцией, это умножение и два умножения-сложения.

Кроме того, подсчет примитивных операций, таких как умножение-сложение, преобразование вектора в кватернион обходится дороже, чем преобразование вектора в матрицу. Преобразование вектора в матрицу 3x3 - это 3 умножения и 6 умножений, а преобразование вектора в кватернион - это два умножения кватернионов, каждое из которых состоит из 4 умножений и 12 умножений. (Вы можете стать менее наивным, чем это - вот рецензия на более быстрый способ - но это все же не так дешево, как умножение вектора на матрицу.)

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

Кроме этого:

  • Матрицы занимают больше места, потому что они поддерживают больше операций. Матрица 3х3 может содержать неоднородную шкалу, перекос, отражение и ортогональную проекцию.
  • Матрицы можно естественно представить как базисные векторы и легко построить из этих векторов.
  • Умножение одного кватерниона на другой (составление двух поворотов) - это меньше операций, чем умножение одной матрицы на другую.
Джон Калсбек
источник
Забавно, но на графическом процессоре Intel Haswell DP3инструкция ARBfp реализована в виде 3 умножений и 2 сложений, см. INTEL_DEBUG=fsВывод драйвера Intel Linux: paste.ubuntu.com/23150494 . Не уверен, что это просто плохой драйвер или HW действительно не имеет специальных векторных инструкций.
Руслан
@Ruslan Весьма вероятно, что на оборудовании просто нет специальных векторных инструкций. Точнее, хотя, они делают , но они векторизируются по ширине SIMD архитектуры (дорожки), а не векторируются по измерению vec3 / vec4.
Джон Калсбек
4

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

Матрица Преимущества

  • Неравномерное масштабирование и вращение, перекос, проекция
  • Перевод (если не используется двойной кватернион)
  • Встроенная поддержка оборудования
  • Кватернионы часто требуют трансцендентных функций для построения
  • Легче понять

Quaternion Преимущества

  • Преобразование вектора требует меньше операций (или нет - см. Ответ Джона)
  • Преобразование другим кватом требует намного меньше операций
  • Кватернионы занимают 4 числа с плавающей запятой (8, если это двойственное число), но матрицы занимают 9-16 числа с плавающей запятой.

Если вы знаете, что будете выполнять только единообразные преобразования твердого тела, пара вектор / кват обычно представляет собой солидный выигрыш на матрице 3x4 с точки зрения пространства хранения (вектор / quat: 7 или 8 поплавков против mat3x4: 12 поплавков) и скорость обработки. Если кватернионы все еще остаются мистическим вуду, попробуйте эту серию о них .

Хорхе Родригес
источник
3

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

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

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

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

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

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

Перевод может быть выполнен с помощью одного дополнительного vec3 (или с использованием двойных кватернионов ). Однако неравномерное масштабирование и сдвиг лучше представлены mat4. Проекционные преобразования (по существу, неравномерное масштабирование и обмен z и w) не могут быть представлены кватернионом.

Кватернионы имеют большое преимущество при интерполяции. Slerp легче всего рассчитать с помощью кватернионов.

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

чокнутый урод
источник