我应该使用哪种3D模型格式?

30

我正在开发一款游戏引擎,想知道应该使用/加载/导出哪种3D模型格式?Obj格式普遍且易于使用,但它似乎不可靠,因为大多数模型都存在错误,并且它存储的信息远不如其他格式。

还有一些专门针对游戏的格式,例如MD2 / 3/5,但我不确定。如果我使用Wings3D进行建模,我不知道除了纯粹加载所需内容和格式支持外,我还需要实现哪些细节,比如是否需要实现IK?我能否使用脚本化的逐片动画而不是逆向运动学和骨骼绑定?

6个回答

23

Collada 是一个基于开放式XML的3D模型格式,由Khronos组织(OpenGL标准制定组织)拥有。

来自Collada.org FAQ:

COLLADA 1.4.x 版本的功能包括:

  • 网格几何
  • 变换层次结构(旋转、平移、拉伸、缩放、矩阵)
  • 效果
  • 着色器(Cg、GLSL、GLES)
  • 材料
  • 纹理
  • 灯光
  • 相机
  • 蒙皮
  • 动画
  • 物理学(刚体、约束、布娃娃、碰撞、体积)
  • 实例化
  • 技术
  • 多表示
  • 资产
  • 用户数据

15
我不会在实时图形中使用这种格式。Collada旨在作为图形制作流程的中间格式,因此请使用它将其转换为更紧凑的二进制格式,否则你将需要整整一天的时间来加载它。 - Kelden Cowan
还要考虑到并非所有工具都支持完整的COLLADA功能集。 - sourcenouveau
最终我选择了ASSIMP库来加载几何体,这样任何人都可以使用他们喜欢的方式,只要支持必要的属性即可。 - Tom J Nowell
解析Collada文件的效果取决于你的解析器的工作质量。尽管如此,我同意它更多地是一种流水线格式,并且包含了太多信息,游戏引擎可能不需要这么多。由于Collada是文本,因此它的压缩比非常高。另一个重要的事情是它已经被Khronos开发和维护,这导致Collada文件与OpenGL之间的转换非常顺畅,因为信息的存储方式(使用VBOs结合交错数组可以大大提高性能)。顺便说一下,ASSIMP仅支持1.4版本,加载1.5版本会导致异常。 - rbaleksandar
@TomJNowell 你是怎么接触到assimp的呢? - elect
1
一个很好的例子证明了Collada在实际应用中通常过于泛化,例如Vulkan不支持四边形,但是Collada可以包含基于四边形的资产而没有问题。因此,为了克服这个问题,您需要预见Collada文档可能包含的内容,然后将其转换为应用程序可以处理的格式。这可能需要很多工作...也可能是投机的。 - BitTickler

5
在考虑支持哪些3D格式之前,我认为您应该真正关注您计划在引擎中实现的功能。将它们作为要求写下来,并选择从列表中支持最多功能的格式……因为您希望展示您的引擎(我假设您计划让您的引擎公开可用)。如果您的引擎具有特定功能(对于游戏引擎来说总是一件好事),甚至可以自己制定格式。
之后,尽可能支持许多流行的格式(.X、.3DS、.OBJ、.B3D)……您的引擎越易于访问,越有人愿意使用它!
Collada是一个不错和通用的格式,但正如Nils所提到的,它并不是最理想的最终部署格式。

2
+1 支持使用Collada格式。您可能还需要一个定制的本地二进制格式来实现快速加载(通常只是顶点/索引缓冲数据的二进制转储,加上材质和骨骼数据,以及适当的碰撞数据)。
游戏行业的一个趋势是支持在引擎的开发版本中加载像Collada这样的格式,但也有一个工具链可以导出优化版本用于发布。开发版本可以动态更新网格,因此当艺术家保存更改时,文件会自动重新加载,使他们可以(几乎)即时地看到模型的WYSIWYG视图,同时仍提供完全优化的发布格式。

2
关于本机二进制格式,值得注意的是已经存在一个标准的二进制XML格式:http://en.wikipedia.org/wiki/Binary_XML - Hibou57
@Hibou57 嗯,其实不是。至少没有行业标准的。 - RecursiveExceptionException

2

我使用自己的二进制格式。我尝试过使用现有的格式,但总是遇到限制。有些可以绕过,而其他一些则是无法解决的问题。

Collada可能值得一看。我不认为它作为一个3D引擎读取的格式很好。但作为一种通用的数据交换格式还是可以的。

http://www.collada.org/mediawiki/index.php/Main_Page


1

良好支持Collada,并提供与其他格式的良好转换器(这可能是最困难的部分)。这将为您提供最大的灵活性。请查看C4引擎


0
Collada很棒,但它更多地存在于3D应用程序方面。也就是说,它最适合用于在应用程序之间传输3D数据,而不是从游戏引擎内部加载3D数据。你有没有研究过Lua?它在游戏中被广泛使用,因为它是一种脚本语言,既非常快速(非常适合游戏),又非常灵活(可以用来表示引擎所需的任何数据)。

当然可以 :) 但是Lua可以表示矩阵,因此构建3D模型格式/解析器是可以完成的。 - Mathew
2
被投票否定 - 有些人会对任何问题回答“Lua”。 - BitTickler
@BitTickler 从技术上讲并没有错。你可以生成一个包含所需数据以跳过解析步骤的脚本;这与为资产生成C代码的想法相同。不确定这是否是个好主意,但它并非不可行。 - Cubic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接