2010-05-29 78 views
2

在游戏中存储3D模型的最佳方法是什么? 我在矢量中存储: 矢量三角形(每个三角形包含texcords的数量,顶点的数量和法线的数量), 矢量点; vector normals; 矢量texCords;在游戏中存储3D模型,最好的方法

+3

“在游戏中存储3D模型?”:您正在谈论的是:内存存储(正在使用时)还是磁盘存储(游戏安装后)? – SigTerm 2010-05-29 01:07:25

+1

最好的方法完全取决于你的游戏。如果你目前的格式适用于你的游戏,那就去做吧。如果你在谈论文件格式,那么你可以使用一些标准格式,比如这里提到的一些标准格式(http://stackoverflow.com/questions/585769/recommended-3d-model-type-游戏人物角色模型加载手动)和[这里](http://stackoverflow.com/questions/1488579/3d-model-format-for-games)。 – 2010-05-29 01:08:01

回答

3

在这种情况下,我不确定什么构成“最好的方法”,因为这将取决于情况,在您的问题中,它有些开放性的解释。

如果您正在讨论如何快速呈现静态对象,您可以使用Display Lists进行很长的路要走。它们可以用于所有OpenGL调用一次,然后回想那些指令以在游戏中使用时呈现对象。所有用于计算顶点位置,法线等的开销只会在构建每个显示列表时执行一次。缺点是如果你的模型经常变化,你不会看到太多的性能增益。

编辑:SurvivalMachine下面提到显示列表已被弃用。特别是,它们在OpenGL 3.0版中被弃用,并且完全从版本3.1中的标准中移除。经过一些研究,似乎Vertex Buffer Object(VBO)扩展是首选的替代方案,尽管我发现许多来源声称性能不如显示列表。

+2

显示列表已被弃用。 – SurvivalMachine 2010-05-29 13:45:44

+0

@SurvivalMachine:我不知道。自从我做了任何grpahics编程已经有一段时间了。感谢您的提醒;我已经更新了我的答案。 – andand 2010-05-29 20:09:10

+0

在我看来,与显示列表相比,VBO的性能取决于视频卡。我也做了一些搜索,几次讨论已经过去了几年,并且指出当时的“新”卡开始看到维也纳国际组织的表现比DL更高。无论如何,显示列表的弃用是(IMO)远离它们的充分理由,更不用说在DirectX中没有相同的显示列表,所以如果您想要抽象引擎以允许DirectX支持您将不得不转移到顶点数组或维也纳组织。 – Ricket 2010-05-30 00:14:22

0

我选择从.ms3d格式导入模型,虽然稍后可能会重构,但我认为它为我的3D模型的数据结构提供了一个体面的基础。

spec(C头格式)是一个非常简单的读取;我用Java编写我的游戏,所以我简单地移植了每个数据结构:顶点,三角形,组,材质以及可选的骨架动画元素。

但是真的,模型只是顶点(或三角形)的三元组,每个顶点都有一个材质,对吧?首先创建这些基本结构,编写一个绘制函数,为参数提取一个模型并绘制它,然后添加您需要的任何其他功能。迭代设计,如果你愿意的话。

+0

现在我将我的三角形存储在std :: vector上,但它工作得很慢:/ 我必须存储在std :: vector上,beacouse我检查与它们的碰撞,有没有更好的方法然后向量? – piotrek 2010-05-30 12:31:52

+0

我会使用一个常规数组。std :: vector会有开销,因为它意味着要容纳经常改变的数据结构;但由于您只需加载一次数据,并且您应该能够知道(或弄清楚)需要存储多少个三角形,因此不需要矢量的额外功能。如果你真的想要,你可以加载到矢量中,然后在加载后将其复制到数组中。无论如何,循环访问数组可能会为您提供所需的额外速度。 – Ricket 2010-05-30 16:01:04

+0

还要确保你正在进行更有效的碰撞,而不是仅仅检查每帧所有三角形的碰撞。你应该做更高层次的事情,比如边界框检查,甚至是大场景中的四叉树/八叉树,只有那些测试是真实的,那么你应该深入到只有碰撞网格的三角形。 – Ricket 2010-05-30 16:15:47