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 Content Pipeline 提取顶点。App Hub 上的Picking with Triangle Accuracy示例就是这样做的。

于 2010-12-23T09:46:26.313 回答