Как повернуть кватернион со вторым кватернионом по его локальной или мировой осям без использования transform.Rotate? - PullRequest
1 голос
/ 22 мая 2019

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

За кулисами происходит математика с rotation преобразования, Quaternion, с другим Quaternion. И точный характер этой математики меняется в зависимости от того, выбираете ли вы локальный или мировой флаг.

Как я могу сделать такую ​​математику, не назначая первую Quaternion для rotation Преобразования (тратить впустую память и / или время) только для того, чтобы немного поработать с ней?

Предположим, мой первый Quaternion - Quaternion q1 = Quaternion.Euler(0f,0f,90f);, а второй * Quaternion q2 = Quaternion.Euler(90f,0f,0f).

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

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

1 Ответ

4 голосов
/ 22 мая 2019

Используйте Quaternion operator *.

В Unity, когда вы умножаете два кватерниона, он применяет второй кватернион (выраженный в глобальных осях) к первому кватерниону вдоль локальных произведенных осейпосле первого Quaternion).

Итак, , если вы хотите сделать эквивалент Rotate(q2, Space.Self), где q1 - исходный rotation преобразования, а q3 - преобразовательновый rotation, вы хотите Quaternion q3 = q1 * q2.


Что делать, если вы хотите применить q2 к q1 вдоль осей до применения q1?Что ж, получается, что это эквивалентно применению q1 вдоль локальных осей q2.

В качестве примера, применение q2 вдоль глобальных осей q1 поворачивает его спину лицом вниз и его вершиной вправо.Учтите, что применение q1 вдоль локальных осей p2 также поворачивает его спину лицом вниз и верхнюю сторону вправо.Они дают одинаковую ориентацию!

Так что же это значит? Если вы хотите применить q2 к q1 вдоль осей до применения q1, выполните Quaternion q3 = q2 * q1.

Это эквивалентно выполнению Rotate(q2, Space.World) где q1 является исходным rotation преобразования, а q3 является новым rotation.


В отличие от Rotate, вы можете использовать этот оператор для поворота объектаотносительно осей своего родителя!Если вы сделаете transform.localRotation = q2 * transform.localRotation, вы будете вращать объект относительно оси родителя.

...