Кватернионы (четырехмерное расширение комплексных чисел) могут использоваться для представления поворота и масштабирования трехмерного вектора, а применение кватерниона к трехмерному вектору включает в себя два умножения кватернионов, что требует меньше операций, чем умножение на соответствующую матрицу преобразования. Однако вместо этого часто используются матрицы линейного и аффинного преобразования, особенно в шейдерном коде.
Когда уместно и предпочтительно (из-за скорости, стабильности и т. Д.) Использовать кватернион для представления масштабирования и вращения в трех измерениях вместо соответствующей матрицы преобразования?
transformations
es1024
источник
источник
Ответы:
Я хочу начать с неправильных представлений:
Современные графические процессоры (NVIDIA в течение долгого времени и AMD со времен Южных островов) не обеспечивают полноценную поддержку векторных / матричных операций на аппаратном уровне. Они являются векторными архитектурами в другом направлении: каждый компонент вектора (x, y, z) обычно имеет 32- или 64-значное значение и содержит значения для каждого элемента в дорожке. Таким образом, трехмерный точечный продукт обычно не является инструкцией, это умножение и два умножения-сложения.
Кроме того, подсчет примитивных операций, таких как умножение-сложение, преобразование вектора в кватернион обходится дороже, чем преобразование вектора в матрицу. Преобразование вектора в матрицу 3x3 - это 3 умножения и 6 умножений, а преобразование вектора в кватернион - это два умножения кватернионов, каждое из которых состоит из 4 умножений и 12 умножений. (Вы можете стать менее наивным, чем это - вот рецензия на более быстрый способ - но это все же не так дешево, как умножение вектора на матрицу.)
Однако производительность не всегда определяется простым подсчетом количества выполняемых операций ALU. Для кватернионов требуется меньше места, чем для эквивалентной матрицы (при условии, что вы выполняете только чистое вращение / масштабирование), а это означает меньше места для хранения и меньше памяти. Это часто важно в анимации (что также удобно, когда появляются хорошие свойства интерполяции кватернионов).
Кроме этого:
источник
DP3
инструкция ARBfp реализована в виде 3 умножений и 2 сложений, см.INTEL_DEBUG=fs
Вывод драйвера Intel Linux: paste.ubuntu.com/23150494 . Не уверен, что это просто плохой драйвер или HW действительно не имеет специальных векторных инструкций.(Множество информации здесь я беззастенчиво позаимствовал из ответов чокнутого и чокнутого, с некоторыми собственными заметками.)
Матрица Преимущества
Quaternion Преимущества
Если вы знаете, что будете выполнять только единообразные преобразования твердого тела, пара вектор / кват обычно представляет собой солидный выигрыш на матрице 3x4 с точки зрения пространства хранения (вектор / quat: 7 или 8 поплавков против mat3x4: 12 поплавков) и скорость обработки. Если кватернионы все еще остаются мистическим вуду, попробуйте эту серию о них .
источник
Матрицы предлагают больше возможных преобразований, чем кватернионов, есть возможность искажать, зеркально отражать и неравномерно масштабировать матрицу. Ничто не говорит о том, что вы не можете заставить свой движок выполнять только преобразования на основе кватернионов, если вам не нужны дополнительные функции преобразования.
Матрицы просто очень удобны, когда вам нужно построить пространства, в которых вы знаете базисные векторы. Например, когда делаю проекции на орфографию. Также легко выполнить перспективное преобразование в матричном пространстве. Матрицы превосходны, когда дело доходит до проектирования.
В некотором смысле матрицы обычно используются, потому что они представляют наиболее распространенное наименование и не слишком сложны для освоения и понимания. Преимущества стандартизации значительно перевешивают преимущества, которые вы получаете от настраиваемого рабочего процесса. Хорошо известно, как выполнять матричные операции. Принимая во внимание, что кваты не являются чем-то самым непосредственным введением в универе. Просто спросите, сколько из них знает, как инвертировать кватернион, тогда как вы не найдете много студентов в высшем образовании, которые не знают, как инвертировать матрицу.
Обратите внимание, что графические карты также имеют выделенные каналы для матричных операций.
источник
Кватернион может представлять только равномерное масштабирование и вращение, поэтому, если вам нужно что-то еще, вам нужно добавить что-то, чтобы представить это.
Перевод может быть выполнен с помощью одного дополнительного vec3 (или с использованием двойных кватернионов ). Однако неравномерное масштабирование и сдвиг лучше представлены mat4. Проекционные преобразования (по существу, неравномерное масштабирование и обмен z и w) не могут быть представлены кватернионом.
Кватернионы имеют большое преимущество при интерполяции. Slerp легче всего рассчитать с помощью кватернионов.
Применение кватерниона (или двойного кватерниона) не встроено в графический процессор, поэтому вам необходимо реализовать это с помощью векторных операций. Большинство библиотек кватернионов предполагают, что вы не будете использовать кватернион для представления масштаба, поэтому на это стоит обратить внимание.
источник