2009-08-04 1 views
2

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

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

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

Спасибо

ответ

4

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

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

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

Википедия имеет хорошее объяснение gimbal lock.

+0

Спасибо Justicle, это именно то, что я делаю. То, что я называю OUT vector, является вашим FORWARD. С этим (и применяя кросс-произведение для получения третьего вектора) я генерирую ортонормированную матрицу и умножаю ее на векторы, чтобы преобразовать их. Спасибо за подтверждение. Я был как-то уверен, что блокировка карданного вала не будет применяться в этом случае, но хотела убедиться, на всякий случай. –

+0

Не проблема, помните, что это не матрицы, которые вызывают блокировку карданного вала, а комбинацию углов Эйлера - см. Ссылку на wikipedia. – Justicle

1

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

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

Кроме того, here Я нашел учебник OpenGL о том, как их реализовать.