0

XNA プロジェクトで衝突を起こしたいので、BoundingBoxes を使用してみました。家の壁に衝突させたかったので、このコードを使用して、モデル内の各メッシュの BoundingBox を作成しました。

public void CreateBB()
    {
        Model model = Game1.ModelRes[nazwaModelu];
        Matrix worldTransform = world;

        foreach (ModelMesh mesh in model.Meshes)
        {
            Vector3 min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
            Vector3 max = new Vector3(float.MinValue, float.MinValue, float.MinValue);
            foreach (ModelMeshPart meshPart in mesh.MeshParts)
            {
                int vertexStride = meshPart.VertexBuffer.VertexDeclaration.VertexStride;
                int vertexBufferSize = meshPart.NumVertices * vertexStride;

                float[] vertexData = new float[vertexBufferSize / sizeof(float)];
                meshPart.VertexBuffer.GetData<float>(vertexData);

                for (int i = 0; i < vertexBufferSize / sizeof(float); i += vertexStride / sizeof(float))
                {
                    Vector3 transformedPosition = Vector3.Transform(new Vector3(vertexData[i], vertexData[i + 1], vertexData[i + 2]), worldTransform);

                    min = Vector3.Min(min, transformedPosition);
                    max = Vector3.Max(max, transformedPosition);
                }
            }
            Game1.boxory.Add(new BoundingBox(min, max));
        }
    }

6 つの等しい BoundingBox を受け取りました。各 BoundingBox は同じであったため、衝突は 1 つの壁でのみ機能します。このコードの問題ですか? (または、多くのメッシュを持つモデルをエクスポートする場合)?

4

1 に答える 1

1

meshPart.VertexBuffer.GetData(頂点データ);

すべての ModelMeshPart は、その ModelMeshPart だけでなく、モデル全体のデータを含む同じ vertexBuffer を参照します。各 ModelMeshPart は、そのバッファ内に独自の開始インデックスと使用する頂点の数を持っています。したがってGetData()、 を呼び出すたびに、ModelMeshPart の開始インデックスではなく、VB の開始 (0 番目の要素/インデックス) から float 配列を設定しました。

于 2013-01-26T18:52:19.767 に答える