2009-08-27 3 views
12

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

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

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

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

ответ

6

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

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

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

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

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

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

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

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

4

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

+0

Хорошо, спасибо. Просто хотел удостовериться, что я ничего не пропустил. Хорошего дня! –

1

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

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

1

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

+1

Неподвижный замок не может произойти в FPS; на самом деле связывание углов Эйлера с движениями мыши является массовым упрощением без какого-либо риска. –

+0

На самом деле, хорошо, я должен прочитать на своем 3D. – crunchdog

+0

Jonas прав, существует только риск блокировки карданного вала при объединении не менее 3 оборотов. Статья, которую вы цитируете, просто неверна. У вас может быть какой-то карданный замок с матрицами и кватернионами, если и только если вы используете эйлеровы преобразования. Есть только два способа исправить это, некоторые нелинейные методы обработки особенностей на полюсах или неэйлеровы преобразования, которые легче выразить с помощью ... кватернионов :) – gouessej

Смежные вопросы