0

XNA モデル オブジェクトからインデックス/頂点を取得することは可能ですか? 衝突検出のためにジオメトリを処理したい。

4

1 に答える 1

1

最近、XNA モデルのバウンディング ボックスの描画に関するブログ記事を書きました。ソース インクルードには、必要な機能を正確に実行するVertexElementExtractorクラスが含まれています。短いので、ここにコードを含めます。

public static class VertexElementExtractor
{
    public static Vector3[] GetVertexElement(ModelMeshPart meshPart, VertexElementUsage usage)
    {
        VertexDeclaration vd = meshPart.VertexBuffer.VertexDeclaration;
        VertexElement[] elements = vd.GetVertexElements();

        Func<VertexElement, bool> elementPredicate = ve => ve.VertexElementUsage == usage && ve.VertexElementFormat == VertexElementFormat.Vector3;
        if (!elements.Any(elementPredicate))
            return null;

        VertexElement element = elements.First(elementPredicate);

        Vector3[] vertexData = new Vector3[meshPart.NumVertices];
        meshPart.VertexBuffer.GetData((meshPart.VertexOffset * vd.VertexStride) + element.Offset,
            vertexData, 0, vertexData.Length, vd.VertexStride);

        return vertexData;
    }
}

ただし、可能であれば、ビルド時に XNA コンテンツ パイプラインを使用して頂点を抽出することをお勧めします。App HubのPicking with Triangle Accuracyサンプルはこれを行います。

于 2010-12-23T09:46:26.313 に答える