2011-12-07 17 views
2

私はOpenGLでゲームを作っています。このゲームは、3次元世界を自由に飛行する飛行機で構成されており、窓を通過しているかのように、いくつかの特殊な領域を通過しなければならない。今、私は飛行機と "窓"との衝突を計算しようとしています。私は第1のアプローチとして、飛行機の軌道のために掃引されたAABBと、これらのAABBが重なっている場合、それを通過する飛行機の潜在的な場合があるような、各ウィンドウのためのAABBを持つと考えました。 しかし、私が知っているすべてのアルゴリズムは、同じ参照系の両方のオブジェクト(平面+ウィンドウ)の座標を知る必要があるため、AABBを計算しようとすると問題が始まります。私のプログラムは、常に元の中心にある平面(実際にはz = -10で、それがレンダリングされる)の代わりに、移動するもののように世界を描画します。実際の問題は、平面から見て各「ウィンドウ」の座標を計算する方法です。これは私がシーンを描画するために使用するコードです:AABBの衝突を計算する

glLoadIdentity(); 

//these are the rotations of the plane of the ground 
glRotatef(RotHorizont, 0.0f, 0.0f, 1.0f); 
glRotatef(-directionX, 1.0f, 0.0f, 0.0f); 
glRotatef(-directionY, 0, 1.0f, 0); 

//and these are the movement of the plane 
//(the multiplication by 0.0174532925f is to convert the angles to radians 
Tx -= (float)Math.sin(directionY * 0.0174532925f) * velocity; 
Tz -= (float)Math.cos(directionY * 0.0174532925f) * velocity; 
Ty -= (float)Math.sin(directionX * 0.0174532925f) * velocity; 

glTranslatef(-Tx, Ty, -Tz); 

/* 
here I draw the ground and the windows 
*/ 
.... 

//and now I draw the plane 
gl.glLoadIdentity(); 
gl.glTranslatef(0.0f, 0.0f, -10.0f); 
/* draw the plane */ 

だから、どのように私は "窓"の座標を取得するのですか? また、衝突を計算する他の方法がありますか? 私は本当にあなたの助けが必要です、私はそれほど感謝します。 ありがとうございました!

答えて

2

あなたは位置によってAABBを定義することができます( 3座標ベクトル)とそのサイズ(3座標ベクトル)を計算し、AABB衝突検出アルゴリズムを適用して問題を解決します。

あなたが指摘したように、計算は同じ座標系で行う必要があります。しかし、AABB(OBBではなく)を扱っているので、方向を扱う必要はありません(AABBは、回転後にオブジェクトが残るように計算されるか、オブジェクトの回転ごとに再計算されます)。 "AA"は "Axis-Aligned"を意味するので、通常はすでに共通の参照フレームを扱っています(そうでなければOBBになります)。従って、必要とされる唯一の「変換」は翻訳である。

飛行機の中心が座標系の中心である場合、飛行機のAABBの位置は(0,0,0)(または(0,0、-10))になります。あなたのウィンドウについては、それらをどのように定義するかによって異なりますが、それらのセンターを見つけるのはかなり簡単です(OpenGLを使ってproducts of transformation matricesを扱っています。元の座標系からWindowsに移動するものを見つけてください)。より多くの情報を提供した場合は、その達成方法の詳細をご紹介します。

リンク:

+0

あなたの応答をありがとうございました!だから正しく理解すれば、各ウィンドウのモデル行列を抽出し、その点の原点の座標を取得する必要がありますか? – WaLi

+0

私はそれを試しました、ウィンドウのモデル行列を取得しています(それは正しいので、私はその行列で何かを描いています)。しかし、どのようにしてその行列から座標を抽出できますか?私はその行列にベクトル '[0; 0; 0; 1] '(ウィンドウの起点を表す)、元のシステムから見た座標を私に与えるはずですが、そうではありません。 たとえば、この行列では、平面から見た座標をどのように抽出できますか? '0.967 0.023 0.253 0.000 -0.112 0.933 0.342 0.000 -0.229-0.360 0.905 0.000 15.392 89。237 -318.202 1.000' – WaLi

+0

まず、OOPを使用して位置/姿勢情報を扱うクラスが良い考えであると言えます。 OpenGLは、結果を表示するためにのみ使用されます。ご覧のように、衝突の検出は表示とは関係ありません。あなたはそれをすることができませんか?おそらくあなたの人生は楽になるでしょう。 できない場合は、逆変換行列を適用して、適切な参照フレームに「戻る」必要があると思います。 – BenC