2009-08-27 3 views
12

저는 현재 재미만을 위해 OpenGL (JOGL,보다 구체적으로)에서 몇 가지 FPS 게임 프로그래밍을하고 있으며, FPS와 같은 카메라를 만드는 데 권장되는 방법이 무엇인지 알고 싶습니까?FPS 카메라는 어떻게 구현하나요?

나는 기본적으로 플레이어가 향하고있는 방향에 대한 벡터를 가지고 있습니다. "w"또는 앞으로 키를 누르면 현재 플레이어 위치에 추가됩니다. 그 벡터의 음수는 물론 "s"또는 역방향 키에 사용됩니다. "a", 왼쪽 및 "d"의 경우 오른쪽 방향 벡터의 법선을 사용합니다. (나는이 선수가 비행 할 것이라는 점을 알고,하지만 그 순간에 문제가되지 않습니다), 방향 벡터는 삼각 함수와 행렬을 사용하여 회전합니다 마우스를 이동하면

. 모든 벡터는 물론 속도 제어가 쉽도록 정규화되어 있습니다.

이것이 일반적인 방법인가요 아니면 좋은 방법인가요? 아니면 더 쉬운 방법이 있습니까?

답변

6

은 항상 두 개의 각도, 요와 피치를 사용하고 다 본 나는 방법 . 마우스 움직임의 두 축은이 각도의 변화에 ​​해당합니다.

구형 - 직사각형 좌표 변환을 사용하여 forward 벡터를 쉽게 계산할 수 있습니다.

고정 된 up 벡터 (예 : (0,0,1))를 사용할 수 있지만 위 또는 아래를 직접 볼 수는 없습니다. (대부분의 게임은 89.999도보다 가파르지 않게함으로써 이것을 해결합니다.)

right 벡터는 앞으로 및 위쪽 벡터의 외적입니다. 위쪽 벡터는 항상 지면에 수직이기 때문에 항상지면과 평행합니다.

왼쪽/오른쪽 기류 키는 +/-right 벡터를 사용합니다. 접지 플레인에 평행 한 forward 벡터의 경우, rightup 벡터의 교차 곱을 취할 수 있습니다.

GL 파트의 경우 플레이어의 원점 인 원점과 forward 벡터와 up 벡터를 사용하여 간단히 gluLookAt()을 사용할 수 있습니다.

오, 제발, "마우스 반전"옵션을 추가하십시오.

편집 : Here의 다음 forwardup을 (아무 피치 정보) 먼저 right 벡터를 구축하고 포함 또 다른 질문에 묻는 89.9 문제를 제거한다 대체 솔루션.

4

네, 본질적으로 내가 본 것을 항상 보았습니다.

+0

감사합니다. 내가 무엇이든 놓치지 않았는지 확인하고 싶었어. 좋은 하루 되세요! –

1

그래, 결국에는 카메라에 다양한 다른 속성을 추가하려고합니다. 그것이 n00b 철자를 : 당신이 퀘이크 또는 CS를 모방하고 싶다면 그것을 깔끔하게 유지하십시오. 결국에는 보잉, FoV, 모션 필터링, 네트워크 지연 서스펜션 등이있을 수 있습니다.

카메라는 실제로 좋은 경기에서 더 어려운 부분 중 하나입니다. 이것이 개발자들이 보통 둔감하고 고정 된 1st/3rd person ditto에 만족하는 이유입니다.

1

Quaternions을 카메라 회전에 사용할 수 있습니다. 비록 내가 직접 시도하지는 않았지만 그들은 gimbal lock을 피하는 데 유용합니다.

+1

짐벌 잠금은 FPS에서 발생할 수 없습니다. 실제로 마우스 움직임에 오일러 각을 연결하는 것은 위험없이 대규모 단순화입니다. –

+0

정말, 내 3D로 읽어야한다고 생각합니다. – crunchdog

+0

조나스 말이 맞습니다. 최소한 3 회전을 합치면 짐벌 잠금 위험이 있습니다. 당신이 인용 한 기사는 단지 틀린 말입니다. Eulerian 변환을 사용하는 경우에만 행렬 및 쿼터니언과 함께 일부 짐벌 잠금을 가질 수 있습니다. 이 문제를 해결하는 데는 두 가지 방법이 있습니다. 극좌표의 특이점에 대한 비선형 처리법이나 비유하자 변환 ... quaternions으로 표현하기 쉽습니다. :) – gouessej

관련 문제