Будет ли это вызвать карданный замок? - PullRequest
2 голосов
/ 04 августа 2009

Я сделал очень простую трехмерную сцену с 5 точками в мировых координатах. Я хотел бы перемещаться по сцене, поэтому я определяю камеру с вектором UP и OUT. С этой информацией я генерирую матрицу вращения в каждом кадре, которую я буду применять к векторам, чтобы получить координаты камеры.

Вопрос: я читал о блокировке карданного подвеса, используя этот метод, но произойдет ли это в этом случае?

Обратите внимание, что я генерирую матрицу вращения в каждом кадре, и я не вращаюсь в совокупности. Так может ли случиться блокировка в этой ситуации? Если бы это было так, что бы вы предложили безопасно применить вращение (из векторов UP и OUT)?

Спасибо

Ответы [ 2 ]

4 голосов
/ 04 августа 2009

Если под OUT вы имеете в виду «вперед», и это всегда перпендикулярно вектору UP, то НЕТ, вы не встретите карданный замок.

Что вы делаете, это создаете матрицу ориентации из векторов ВВЕРХ и ВПЕРЕД и применяете ее для каждого кадра, что является довольно распространенным методом перемещения камеры в пространстве. Вы не применяете несколько поворотов, используя углы Эйлера, что может быть причиной блокировки карданного подвеса.

Обратите внимание, что для создания матрицы вам также потребуется создать «левый» (или правый) вектор из векторов UP и FORWARD. Хорошее введение в это - здесь - обратите внимание, что этот пример затем применяет повороты к матрице камеры, что является совершенно необязательным шагом.

В Википедии есть хорошее объяснение карданного замка .

1 голос
/ 04 августа 2009

Вы столкнетесь с проблемой блокировки карданного подвеса при использовании матричного подхода для генерации матриц вращения (для X, Y, Z), а затем умножения их для получения окончательной матрицы вращения. Если я понял, что вы это сделаете, вы используете вектор OUT для получения углов (альфа, бета, гамма), затем вы вычисляете матрицы, наконец - вы умножаете их, чтобы получить окончательную матрицу вращения - тогда да, вы столкнетесь с блокировкой карданного подвеса.

Один из способов избавиться от этой проблемы - использовать Quaternions для расчетов.

Кроме того, здесь Я нашел несколько руководств по OpenGL о том, как их реализовать.

...