Как реализовать камеру FPS? - PullRequest
12 голосов
/ 27 августа 2009

Так что в настоящее время я работаю над программированием FPS-игр в OpenGL (JOGL, более конкретно) просто для удовольствия, и я хотел знать, каков будет рекомендуемый способ создания FPS-подобной камеры?

На данный момент у меня в основном есть вектор направления движения игрока, который будет добавлен к текущей позиции игрока при нажатии клавиши «w» или «вперед». Негатив этого вектора, конечно, используется для «s» или обратного ключа. Для «a», left и «d», right, я использую нормаль вектора направления. (Я знаю, что это позволило бы игроку летать, но сейчас это не проблема)

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

Это общий и / или хороший способ или есть более простой / лучший способ?

Ответы [ 4 ]

6 голосов
/ 28 августа 2009

Способ, которым I всегда видел это, - это использование двух углов, рыскания и тангажа. Две оси движения мыши соответствуют изменениям в этих углах.

Вы можете легко вычислить вектор forward с помощью преобразования координат сферической формы в прямоугольную. (шаг = широта = φ, рыскание = долгота = θ)

Вы можете использовать фиксированный up вектор (скажем, (0,0,1)), но это означает, что вы не можете смотреть прямо вверх или вниз. (Большинство игр решают эту проблему, позволяя смотреть не круче, чем 89,999 градусов.)

Вектор right является перекрестным произведением прямого и восходящего векторов. Он всегда будет параллелен заземляющей плоскости, поскольку вектор вверх всегда перпендикулярен заземляющей плоскости.

Влево / вправо, затем используйте вектор +/-right. Для вектора forward, параллельного плоскости земли, вы можете взять перекрестное произведение векторов right и up.

Что касается части GL, вы можете просто использовать gluLookAt(), используя происхождение игрока, начало координат плюс вектор forward и вектор up.

Да, пожалуйста, добавьте опцию "инвертировать мышь".

Edit: Здесь - альтернативное решение, которое избавляет от проблемы 89.9, заданное в другом вопросе, который включает в себя сначала построение вектора right (без информации о высоте звука), а затем forward и up.

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

Да, по сути, так я всегда видел.

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

Вы можете использовать Кватернионы для вращения камеры. Хотя я сам не пробовал, они полезны для избежания блокировки карданного подвеса .

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

Да, но в конце вы захотите добавить различные другие атрибуты к камере. Чтобы записать это n00b: держите его в чистоте, если вы хотите имитировать Quake или CS. В конце концов, может иметься бобинг, FoV, фильтрация движения, приостановка сети и многое другое.

Камеры на самом деле являются одной из самых сложных частей в хорошей игре. Вот почему разработчики обычно довольствуются серьезно скучным, исправленным тем же от 1-го / 3-го лица.

...