0

私が理解しているように、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 などで埋められます。私はどこを台無しにしていますか?

4

1 に答える 1

2

gluLookAt は、パフォーマンスの低下がまったくない非常に便利な関数です。それを使用しない理由はありません。何よりも、それに関する「ハードウェアとソフトウェア」の考慮事項はありません。Mk12 が述べたように、glRotatef も CPU 上で実行されます。GPU 部分は次のとおりです。 gl_Position = ProjectionMatrix x ViewMatrix x ModelMatrix x VertexPosition。

「glTranslatesとglRotatesを使用すると、視点が静止することを意味します」-> gluLookAtについても同じ

「簡単にするために (0,0,0) で」 -> 簡単にするためではなく、事実です。ただし、この (0,0,0) はカメラ座標系にあります。それは理にかなっています:カメラに対して相対的に、カメラは原点にあります...

さて、カメラが壁を通り抜けないようにしたい場合、通常の方法はカメラから光線を追跡することです。これがあなたが話していることだと思います(「交点を確認する」)。ただし、カメラ空間でこれを行う必要はありません。これはワールド空間で行うことができます。比較は次のとおりです。

  • カメラ空間でのレイの追跡: レイは常に (0,0,0) から始まり、(0,0,-1) に進みます。ジオメトリをモデル空間からワールド空間に変換し、次にカメラ空間に変換する必要がありますが、これが面倒です。
  • ワールド空間でのレイのトレース: レイはカメラの位置 (ワールド空間) から始まり、(eyeCenter - eyePos).normalize() に移動します。ジオメトリは、モデル空間からワールド空間に変換する必要があります。

モデル空間からワールド空間へのジオメトリの変換を回避する 3 番目のオプション (モデル空間で光線を追跡する) がないことに注意してください。ただし、次の回避策があります。

  • まず、ゲームの世界はおそらく静止しています。モデル マトリックスは、おそらく常に恒等性です。そのため、そのジオメトリをモデル空間からワールド空間に変換することは、何もしないことと同じです。
  • 次に、他のすべてのオブジェクトについては、反対のアプローチを取ることができます。ジオメトリ全体を一方向に変換する代わりに、光線のみを逆方向に変換します。モデル マトリックスを逆変換すると、ワールド空間からモデル空間に移動するマトリックスが得られます。光線の原点と方向をこの行列で乗算します。光線はモデル空間になりました。通常の方法で交差します。終わり。

私が言ったことはすべて標準的なテクニックであることに注意してください。ハックやその他の奇妙なことはありません。数学だけです:)

于 2010-09-10T00:44:57.183 に答える