私は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 */
だから、どのように私は "窓"の座標を取得するのですか? また、衝突を計算する他の方法がありますか? 私は本当にあなたの助けが必要です、私はそれほど感謝します。 ありがとうございました!
あなたの応答をありがとうございました!だから正しく理解すれば、各ウィンドウのモデル行列を抽出し、その点の原点の座標を取得する必要がありますか? – WaLi
私はそれを試しました、ウィンドウのモデル行列を取得しています(それは正しいので、私はその行列で何かを描いています)。しかし、どのようにしてその行列から座標を抽出できますか?私はその行列にベクトル '[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
まず、OOPを使用して位置/姿勢情報を扱うクラスが良い考えであると言えます。 OpenGLは、結果を表示するためにのみ使用されます。ご覧のように、衝突の検出は表示とは関係ありません。あなたはそれをすることができませんか?おそらくあなたの人生は楽になるでしょう。 できない場合は、逆変換行列を適用して、適切な参照フレームに「戻る」必要があると思います。 – BenC