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ゲームエンジンはこれをどのように処理しますか?