如何在XNA中访问模型的面?

时间:2011-04-06 23:03:12

标签: c# xna collision-detection

我正在为使用Microsoft XNA框架4.0版编写的游戏进行碰撞检测。当内容框架加载模型时,我试图访问模型本身,我可以访问一个“ModelMesh”列表,并为每个模型显示一个MeshPart列表,但这些部分似乎只有像顶点数一样的诊断数据。我完全不知道该模型的实际面部数据发生了什么。

我正在尝试实施球形扫描/平面碰撞 - 也就是说,我有一个球移动,我想在球移动时测试与多边形的碰撞。我需要一种方法来定义要测试的所有多边形,并且我将碰撞贴图定义为一个简化的网格是有意义的,我将其与我的实际图形对象并行设计用于碰撞,但我完全是对XNA的内容管道加载后我应该如何访问该信息感到困惑。

也许有些见解?我整天都在梳理谷歌而且我无法找到任何可能有用的东西,尽管我可能使用了错误的搜索条件......

1 个答案:

答案 0 :(得分:3)

内置的XNA FBX /模型内容导入器和处理器句柄“面对”几乎与每个建模程序相同的方式 - 作为顶点和索引的列表。 (作为旁注,你的GPU本身也支持这种方案,现代游戏因性能原因而依赖它。)

例如,考虑一个简单的双三角形四边形。顶点可能是:

v0 (0,0,0)
v1 (1,0,0)
v2 (1,1,0)
v3 (0,1,0)

,或者

v0--v1
|  / |
| /  |
v3--v2

要以“面子”形式表示,您需要一个等同于

的数据列表

三角形1(左上):( 0,0,0),(1,0,0),(0,1,0)=(v0,v1,v3)

三角形2(右下):( 1,0,0),(1,1,0),(0,1,0)=(v1,v2,v3)

需要六个顶点记录。

使用XNA本机结构,Vector3有三个元素,每个元素都是单精度浮点数(4个字节),因此每个3 * 4 = 12个字节,你需要其中的6个,所以72个字节。

或者,您可以使用索引编制。除了四个顶点之外,还可以存储索引列表:

f1: 0,1,3
f2: 1,2,3

可以使用短路(16位整数)存储指数。那么,让我们来看看差异:

无索引:两个面* 3个顶点* 3个组件(xyz)*每个4个字节= 2 * 3 * 3 * 4 = 72个字节。

索引:

顶点:4个顶点*每个3个组件*每个组件4个字节= 48个字节,

索引(每个三角形3个短路):6个索引*每个2个字节= 12个字节。

48 + 12 = 60,对于非索引模型,略小于72字节。

在您考虑具有100,000多个三角形的整个级别之前,这12个字节可能看起来不是很多。那时,你正在看1.2MB的差异。虽然你的显卡可能大约有2 + GB的内存,但在主机RAM和GPU RAM之间来回移动数据是很昂贵的。

那么,你如何获得这些数据?

查看Model.Meshes[].MeshParts[].VertexBuffer.GetData()Model.Meshes[].MeshParts[].IndexBuffer.GetData()。您可以使用这些方法提取顶点和索引,然后交叉引用这两个方法以获取三角形列表。

您不能直接访问VertexBufferIndexBuffer的元素,因为它们存储在GPU的RAM中 - 允许随机元素访问将性能拖动到接近负的速度。 / em>的

另外,请查看GraphicsDevice.DrawIndexedPrimitives()方法。

如有必要,我可以稍后发布一些示例代码。