我应该使用哪种 3D 模型格式?
Posted
技术标签:
【中文标题】我应该使用哪种 3D 模型格式?【英文标题】:Which 3D Model format should I be using? 【发布时间】:2010-10-09 01:13:55 【问题描述】:我正在编写一个游戏引擎,我想知道我应该使用/加载/导出哪种 3D 模型格式? Obj 看起来通用且简单,但它似乎也不可靠,因为那里的大多数模型都包含错误,并且它的存储量不如其他格式。
似乎有专门用于 MD2/3/5 等游戏的格式,但我不确定,如果我建模,我会使用wings3d,除了纯粹从格式加载我需要和支持的内容之外,我不知道还有什么其他细节我必须实施,例如我需要实施 IK 吗?我可以使用脚本化的每件动画而不是反向运动学和骨骼绑定吗?
【问题讨论】:
【参考方案1】:Collada 是 Khronos 组(OpenGL 标准机构)拥有的基于 XML 的开放式 3d 模型格式
来自 Collada.org 常见问题解答:
COLLADA 1.4.x 功能集包括:
网格几何 变换层次结构(旋转、平移、剪切、缩放、矩阵) 效果 着色器(Cg、GLSL、GLES) 材料 纹理 灯 相机 剥皮 动画 物理(刚体、约束、布娃娃、碰撞、体积) 实例化 技术 多重表示 资产 用户数据【讨论】:
我不会将这种格式用于实时图形。 Collada 旨在作为图形制作管道的中间格式。使用它来转换为更紧凑的二进制格式,否则您将整天等待它加载。 还要考虑到并非所有工具都支持整个 COLLADA 功能集。 最后,我使用 ASSIMP 库进行几何加载,因此只要支持必要的属性,任何人都可以使用他们喜欢的东西 解析 Collada 与您的解析器一样好。我仍然同意它更像是一种管道格式并且包含太多信息,游戏引擎可能不需要这些信息。由于 Collada 是文本,所以它的压缩比非常好。另一件重要的事情是已经提到的事实,即它是由 Khronos 开发和维护的。由于信息的存储方式,这导致 Collad 文件和 OpenGL 之间的过渡非常平滑(使用 VBO 与交错数组相结合会大大提高性能)。顺便说一句,ASSIMP 仅支持 1.4,加载 1.5 会导致异常。 collada 对于实际应用来说过于通用的一个很好的例子是,例如Vulkan 不支持四边形,但 collada 可以毫无问题地包含基于四边形的资产。因此,要克服这一点,您需要预见 collada 文档中可能包含的内容,然后将其转换为应用程序可以处理的格式。这可能需要大量工作......而且可能也是投机性的。【参考方案2】:在担心您想要支持哪些 3D 格式之前,我认为您应该真正关注您计划在引擎中实现哪些功能。把这些写下来作为要求,并从列表中选择支持最多功能的格式......因为你想展示你的引擎(我假设你计划让你的引擎公开可用)。如果您的引擎具有特定功能(这对于游戏引擎来说总是一件好事),您甚至可能想要推出自己的格式。
之后,尽可能多地支持流行的格式(.X、.3DS、.OBJ、.B3D)...您的引擎越容易访问,就越有人愿意使用它!
Collada 是一种很好的通用格式,但就像 Nils 提到的那样,它不是最终部署的理想格式。
【讨论】:
【参考方案3】:我使用自己的二进制格式。我尝试使用现有格式,但总是遇到限制。有些可以解决,有些可以解决。
Collada 可能值得一看。我不认为它作为 3D 引擎可以读取的格式那么好。不过,它可以作为一般的数据交换格式。
http://www.collada.org/mediawiki/index.php/Main_Page
【讨论】:
【参考方案4】:+1 为科拉达。您可能还需要一个自定义的原生二进制格式以实现真正的快速加载(通常只是顶点/索引缓冲区数据的二进制转储,加上材质和骨架数据,以及适当的碰撞数据)。
游戏行业的一个趋势是支持在引擎的开发人员构建中加载像 collada 这样的格式,但也有一个工具链可以导出优化版本以供发布。开发者版本可以动态更新网格,因此当艺术家保存更改时,文件会自动重新加载,允许他们(几乎)即时查看模型的所见即所得,但仍提供完全优化的发布格式。
【讨论】:
关于原生二进制格式,值得注意的是已经有一个标准的Binary XML格式:en.wikipedia.org/wiki/Binary_XML @Hibou57 好吧,不是真的。无论如何都不是行业标准【参考方案5】:很好地支持 Collada,然后为其他格式提供良好的转换器(这可能是困难的部分)。这将为您提供最大的灵活性。看看C4 engine
【讨论】:
【参考方案6】:Collada 很棒,但它更多地体现在 3D 应用方面。即它最适合用于在应用程序之间传输 3D 数据,而不是从游戏引擎中加载 3D 数据。你有没有研究过Lua?它被广泛用于游戏中,因为它是一种脚本语言,既快得离谱(非常适合游戏)又非常灵活(可用于表示引擎所需的任何数据)。
【讨论】:
当然 :) 但是 Lua 可以表示矩阵,所以构建 3D 模型格式/解析器是可以完成的事情 投了反对票 - 有些人用“Lua”回答他们发现的任何问题。 @BitTickler 从技术上讲没有错。您可以只生成一个已经包含您需要跳过解析步骤的数据的脚本;与为资产生成 C 代码的想法相同。不确定这是否是个好主意,但并非不可信。以上是关于我应该使用哪种 3D 模型格式?的主要内容,如果未能解决你的问题,请参考以下文章