Способ, которым I всегда видел это, - это использование двух углов, рыскания и тангажа. Две оси движения мыши соответствуют изменениям в этих углах.
Вы можете легко вычислить вектор forward
с помощью преобразования координат сферической формы в прямоугольную. (шаг = широта = φ, рыскание = долгота = θ)
Вы можете использовать фиксированный up
вектор (скажем, (0,0,1)), но это означает, что вы не можете смотреть прямо вверх или вниз. (Большинство игр решают эту проблему, позволяя смотреть не круче, чем 89,999 градусов.)
Вектор right
является перекрестным произведением прямого и восходящего векторов. Он всегда будет параллелен заземляющей плоскости, поскольку вектор вверх всегда перпендикулярен заземляющей плоскости.
Влево / вправо, затем используйте вектор +/-right
. Для вектора forward
, параллельного плоскости земли, вы можете взять перекрестное произведение векторов right
и up
.
Что касается части GL, вы можете просто использовать gluLookAt()
, используя происхождение игрока, начало координат плюс вектор forward
и вектор up
.
Да, пожалуйста, добавьте опцию "инвертировать мышь".
Edit: Здесь - альтернативное решение, которое избавляет от проблемы 89.9, заданное в другом вопросе, который включает в себя сначала построение вектора right
(без информации о высоте звука), а затем forward
и up
.