为什么要有那么多种 3D 格式?

STL、PLY、AMF、3MF、OBJ、FBX、DAE、VRML、X3D、IEGS、STEP、JT…… 目前已发布的 3D 格式文件数量,往少了说至少有二三十种。
如果我们打算写一个能同时处理这许多种 3D 格式的程序,要怎么做?
办法有很多种,但是直接扎到各种文件的文档(Specification)里面去抓取细节肯定是不对的。埋头猛干写出来的程序,往往由于缺少宏观取舍而疲于兼容各种特性,并时常处于面对未知情况的被动状态。再考虑到产品需求变更的情况,结局总是不稳定的程序表现、层出不穷的意外、举步维艰的项目进度以及经常加班、随时 on call 的泥淖。
这种焦头烂的忙碌是没有尽头的,或许直到有一天我们终于受不了了,问出了那个早就该问的问题:为什么要有这么多种不同的 3D 格式?
这是一个不可回避的问题,尽早回答它可以帮助我们对这几十种 3D 文件格式的特性和来龙去脉有一个整体把握,以“上帝视角”来设计我们的程序,夺回主动权。
通过对十多种最流行的 3D 格式做了一些调查,我发现大量规范和特性各异的 3D 格式共存的原因可以归纳于三点:

  1. 不同的应用领域孵化了少数简单但是理念各异的初始 3D 格式
  2. 不断产生的新需求导致了基于几种初始格式的衍变格式
  3. 组织之间的博弈造成解决同种需求的多种“竞争”格式共存

一、3D 文件主要应用领域及其初始需求

  • 1.1 工业设计领域的应用
    就像计算机技术先应用于军事领域一样,第一个通用的 3D 文件格式也是最先在军事领域中被广泛使用的,这个格式就是 IEGS。IGES 起源于美国空军的 ICAM 项目,其初衷是用于减少军事设备的设计方和各种生产商之间由于 CAD 系统不兼容而造成的沟通成本。1980 年美国国家标准局正式对外公布 IGES 格式后,它就被广泛用于工业设计领域。
    IGES 能在工业设计领域得到这么大范围的应用,是因为它采用的“曲面建模”的方案满足了高精度的要求。
    而所谓曲面建模,就是使用曲线来描述物体的表面。实际生活中物体表面往往有着复杂的曲线,为了精确地表示这些曲线,“分段的多项式公式”被采用。其中最成熟的一种方案为(Non-Uniform Rational B-Splines,非均匀有理B样条曲线)理论。 几乎所有的工业设计领域的 3D 文件格式都在使用 NURBS,它们可以归并到一个派系。
    曲面建模能够通过数学公式高精度地记录复杂的 3D 模型,但是也涉及到大量的数学计算,对于规则的 3D 模型来说显得有点多余。因此人们还设计了一种 CSG(Constructive Solid Geometry) 方案,通过简单模型(球、立方体等)的交并操作来制作出复杂的模型。虽然 CSG 也自成一系,但是这种方案实际被使用得并不多,所以本文不做过多讨论。
    NURBS 和 CSG 可以统称为一个 CAD 大类,主要面向工业设计。

  • 1.2 3D 打印领域的应用
    1987 年第一台 3D 打印机问世,STL 作为其默认文件格式被一同发布。 不同于高精度(precision)的曲面建模,STL 采用了近似(approximate)网格建模的方式。STL 通过一系列三角形来描述模型的表面,你可以想象成在一个 3D 物体表面贴满三角形的瓷砖,那些三角形瓷砖就是 STL 文件记录下来的模型样子。它和 3D 物体原本的形状不完全一样,但使用的瓷砖越小,记录的信息就越精确。
    网格建模的方式影响深远,也自成一个派系。
    总结来说,就是军事和工业领域对高精度的要求催生了适合复杂模型的曲面建模系和适合简单模型的 CSG 系,3D 打印催生了对精度要求不那么高的网格建模系。之后出现的其它 3D 模型,在核心理论上都没有变化,只是为了适应新的需求而新增特性而已。
    接下来,我们看看 3D 模型的需求都发生了什么样的变化以至于催生了那么多的 3D 格式。

二、3D 文件的需求变化

需求一直在变化,新的格式也随之出现。

  • 2.1 模型的外表
    最初的 3D 格式只是通过曲线和三角面记录了物体的形状,接着人们也希望能够存储物体的外表信息:这个物体是什么颜色的,触感怎么样,透明吗?于是就先后有了颜色、贴图和材质的概念。
    于是曲面建模系的 IGES 便添加了记录物体表面颜色信息的功能,而之后同派系的 STEP(1994) 和 JT(before 2007) 不仅支持颜色,也支持贴图和材质。
    网格建模系的 STL 并没有添加新的特性,但是新的格式 OBJ(befor 1990s) 和 PLY(1994) 都支持颜色、贴图和材质。此后新出现的格式也都默认支持这些。
  • 2.2 场景的概念
    3D 应用越来越广泛,3D 文件记录的模型也越来越复杂,而 3D 文件的体积(尤其对网格建模而言)也越来越大。为了节省资源,人们在 3D 文件中引入了 Instancing 的概念。何谓 Instancing ?即在多处使用同一个数据对象。举例来说,假如要记录 100 个立方体,原本的记录方式是 1 个立方体 8 个点 12 个三角面,100 个立方体总共 800 个点和 1200 个面。而使用 Instancing,我们只需要记录 1 个立方体的数据,这个数据称之为 Buffer,再创建 100 个对这个 Buffer 的引用。 而这些引用,通常被称为 Node。
    Instancing 是一个重大的思维突破,因为它把原始数据再抽象了一层,从而使人们可以做更多有趣的事情。后来人们不仅在 Node 中记录对 Buffer 的引用,也记录 Node 和 Node 之间的关系,Graph Scene 的雏形由此形成。
    90 年代中期之后出现的网格建模 3D 格式文件都支持了 Instancing,比如工业领域的 STEP 和 JT、3D 打印领域的 AMF 和 3MF、影视游戏领域的 FBX 和 DAE 以及 Web 领域的 VRML 和 X3D。
  • 2.3 灯光和天空盒
    从军事到工业再到 3D 打印,最后,3D 技术也应用到民用消费领域。在影视和游戏行业,人们追求更丰富的视觉效果,这不仅推动了材质系统的进化,也催生了灯光系统。而 Graph Scene 不仅简化了对 3D 数据的管理,也开拓了人们的思路,3D 格式文件不再是一个简单的 3D 模型文件,而是一个 3D 场景文件,一个 3D 场景中的任何信息都可以记录,包括灯光和天空盒。
    灯光可以理解为一个发光的光源,常见的即点光(灯泡)、锥形光(手电筒)和平行光(太阳)。天空盒可以理解为周边的环境,环境也会影响光线效果,比如在绿色的树林里,整体光线会带绿色。
    专门为影视和游戏而开发的 FBX 和 DAE 格式就已经能够保存灯光信息了。 而专为互联网 Web 而设计的 VRML 和 X3D 不仅支持灯光,还支持了天空盒。
    在此值得一提的是,CAD 系的 JT 也支持灯光。
  • 2.4 动画效果
    需求啊,总是得不到满足。在有了光影之后,人们不再满足于静止的模型,他们想要看到动画。我把动画分为两大类,四小类:位移动画和变形动画。位移动画即 3D 物体整体位置变化的动画,比如物体以规定速度从左边移动到右边(interpolate), 或者沿着粒子运动轨迹移动(particle)。变形动画即物体局部顶点位置变化的动画,比如骨骼(Skeleton)动画和形变(Morph)动画。前者通过骨骼操控顶点,文件中记录骨骼对顶点的影响权重以及骨骼自身的运动,后者直接记录每个顶点的运动。
    位移动画是比较简单的动画,可以通过变形动画模仿而来。
    FBX 和 DAE 支持两种变形动画,VRML 支持 interpolate,X3D 支持两种位移动画以及骨骼动画。
  • 2.5 物理系统
    模型动起来后,人们还是……不满足,因为这些动画只是模仿了现实世界中物体运动的轨迹,但是并没有模仿其物理系统。举个例子,一只往前走的小狗模型,可能会直接穿过对面走过来的小狗的身体。所以有些 3D 格式还支持了物理系统。
    我把物理系统划分为两个子系统:碰撞系统和运动系统。就像其名字所示,碰撞系统检测物体之间的体积碰撞,避免上面所说的穿过身体的情况,运动系统描述物体在受力情况下的运动状态,比如静止的物体受到的地心引力,抛一个球使其产生抛物线运动等。
    DAE 支持碰撞系统和运动系统,而 VRML 和 X3D 支持简单的碰撞检测。
  • 2.6 更多可定制需求
    以上五点为大部分 3D 文件格式所面对的主流的需求变化,此外一些 3D 格式也在具体的领域尝试解决一些个性化的需求,比如 PLY 相对于 OBJ 支持更多的元数据,AMF 支持曲面三角形从而大大减少同等精度下的文件体积,VRML 和 X3D 允许添加脚本自定义交互事件以迎合 Web 需求。从本文的角度来看,这些属于无关紧要的细节,就不去细说。

三、组织之间的博弈

有些 3D 文件之间的差异其实并不大,或者即使存在差异,也不成为非此即彼的替代品。有时候之所以同时存在功能类似的 3D 格式,是因为组织之间的博弈。以 AMF 和 3MF 为例,二者都立意要取代 STL 成为 3D 打印领域的新的通用格式,但是它们在主要功能上几乎一致。前者由 ASTM 在 2011 年提出,并急匆匆地在 2013 年就把自己挤入到 ISO 标准里面去了。然而业内大佬却不怎么鸟它。后者由微软在 2015 年提出,联合了几乎业内所有的大佬(Autodesk, Siemens, HP etc.),气势汹汹。再比如 FBX 和 DAE,核心功能差不多,但一个是 Autodesk 的闭源格式,一个是 Khronos 的开源格式。

总结

3D 文件格式虽说有那么多种,但其核心的设计思想起源于 1980s 的工业设计领域的 IGES 和 3D 打印领域的 STL。前者为 CAD 系 NURBS 曲面建模的代表,后者为 Mesh 网格建模的代表。之后 3D 技术的应用领域不断拓展,又出现了影视游戏领域和 Web 领域的应用,但 3D 文件的技术主脉还是曲面建模和网格建模。
在满足基本的记录模型数据需求之后,又出现了记录外表信息、场景信息、灯光信息、动画信息和物理系统信息的需求。为了满足这些需求:

  1. CAD 领域又出现了 STEP(1994) 以支持外表信息和 JT(2007) 以支持外表、Instancing 和灯光信息;
  2. 3D 打印领域出现了 OBJ(before 1990s) 以支持外表信息以及 AMF(2011) 和 3MF(2015) 以支持 Instancing 和其它适用于 3D 打印领域的功能;
  3. 影视游戏领域出现了 FBX(1996) 和 DAE(2004),前者除了物理系统,其它各类需求都有较大程度的支持,后者作为开源文件格式的代表,几乎支持所有的需求;
  4. Web 领域出现了 VRML(1995) 和其接力者 X3D(2001)。后者除了形变动画和运动系统,对其它的需求都有很高的支持度。

当然,3D 文件格式不只是文中所举例的这几种,我只是选择了最流行的十二种。需求也不只是这五类,但这五类是最主流的需求。我们在此处不去深究细节,关键是建立一种全局感。