私が理解しているように、gluTranslate / glRotate を使用して glutLootAt を使用することをお勧めします。明らかな HW 対 SW 計算モード以外の理由を探すつもりはありませんが、単に波に沿って進みます。ただし、カメラが壁を突き破るのを効率的に止める方法が正確にわからないため、これは頭痛の種です。AABB などではなく、点と面の交点のみに関心があります。
そのため、glTranslates と glRotates を使用すると、世界がその周りを回転している間、視点は (簡単にするために (0,0,0) で) 静止したままになります。これは、交点をチェックするために、カメラの動きごとに世界の頂点座標を再計算する必要があることを意味します (これは glutLookAt アプローチでは必要ありませんでした)。GPU ランドから必要な新しい座標を取得する方法がないため、CPU ランドで手動で計算する必要があります。カメラの動きごとに... :(
現在の回転を 3 つの軸のそれぞれと平行移動についても同じように保持する必要があるようです。私のプログラムではスケーリングは使用されていません。私の質問:
1 - 上記の推論には欠陥がありますか? どのように ?2 - そうでない場合は、そのような再計算を回避する方法が必要です。私がそれを見る方法(そしてhttp://www.glprogramming.com/red/appendixf.htmlを見ることによって)) 平行移動用に 1 つの行列乗算が必要であり、回転用に別の行列乗算が必要です (必要な y 軸を除いて)。ただし、非常に多くの加算/乗算、特にサイン/コサインを計算しなければならないことは、確かに FPS を殺します。計算対象の頂点は数千、場合によっては数万になります。すべてのフレーム...すべての計算...世界の新しい座標を計算した後は、物事は非常に簡単に思えます-「d」記号を変更した平面があるかどうかを確認するだけです(平面の方程式から ax + by + cz + d = 0)。その場合は、軽量の外積アプローチを使用して、その点がその平面の各「移動」三角形内の空間内にあるかどうかをテストします。
ありがとう
編集: glGet について見つけましたが、それが正しい方法だと思いますが、適切に使用する方法がわかりません:
// Retains the current modelview matrix
//glPushMatrix();
glGetFloatv(GL_MODELVIEW_MATRIX, m_vt16CurrentMatrixVerts);
//glPopMatrix();
m_vt16CurrentMatrixVerts は float[16] で、0.f または 8.67453e-13 などで埋められます。私はどこを台無しにしていますか?