三维模型常见文件格式解读

最近在调试从 OGG 争取来的 OCCT 工具库,项目很大很多,需要重点关注的是样条方面的数据结构与可视化过程,所以需要对三维模型文件格式有一个比较全面的了解,这里记录一下。

离散型网格文件

.obj 格式

.obj 格式是一种非常常见的三维模型文件格式,它是一种文本文件,可以用文本编辑器打开查看。.obj 文件由一系列的顶点、法向量、纹理坐标、面片等信息组成,可以用来描述三维模型的几何信息。

以下是一个简单的 .obj 文件的示例,素材来源于 Blender 刚打开初始化的那个长方体:

box

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Blender 3.6.0
# www.blender.org
mtllib untitled.mtl
o Cube
v 1.000000 1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 -1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 1.000000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vt 0.625000 0.500000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.125000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
s 0
usemtl Material
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/4/2 7/6/2 8/7/2
f 8/8/3 7/9/3 5/10/3 6/11/3
f 6/12/4 2/13/4 4/5/4 8/14/4
f 2/13/5 1/1/5 3/4/5 4/5/5
f 6/11/6 5/10/6 1/1/6 2/13/6

.obj 文件中的关键字解释如下:

  • v:顶点坐标,后面跟着三个浮点数,分别表示 x、y、z 坐标。
  • vn:法向量,后面跟着三个浮点数,分别表示 x、y、z 分量。
  • vt:纹理坐标,后面跟着两个浮点数,分别表示 u、v 坐标。
  • f:面片,后面跟着一系列的顶点、纹理坐标、法向量索引,用空格分隔。
  • mtllib:指定了 .obj 文件所使用的 .mtl 材质文件。
  • usemtl:指定了当前面片使用的材质。
  • o:指定了当前对象的名称。
  • s:指定了当前面片的光滑度。
  • #:注释。

.obj 文件的优点是简单易读,可以用文本编辑器打开查看,缺点是文件体积较大,不适合存储大型模型。

.stl 格式

.stl 格式是一种非常常见的三维模型文件格式,它是一种二进制文件,可以用文本编辑器打开查看。.stl 文件由一系列的三角面片组成,可以用来描述三维模型的几何信息。

以下是一个局部的 .stl 文件的示例,素材来源于 OGG 提供的示例文件:

stl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

solid
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -3.835604e+001 4.000000e+001 5.000000e+000
vertex -3.500000e+001 4.000000e+001 5.000000e+000
vertex -3.825433e+001 4.082325e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -3.796576e+001 4.157218e+001 5.000000e+000
vertex -3.825433e+001 4.082325e+001 5.000000e+000
vertex -3.500000e+001 4.000000e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -3.751522e+001 4.222193e+001 5.000000e+000
vertex -3.796576e+001 4.157218e+001 5.000000e+000
vertex -3.500000e+001 4.000000e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 0.000000e+000
outer loop
vertex -3.500000e+001 4.000000e+001 5.000000e+000
vertex -3.500000e+001 4.000000e+001 5.000000e+000
vertex -3.751522e+001 4.222193e+001 5.000000e+000
endloop
endfacet

…………

facet normal -8.394186e-001 -5.339682e-001 1.012636e-001
outer loop
vertex -3.654791e+000 -2.232829e+001 1.506994e+001
vertex -3.472693e+000 -2.253296e+001 1.550017e+001
vertex -3.634998e+000 -2.228172e+001 1.547959e+001
endloop
endfacet
facet normal -9.920555e-001 -1.101957e-001 6.068647e-002
outer loop
vertex -3.248115e+000 -2.305226e+001 1.596400e+001
vertex -3.192187e+000 -2.331202e+001 1.640660e+001
vertex -3.228217e+000 -2.300579e+001 1.637365e+001
endloop
endfacet
facet normal -7.491103e-001 -6.531716e-001 1.104562e-001
outer loop
vertex -3.595415e+000 -2.218857e+001 1.629888e+001
vertex -3.575624e+000 -2.214199e+001 1.670853e+001
vertex -3.793561e+000 -2.196399e+001 1.628306e+001
endloop
endfacet
endsolid


.stl 文件中的关键字解释如下:

  • solid:开始一个实体。
  • facet:开始一个面片。
  • normal:法向量,后面跟着三个浮点数,分别表示 x、y、z 分量。
  • vertex:顶点坐标,后面跟着三个浮点数,分别表示 x、y、z 坐标。
  • endfacet:结束一个面片。
  • endsolid:结束一个实体。

连续性曲面文件(样条)

.igs 格式

.igs 格式相对更抽象一点,是经过二进制编码后的文件,直接读取会比较难以理解。

以下是一个局部的 .igs 文件的示例,素材来源于 OGG 提供的示例文件:
title

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

S0000001
,,31HOpen CASCADE IGES processor 7.7,13HFilename.iges, G0000001
16HOpen CASCADE 7.7,31HOpen CASCADE IGES processor 7.7,32,308,15,308,15,G0000002
,1.,2,2HMM,1,0.01,15H20240617.113232,1E-07,4.75,10Hjingouyang,,11,0, G0000003
15H20240617.113232,; G0000004
402 1 0 0 0 0 0 000000000D0000001
402 0 0 1 1 0D0000002
144 2 0 0 0 0 0 000020000D0000003
144 0 0 1 0 0D0000004
128 3 0 0 0 0 0 000010000D0000005
128 0 0 8 0 0D0000006
144 11 0 0 0 0 0 000020000D0000007
144 0 0 1 0 0D0000008
128 12 0 0 0 0 0 000010000D0000009
128 0 0 9 0 0D0000010
144 21 0 0 0 0 0 000020000D0000011
144 0 0 1 0 0D0000012
128 22 0 0 0 0 0 000010000D0000013
128 0 0 9 0 0D0000014
144 31 0 0 0 0 0 000020000D0000015
144 0 0 1 0 0D0000016
128 32 0 0 0 0 0 000010000D0000017
128 0 0 10 0 0D0000018
402,4,3,7,11,15; 0000001P0000001
144,5,0,0,0; 0000003P0000002
128,7,1,7,1,0,0,1,0,0,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1., 0000005P0000003
1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 0000005P0000004
1.,3.35,0.,0.849996,2.559427,0.,1.054531,2.929184,0.,0.941173, 0000005P0000005
2.224526,0.,1.073673,2.220989,0.,0.961562,1.938224,0.,0.984595, 0000005P0000006
1.850238,0.,0.919101,1.85,0.,0.85,3.095665,3.32,0.849997, 0000005P0000007
2.410502,3.32,1.02726,2.730958,3.32,0.929017,2.120255,3.32, 0000005P0000008
1.04385,2.117188,3.32,0.946687,1.872126,3.32,0.966649,1.795871, 0000005P0000009
3.32,0.909887,1.795665,3.32,0.85,0.,1.,0.,1.; 0000005P0000010
144,9,0,0,0; 0000007P0000011
128,8,1,8,1,0,0,1,0,0,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1., 0000009P0000012
1.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 0000009P0000013
1.,1.,1.,1.,1.,1.85,0.,0.85,1.849719,0.,0.768313,2.139104,0., 0000009P0000014
0.762186,2.558659,0.,0.687658,2.970672,0.,0.840485,2.512594,0., 0000009P0000015
0.706025,3.174499,0.,0.87293,3.190143,0.,0.85,3.35,0.,0.849996, 0000009P0000016
1.795665,3.32,0.85,1.795421,3.32,0.779205,2.046222,3.32, 0000009P0000017
0.773895,2.409836,3.32,0.709303,2.766914,3.32,0.841754,2.369913, 0000009P0000018
3.32,0.725222,2.943564,3.32,0.869873,2.957123,3.32,0.85, 0000009P0000019
3.095665,3.32,0.849997,0.,1.,0.,1.; 0000009P0000020
144,13,0,0,0; 0000011P0000021
128,7,1,7,1,0,0,1,0,0,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1., 0000013P0000022
1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 0000013P0000023
1.,3.095665,3.32,0.849997,2.410502,3.32,1.02726,2.730958,3.32, 0000013P0000024
0.929017,2.120255,3.32,1.04385,2.117188,3.32,0.946687,1.872126, 0000013P0000025
3.32,0.966649,1.795871,3.32,0.909887,1.795665,3.32,0.85, 0000013P0000026
2.487043,4.75,1.180139,2.197166,4.75,1.255135,2.332744,4.75, 0000013P0000027
1.213571,2.074369,4.75,1.262154,2.073072,4.75,1.221047,1.969392, 0000013P0000028
4.75,1.229492,1.93713,4.75,1.205477,1.937043,4.75,1.180141,0., 0000013P0000029
1.,0.,1.; 0000013P0000030
144,17,0,0,0; 0000015P0000031
128,8,1,8,1,0,0,1,0,0,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1., 0000017P0000032
1.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 0000017P0000033
1.,1.,1.,1.,1.,1.795665,3.32,0.85,1.795421,3.32,0.779205, 0000017P0000034
2.046222,3.32,0.773895,2.409836,3.32,0.709303,2.766914,3.32, 0000017P0000035
0.841754,2.369913,3.32,0.725222,2.943564,3.32,0.869873,2.957123, 0000017P0000036
3.32,0.85,3.095665,3.32,0.849997,1.937043,4.75,1.180141,1.93694, 0000017P0000037
4.75,1.150189,2.043048,4.75,1.147942,2.196885,4.75,1.120615, 0000017P0000038
2.347956,4.75,1.176652,2.179994,4.75,1.12735,2.422693,4.75, 0000017P0000039
1.188548,2.428429,4.75,1.180141,2.487043,4.75,1.180139,0.,1.,0., 0000017P0000040
1.; 0000017P0000041
S 1G 4D 18P 41 T0000001

.igs 文件中的关键字解释如下:

  • 最后一列由二进制编码而来,用于定义该行元素类型
  • 第一行往往为空行,第二行的最后一列元素含有 S 定义为开始段
  • 接下来四行是文件头,包括版本信息、文件名等静态信息 ,最后一列元素含有 G 定义为全局段
  • 中间部分是实体索引,各个元素通过空格相区分,包括实体类型、实体索引等,以第一行为例,402 表示实体类型,1 表示实体索引,最后一列元素含有 D 定义为数据段
  • 文件后半部分是数据参数,各数据元素通过逗号相互区分,以该段第一行为例,402,4,3,7,11,15; 表示实体类型为 402,后面的数字表示实体的索引,最后一列元素含有 P 定义为参数段
  • 最后一行用于定义各个环节的结束,S 1G 4D 18P 41 表示开始段、全局段、数据段、参数段、结束段分别占用的行数