Я не знаю Maya, поэтому могу только догадываться, что ее вращение выглядит так: если вы вращаете влево-вправо, это кажется естественным.Затем, если вы поворачиваете объект вверх-вниз на 180 градусов, а затем снова поворачиваете влево-вправо, он все еще выглядит естественным.
Если вы знакомы с концепцией использования матрицы для выполнения преобразований (таких как вращение, масштабирование ипереводить), хорошо кватернион - это та же концепция, но он допускает только вращения, поэтому вы можете использовать его, чтобы ограничить ваши преобразования только вращениями.На практике вы можете использовать либо матрицу, либо кватернион, чтобы сделать то же самое.
Вам нужно запомнить текущее состояние кватерниона для объекта, затем, когда произойдет следующий кадр вращения, умножить новое вращение с старым кватернионом (в таком порядке), чтобы получить кватернион следующего кадра.Это гарантирует, что независимо от того, в какой ориентации находится объект, вращение следующего кадра будет применено с точки зрения зрителя.Это в отличие от некоторого наивного вращения, когда вы просто говорите: «пользователь прокручивает вверх / вниз, поэтому изменяйте вращение оси X объекта», что вызывает такое переворачивание.
Помните, что как и матрицы, кватернионы должны бытьумножив в обратный порядок на то, что действия фактически применяются, поэтому я сказал умножить новую операцию на существующий кватернион.
В завершение примера.Допустим, пользователь собирается выполнить 2 действия:
- В кадре 1 пользователь поворачивает объект на 180 градусов вокруг оси X (вращение вверх / вниз).
- В кадре2, пользователь поворачивает объект на 90 градусов вокруг оси Y (вращение влево / вправо).
Позволяет сказать, что объект имеет кватернион Q. В каждом кадре вы будете сбрасывать объект в его координаты по умолчаниюи примени кватернион Q, чтобы повернуть его.Теперь вы можете инициализировать его кватернионом тождества, но давайте просто скажем, что начальный кватернион называется Q0.
- В кадре 1 создайте новый кватернион R1, который представляет собой «поворот на 180 градусов вокруг оси X»."кватернион (вы можете найти некоторые математики для вычисления такого кватерниона).Предварительно умножьте новую операцию на существующий кватернион: Q1 = R1 * Q0.
- В кадре 2 создайте новый кватернион R2, который представляет собой кватернион «с поворотом на 90 градусов вокруг оси Y».Предварительно умножьте новую операцию на существующий кватернион: Q2 = R2 * Q1.
В кадре 1 вы будете использовать Q1 для отображения объекта, а в кадре 2 вы будете использовать Q2.Вы можете просто продолжать применять любые последующие действия пользователя к кватерниону, и он всегда будет вращаться в системе отсчета зрителя.