以下是计算机图形学中一些常见的模型格式:

​一、OBJ格式​

  • 特性​​:

    • 这是一种文本格式的3D模型文件格式,易于阅读和编辑。它主要存储模型的顶点、面(通常为三角形面)、纹理坐标、法线等信息。例如,一个简单的立方体模型在OBJ文件中会以明确的文本形式列出各个顶点的坐标,以及每个面由哪些顶点组成。

    • 它不支持动画,主要用于存储静态的3D模型数据。

  • 应用场景​​:常用于简单的3D模型交换,如在独立的3D建模软件之间共享静态模型。在一些需要快速查看模型基本结构的情况下也很有用,比如初学者在学习3D建模时,OBJ格式的模型可以方便地被各种查看器打开。

# 立方体模型(顶点、面、纹理坐标)
mtllib cube.mtl       # 关联材质文件(可选)
v 1.0 1.0 1.0         # 顶点坐标(v:vertex),共8个顶点
v -1.0 1.0 1.0
...(其他6个顶点)
vt 0.625 0.5          # 纹理坐标(vt:texture vertex),共4个(对应一张纹理的四个角)
vt 0.875 0.5
...
vn 0.0 0.0 1.0        # 法线(vn:vertex normal),共6个(每个面一个法线)
vn 0.0 0.0 -1.0
...
usemtl CubeMaterial   # 指定当前使用的材质(来自cube.mtl)
f 1/1/1 2/2/1 3/3/1   # 面定义(f:face),格式为“顶点索引/纹理索引/法线索引”
f 1/1/1 3/3/1 4/4/1   # 每个面由3个顶点组成(三角形面)

​二、FBX格式​

  • 特性​​:

    • 是一种二进制格式的3D模型文件格式,由Autodesk开发。它支持多种数据类型,包括网格、骨骼动画、材质、纹理、约束等。这使得它非常适合用于存储复杂的3D模型,尤其是在游戏开发和动画制作领域。

    • FBX文件可以包含场景层次结构,能够准确地表示模型的各个部分之间的关系。例如,在一个角色模型中,骨骼与肌肉、皮肤之间的绑定关系可以在FBX文件中完整地保存下来。

    • 场景层级​​:根节点下包含“角色”子节点,子节点下有“骨骼”(如Bone_01Bone_02)和“网格”(Mesh_HumanBody)。

    • 网格数据​​:顶点坐标、法线、UV纹理坐标,以及每个顶点绑定的骨骼索引和权重(如顶点1受Bone_01影响权重0.7,受Bone_02影响权重0.3)。

    • 动画数据​​:包含“行走循环”动画(Animation_Walk),记录骨骼在时间轴上的变换(如第0帧时Bone_01旋转0度,第30帧时旋转30度)。

    • 材质与纹理​​:关联外部纹理文件(如diffuse.pngnormal_map.jpg),定义材质的漫反射颜色、粗糙度等属性。

  • ​应用场景​​:广泛应用于游戏引擎(如Unity、Unreal Engine等)、动画制作软件(如Maya、3ds Max等)之间的模型交换。在游戏的角色模型导入、动画导入等场景中,FBX格式能够确保模型的各种信息完整无误地传输。

​三、STL格式(Stereolithography)​

  • 特性

    • 主要用于表示3D模型的表面几何形状,通常以三角形面(面片)来构建模型。它只存储模型的几何信息,不包含颜色、材质、纹理等其他信息。

    • 有二进制和ASCII两种表示形式,二进制形式更为紧凑,文件大小较小。以下是ASCII版齿轮的简化内容:

solid Gear           # 模型名称
  facet normal 0.0 0.0 1.0  # 三角形面的法线(指向外侧)
    outer loop
      vertex 0.0 0.0 0.5    # 三角形的三个顶点坐标
      vertex 10.0 0.0 0.5
      vertex 5.0 5.0 0.5
    endloop
  endfacet
  ...(重复数百个三角形面,覆盖齿轮表面)
endsolid Gear
  • 应用场景:在3D打印领域被广泛应用,因为3D打印机主要关注的是模型的几何形状,STL格式能够满足其输入要求。同时,它也常用于计算机辅助制造(CAM)等领域。

​四、PLY格式(Polygon File Format)​

  • 特性​​:

    • 可以存储多种类型的元素,如顶点、面、边等,并且可以为每个元素添加属性,例如顶点的颜色、法线等。它支持三角形面、四边形面等多种面的类型。

    • 有二进制和ASCII两种编码方式,二进制编码的PLY文件在存储大型模型时效率更高。

  • 应用场景​​:在计算机图形学的科研领域以及一些需要对模型顶点属性进行更多控制的应用中使用,如在3D扫描数据的处理中,PLY格式可以方便地存储扫描得到的点云数据及其相关的属性信息。

  • 一个人脸扫描的PLY文件头和部分数据如下:

ply                # PLY文件标识
format binary_little_endian 1.0  # 二进制格式,小端序
element vertex 500000  # 50万个顶点
property float x       # 顶点x坐标
property float y       # 顶点y坐标
property float z       # 顶点z坐标
property uchar red     # 顶点颜色(RGB)
property uchar green
property uchar blue
property float nx      # 顶点法线x分量
property float ny
property float nz
element face 1000000   # 100万个三角形面
property list uchar int vertex_index  # 每个面的顶点索引列表长度(3)+ 三个顶点索引
end_header
[二进制数据:50万个顶点的坐标、颜色、法线,随后是100万个面的顶点索引]

五、GlTF格式(GL Transmission Format)​和 GLB(GL Binary) 具体对比文章链接

  • 是JSON描述符+二进制数据的组合,适合Web高效加载。一个沙发模型的glTF文件结构如下:

  • GLB 是 glTF 的​​二进制封装格式​​,将 glTF 的 JSON 内容、.bin二进制数据、纹理图片等所有资源​​打包成一个单一的二进制文件​​(.glb后缀)。

{
  "scenes": [{"nodes": [0]}],  # 场景包含节点0(沙发)
  "nodes": [{"mesh": 0}],       # 节点0关联网格0
  "meshes": [{
    "primitives": [{
      "attributes": {"POSITION": 0, "NORMAL": 1},  # 顶点位置(索引0)和法线(索引1)在buffer中的偏移
      "indices": 2,                               # 三角形索引在buffer中的偏移(索引2)
      "material": 0                               # 关联材质0
    }]
  }],
  "materials": [{
    "pbrMetallicRoughness": {
      "baseColorFactor": [0.8, 0.5, 0.2, 1.0],  # 橙色(RGBA)
      "roughnessFactor": 0.3                    # 粗糙度
    }
  }],
  "buffers": [
    {"uri": "sofa.bin", "byteLength": 102400}   # 二进制数据存储顶点坐标、法线、索引
  ]
}
  • 应用场景​​:在WebGL应用、虚拟现实(VR)和增强现实(AR)的Web端应用中广泛使用。例如,在浏览器中展示3D产品模型或者交互性的3D艺术作品时,glTF格式能够提供较好的性能。

六、3DS格式​

3DS是二进制格式,早期用于3ds Max的基础模型交换,结构较简单。一个包含茶壶、灯光和相机的3DS文件可能包含:

  • 对象数据​​:茶壶的网格顶点坐标(限制为最多65536个顶点)、面信息(三角形或四边形)。

  • 灯光参数​​:点光源的位置(x,y,z)、颜色(RGB)、强度(如强度值100)。

  • 相机参数​​:相机的位置、目标点(看向的坐标)、视野角度(如60度)。

  • 应用场景​​:主要在3ds Max软件内部使用,以及在与其他支持3DS格式的软件进行有限的数据交换时使用。例如,在3ds Max制作的简单模型需要在其他软件中进行查看或初步编辑时,3DS格式可以作为一种中间格式。

​七、DAE格式(Collada)​

  • 特性​​:

    • 是一种基于XML(Extensible Markup Language)的开放格式,旨在实现3D资产在不同软件之间的交换。它可以存储场景、几何、材质、动画等多种信息。

    • 支持多种3D图形API,如OpenGL、DirectX等。

  • 应用场景​​:在不同的3D建模软件、游戏引擎和图形渲染工具之间进行模型和场景的交换。例如,一个设计师使用Blender创建了一个模型,想要在另一个游戏引擎中使用,DAE格式可以作为一个中间桥梁来传输模型数据。