0

次のようなコードで座標を持つ宇宙船があると仮定しましょう

public float coords[] = {
        -0.025f,   -0.04f, -0.1f,   
        0.025f,   -0.04f, -0.1f,  
        -0.025f,   0.04f, -0.1f, 
    };

そして流星との衝突をチェックする必要があります。
したがって、スターシップには三角形のバウンディング ボックスがあり、メテオには正方形のバウンディング ボックスがあります。
そのため、宇宙船を平行移動または回転させるときは常に、MVP マトリックスを使用し、バーティクル シェーダーの各バーティクルで乗算します。しかし、バウンディング ボックスも移動および回転する必要があります。
どうすればいいですか?スターシップ座標とバウンディング ボックス座標の両方について、頂点シェーダーの外側で MVP マトリックスを乗算し、頂点シェーダーから MVP マトリックスを削除する必要がありますか? または、実際のオブジェクトを移動および移動すると同時にバウンディング ボックスを移動および移動する別の方法はありますか?

4

1 に答える 1

1

衝突検出とレンダリングの 2 つを分離する必要があります。

モデルをレンダリングするとき、通常、いくつかの VertexBuffer (オブジェクト スペースに格納されたデータ) があり、シェーダーでは ModelViewMatrix によってそれを変換します。モデルの位置を変更するためだけに VertexBuffer 内のデータを変更すると、非常にコストがかかります。

一方、衝突をチェックするときは、シェーダーではなく一部の物理エンジンで行います。たとえば、CPU側でそれを行うことができます。通常、MVP によってバウンディング ボックスを変換してから、衝突テストを実行します。MVP によるバウンディング ボックスの変換は非常に高速であることに注意してください (立方体の場合は数頂点、オブジェクト自体の場合はクアッド対数百)。

(お気づきのように) これらのデータを同期させることが重要です。

いくつかのコード:

update() {
    foreach o in objects
        o.calculateModelViewBoundingBox()

    testCollisionBetweenObjects()
}

render() { 
    foreach o in objects
        o.render()
}
于 2013-09-12T16:27:16.177 に答える