2

OpenGLアプリケーションで衝突検出を行う方法を考えていたところ、ジオメトリデータのコピーを2つ保持する必要があるという結論に達しました。

1)最初のコピー:OpenGLレンダリングの目的でのみ。これはVBO、頂点インデックスとして保存できます(GPUに保存されますか?)

2)2番目のコピー:バウンディングボックス衝突テスト、レイキャスティングを含むすべてのテストを実行するクライアント側(クラス、たとえば3DEntity)に保存します。

したがって、メッシュデータ(たとえばOBJファイルから)をロードした後、最初に「最初のコピー」を準備し、次に「頂点インデックス」を使用して「2番目のコピー」を準備します。(例:メッシュが単純な立方体の場合、「最初のコピー」には8つの頂点があり、頂点インデックスを使用して適切にレンダリングします。ただし、「2番目のコピー」には合計36の頂点があります。レイを実行する必要があるためです。三角形にキャスト)

「3Dエンティティ」の位置、回転などの状態を維持するために、「3Dエンティティ」内に変換行列を保持します。したがって、疑似コードでは、

class 3DEntity {
 Vertex[] verticesForPhysics;
 Matrix tranformationMatrix;
}

「verticesForPhysics」の値を固定したままにします(つまり、常にモデル座標系にあります)。したがって、移動する場合は、エンティティを回転させるだけで「transformationMatrix」を変更します。

衝突検出などのテストを行うときは、「verticesForPhysics」に「transformationMatrix」を掛けてワールド座標の頂点を指定することにより、頂点の一時的なコピーを再度作成します。

Vertex[] verticesForPhysicsInWorld=transformationMatrix * verticesForPhysics;

次に、これらの「verticesForPhysicsInWorld」を使用してテストを行います。

これはこれを処理する正しい方法ですか?2つのコピーを保持し、衝突検出テスト用に別の一時的なコピーを作成することで、データの冗長性が心配です。他のOpenGLゲームエンジンはこれをどのように処理しますか?

4

1 に答える 1

3

頂点データのコピーが複数あるのはごく普通のことなので、心配しないでください:-)

たとえば、次のようになります。

  • ジオメトリを説明する変換されていない頂点データ
  • レンダリング中に変換された頂点データ(おそらくGPUによって実行されます)
  • 衝突検出に使用される単純化された変換済みデータ(AABBツリーなど)-これは、衝突検出用に完全に変換された頂点データを操作するよりもはるかに効率的です。
  • 必要に応じて、頂点データを変換してより詳細な衝突検出を行いますが、AABBのオーバーラップが原因で2つのオブジェクトが衝突している可能性があると判断した場合に限ります。フレームごとにすべてのオブジェクトに対してこれを実行する必要はありません。

物理学に使用される頂点データ/ジオメトリがレンダリングに使用されるものとは異なることも一般的であることに注意してください。多くの場合、衝突検出用のより単純なオブジェクト(球、シリンダーなど)で逃げることができます

于 2012-05-18T05:27:32.377 に答える