【问题标题】:Which 3D Model format should I be using?我应该使用哪种 3D 模型格式?
【发布时间】:2026-02-22 15:45:01
【问题描述】:

我正在编写一个游戏引擎,我想知道我应该使用/加载/导出哪种 3D 模型格式? Obj 看起来通用且简单,但它似乎也不可靠,因为那里的大多数模型都包含错误,并且它的存储量不如其他格式。

似乎有专门用于 MD2/3/5 等游戏的格式,但我不确定,如果我建模,我会使用wings3d,除了纯粹从格式加载我需要和支持的内容之外,我不知道还有什么其他细节我必须实施,例如我需要实施 IK 吗?我可以使用脚本化的每件动画而不是反向运动学和骨骼绑定吗?

【问题讨论】:

    标签: graphics model 3d collada


    【解决方案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 代码的想法相同。不确定这是否是个好主意,但并非不可信。