是否可以从XNA模型对象中获取索引/顶点?我想处理几何以进行碰撞检测。
答案 0 :(得分:1)
我最近在为XNA模型绘制边界框时编写了blog post,并且源包含了一个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示例执行此操作。