2009-05-03 27 views
2

現在、JOGLを使用して最初のFPSゲームを設計しています。 (OpenGLのためのJavaバインディング)。OpenGL衝突検出

これまでのところ、私はworld(一連の立方体)とプレーヤーモデルを生成することができました。私は、プレイヤーとキューブとの間の衝突検出が素晴らしいと思っています。

今、私は銃を追加しようとしています。私は、銃モデルを正しく描き、プレーヤーモデルにロードしました。私が実装しようとしている最初の銃は、あなたが目指しているところに瞬間的な視線のレーザーを撃つレーザー銃です。私が敵のモデルを実装する前に、私はレーザーと壁との間の衝突検出を行いたいと思っています。

私のレーザーは、現在、一連の小さな立方体で描かれています。最初の立方体は選手の銃の最後に描かれ、そこから連続的に引き出されます。アイデアは、何か、つまり世界のキューブで衝突が検出されるまで、レーザーの立方体を引き続き描くことでした。

私は世界の立方体の位置を知っています。問題は、文字モデルを描画するためにglMatrixPushを呼び出さなければならないことです。その後、このモデルビュー内でレーザーが描画されます。私が私の古い座標系を失ったことを意味する - それで、私は1つのシステムで世界を描き、次に別のシステムで世界を描きます。このプレイヤーマトリックスの中で、私はglRotateとglTranslateを何回か呼び出すと、カメラが回転しているようにすべてを同期させることができます。この新しいシステムのz軸に沿って平行移動することによって、レーザーが構築されます。

私の問題は、これらのすべての変換を通じて、主にカメラを含む回転のために、私のレーザーが地図座標系にどこに存在しているか分かりません。

この問題を解決する方法について誰かが知っていますか?私は、レーザーの新しい座標をマップの古い座標に変換する方法が必要だと信じていますが、私はそれに行われたすべての変換を元に戻す方法についてはわかりません。また、OpenGLが提供するいくつかの機能が、私が気づいていないようなこのような問題を処理する可能性があります。

答えて

3

最初の答えで行われた点は、オブジェクトを最初に配置するために行列に決して依存してはならないということです。あなたはそれを描くことを考える前に、レーザーの位置と回転を追跡しておくべきです。次に、translateコマンドとrotateコマンドを使用して、必要な場所に配置します。

あなたは行列の計算をしなければならないということを意味しています.ModelViewの行列はOpenGLが保持している唯一のものなので、OpenGLはそれを追跡しませんオブジェクトの位置に関するトラック。 OpenGLには、「ワールド空間」または「カメラ空間」の概念がありません。すべての入力が乗算される行列だけがあります。それはエレガントに簡単です...しかし、私はDirectXが別個のビューマトリックスとモデルマトリックスを持つ方法を好む場合があります。

したがって、オブジェクトが行列演算なしでどこにあるのかわからない場合は、基本的な設計上の問題と考えています。あなたはオブジェクトの位置を知る必要がない場合、あなたの心のコンテンツに行列変換しますが、それが必要な場合はの位置にを開始します。

(かなりの最初の答えはちょうど別の方法で、言っている...)

+0

+1私はあなたがそれよりも問題の部分を説明したと思う:) – Trillian

4

あなたはレーザーをそれを発射するキャラクターの空間的な子として考えるべきではありません。その発射された後、レーザーは、独自のエンティティであるので、次のようにレンダリングする必要があります。

glPushMatrix(viewMatrix); 
glPushMatrix(playerMatrix); 
DrawPlayer(); 
glPopMatrix(); 
glPushMatrix(laserMatrix); 
DrawLaser(); 
glPopMatrix(); 
glPopMatrix(); 

また、あなたはゲームロジックを使用してレンダリング変換ロジックを混在させないことを確認してください。現在のOpenGLマトリックススタックに関係なく、交差点をテストできるように、オブジェクトのワールドスペース位置を常に保存する必要があります。

空間的な親子関係には注意が必要です。実際には、それほど頻繁ではありません。詳細については、シーングラフの問題についてはGoogleを参照してください。

+0

応答をありがとう - 私はいくつかの変更を加えましたし、私は今それ自身の行列にレーザーをレンダリングしています。新しいオブジェクトの世界の空間位置を保存する標準的な方法がありますか?たとえば、私は既に私のviewMatrixと私のplayerMatrixをプッシュしているので、私がlaserMatrixをプッシュするたびに、それがどこにあるのかを私はどのように知っていますか? –

+0

私はここであなたを理解するか分からない。 'glGetFloatv(GL_MODELVIEW_MATRIX)'はあなたの現在の行列を取得できますが、それが必要な場合は、あなたのレーザーエンティティクラスがその値を格納する必要があるため、常にあなたのレーザーがワールド空間のどこにあるかを知る必要があります。レーザーの変換行列は、ワールド空間の位置から計算する必要があります。ここでもまた、現在のOpenGL行列スタック状態は、ワールド空間でエンティティを見つける能力に影響を与えるべきではありません。 – Trillian

+0

私のオブジェクトのワールド空間座標を保存するには、glRotateやglTranslateのような関数を呼び出すたびに、逆行列を乗算して行列の計算を自分自身で行う必要があります? OpenGLがそれ自体を追跡しないことは奇妙に思えます。 –