Углы Эйлера и кватернионы - проблемы, вызванные напряженностью между внутренним хранением и представлением пользователю? - PullRequest
11 голосов
/ 07 мая 2009

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

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

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

Надежные интерполяции наиболее удобно выполнять с использованием кватернионного представления - так значит ли это, что мы должны постоянно преобразовывать представление Эйлера в представление кватерниона? Это возможно с точки зрения производительности?

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

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

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

Кто-нибудь видел, использовал или хотя бы нашел какое-нибудь умное решение этой проблемы? Конечно, три варианта выше не только один? Существуют ли какие-либо другие проблемные области, подобные этому, которые были решены ?

Ответы [ 6 ]

18 голосов
/ 07 июня 2009

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

  1. Выполнение любого вида процесса, который меняет ориентацию с углами Эйлера, почти невозможно. Углы Эйлера страдают от сингулярностей - углы мгновенно изменяются на 180 градусов, когда другие углы проходят через сингулярность; Углы Эйлера практически невозможно использовать для последовательных вращений. Кватернионы не страдают ни от одной из этих проблем
  2. Существует 12 различных возможных последовательностей поворота углов Эйлера - XYZ, XYX, XZY и т. Д. Не существует одного "самого простого" или "правильного" набора углов Эйлера. Чтобы получить набор углов Эйлера, вы должны знать, какую последовательность вращения вы используете, и придерживаться ее.
  3. Я предлагаю вам выполнить все операции хранения и вращения с кватернионами и преобразовывать кватернионы в углы Эйлера только тогда, когда требуется вывод. Когда вы делаете это, вы должны определить, какую последовательность вращения Эйлера вы используете.

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

Пожалуйста, свяжитесь со мной, если я могу помочь в nhughes1ster@gmail.com

0 голосов
/ 07 мая 2009

Сколько конверсий мы говорим? Похоже, вы платите примерно за две трансцендентные операции за конверсию, что на современном оборудовании доступно порядка 100 миллионов в секунду. Я бы сохранил и кватернионы для точности и эстетики, и ротации Эйлера для сохранения пользовательской информации. Может быть, добавить флаг, чтобы указать, который является предпочтительным для любого данного объекта. Кроме того, вам нужно выполнить преобразование только один раз для каждого повернутого члена. После того, как вы вычислили матрицу преобразования, она умножается на добавление, пока у вас не закончатся вершины.

0 голосов
/ 07 мая 2009

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

0 голосов
/ 07 мая 2009

Вы можете представить вращение как ось + угол поворота, который по сути совпадает с кватернионом (до знака)

0 голосов
/ 07 мая 2009

Почему бы не использовать Quarternions в коде и преобразовать Q в углы, когда это необходимо для отображения?

0 голосов
/ 07 мая 2009

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

...