2009-08-27 13 views
12

私は現在、楽しみのためだけにOpenGL(JOGL、より具体的には)のいくつかのFPSゲームプログラミングに取り組んでいます。私はFPSのようなカメラを作成するための推奨される方法を知りたがっていますか? FPSカメラはどのように実装されますか?

は、現時点で私は基本的に「W」または順方向キーを押すと、現在のプレイヤの位置に追加されるプレイヤが向いている方向についてのベクトルを有します。もちろん、そのベクトルの負は "s"キーまたは逆方向キーに使用されます。 "a"、left、 "d"の場合は、右方向ベクトルの法線を使用します。マウスを移動する際

(私はこれはプレイヤーが飛ぶだろうと認識していますが、それは、現時点では問題ではありません)、方向ベクトルは、三角法と行列を使用して回転することになります。すべてのベクトルは、もちろん、簡単な速度制御のために正規化されています。

が、これは一般的なおよび/または良い方法ですか簡単に/より良い方法はありますか?

答えて

6

は常にそれが二つの角度、ヨーとピッチを使用している行って見てきた私の方法。マウスの移動の2つの軸は、これらの角度の変化に対応します。

あなたが球状に矩形座標変換で簡単forwardベクトルを算出することができます。 (ピッチ=緯度=φ、ヨー=経度=θ)

固定のupベクトル(たとえば(0,0,1))を使用することができますが、これは上方向または下方向を直接見ることはできません。 (ほとんどのゲームは、89.999度よりも急に見えるようにすることでこれを解決します)。

rightベクトルは、前方ベクトルと上方ベクトルの外積です。アップベクトルは常にグランドプレーンに垂直であるため、常にグランドプレーンと平行になります。

左/右の機銃掃射キーは、+/-rightベクトルを使用しています。グランドプレーンに平行なforwardベクトルの場合、rightupベクトルの積を取ることができます。

GL部分については、gluLookAt()を、プレイヤーの起源である起源とforwardベクターとupベクターを使用して簡単に使用できます。

ああ、「反転マウス」オプションを追加してください。

編集:(なしピッチ情報で)最初rightベクトルを構築し、その後forwardup含ま別の質問で尋ね89.9問題、を取り除くHereの代替ソリューション。

4

はい、本質的に私はいつもそれが完了したことを見てきた方法です。

+0

よろしくお願いいたします。ちょうど私が何かを欠けていないことを確認したかった。良い一日を! –

1

ええ、最終的にはカメラにさまざまな属性を追加したいと思うでしょう。それを綴るにはn00b:QuakeまたはCSを模倣したい場合はきちんとしておきなさい。最終的には、ボビンング、FoV、モーションフィルタリング、ネットワーク遅延停止などがあります。

カメラは、実際には良いゲームで作るのが難しい部分の1つです。だからこそ、開発者は通常、真剣に鈍い、固定された第1 /第3人の同類に満足しているのです。

1

カメラの回転にはQuaternionsを使用できます。私は自分で試していませんが、gimbal lockを避けるのに便利です。

+1

ジンバルロックはFPSでは実行できません。実際、オイラー角をマウスの動きに結びつけることは、リスクのない大規模な単純化です。 –

+0

本当に、私は自分の3D上で読まなければならないと思います。 – crunchdog

+0

ジョナスはそうです、少なくとも3回転を組み合わせるとジンバルロックの危険性があります。あなたが引用している記事は間違っているだけです。オイラー変換を使用している場合にのみ、行列と四元数でジンバルロックを設定することができます。それを固定するには2つの方法しかありません。極座標上の特異点のためのいくつかの非線形処理や、クォータニオンで表現しやすい非オイラー変換があります:) – gouessej

関連する問題