Подтвердить что ты не робот

Как реализовать FPS-камеру?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Вы можете использовать Quaternions для вращения вашей камеры. Хотя я и не пробовал это самостоятельно, они полезны для того, чтобы избежать gimbal lock.