Как получить майя, как вращения? - PullRequest
4 голосов
/ 06 декабря 2010

Я пытаюсь добиться того же эффекта вращения, что и Maya в моем проекте. У меня есть некоторые знания о кватернионах и примере трекбола.

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

По сути, я все еще сталкиваюсь с той же проблемой, что и раньше, с трехмерным трекболом. После переворачивания объекта вверх ногами, а затем попытки поворота вправо, объект повернется влево. Ну, на самом деле это моя камера, вращающаяся вокруг точки фокусировки в противоположном направлении.

Проблема в том, что я использую экранные координаты и трекбол, чтобы получить старые / новые векторы и получить угол поворота от этих двух векторов. Я всегда получу неправильную ось вращения таким образом.

Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

Я не знаю 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.Вы можете просто продолжать применять любые последующие действия пользователя к кватерниону, и он всегда будет вращаться в системе отсчета зрителя.

1 голос
/ 06 декабря 2010

Я думаю, у вас есть проблемы с изменением системы координат.

Предположим, вы хотите повернуть объект по оси X, затем по оси Y, а затем переместить его и масштабировать. Таким образом, вы должны умножить вашу матрицу преобразования (в начале она равна матрице разности) на матрицу вращения (сначала на X, затем на Y), затем на матрицу перевода и в конце на матрицу масштабирования. Таким образом, когда ваша текущая матрица умножается на полученную матрицу, ваши системы координат изменяются.

Чтобы избежать этой проблемы, вы можете использовать 2 метода:

1) для накопления матрицы повторных результатов как произведения всех предыдущих матриц.

2) использовать стек, где вверху будет матрица, равная произведению всех матриц внизу этой матрицы (в стеке).

P.S. Я не уверен, что это поможет вам. Я никогда не использовал кватернионы в своих проектах.

...