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

StackOverflow https://stackoverflow.com/questions/832805

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

<Ол>
  • Выполнение любого вида процесса, который меняет ориентацию с углами Эйлера, почти невозможно. Углы Эйлера страдают от особенностей - углы мгновенно изменятся на 180 градусов, так как другие углы проходят через сингулярность; Углы Эйлера практически невозможно использовать для последовательных вращений. Кватернионы не страдают ни от одной из этих проблем
  • Существует 12 возможных последовательностей поворота угла Эйлера - XYZ, XYX, XZY и т. д. Не существует ни одного "простейшего" или "правильно" набор эйлеровых углов. Чтобы получить набор углов Эйлера, вы должны знать, какую последовательность вращения вы используете, и придерживаться ее.
  • Я предлагаю вам выполнять все операции хранения и вращения с кватернионами и преобразовывать кватернионы в углы Эйлера только тогда, когда требуется вывод. Когда вы сделаете это, вы должны определить, какую последовательность вращения Эйлера вы используете.
  • У меня есть алгоритмы для всех этих операций и многое другое: кватернионы в / из углов Эйлера любой последовательности вращения в / из матриц вращения (матрицы косинуса направления), кватернионная интерполяция положения, скорости и т. д. в конечных или промежуточных точках, динамика и кинематика твердого и гибкого тела с использованием кватернионов.

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

    Другие советы

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top