三维模型文件格式解读
最近接触到三维模型文件,发现格式五花八门的,这里做一个汇总和解读。
STL
简介
STL,全称为STereoLithography,译作:立体光刻,由3D System软件公司创立。但因三角网格形式的其特点,又可以翻译为“标准三角语言(Standard Triangle Language)”,“标准曲面细分语言(Standard Tessellation Language)”。
STL文件使用若干个非结构化的三角网格来记录三维实体信息。在笛卡尔坐标系中,每一个三角网格由三个顶点按照右手定则排序方式构成,同时按照右手定则记录一个与之对应的表面单位法线信息。文件记录的坐标信息是没有尺度的,计量单位为任意的。
文件格式
solid name
facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v3x v3y v3z
endloop
endfacet
endsolid name
在stl中,允许存在多个实体对象。通过 solid name
和 endsolid name
这一对关键词来描述一个实体对象。其中 name
是实体对象的名称,可以省略,因为通常一个stl文件只存一个实体对象。
solid name
……
endsolid name
在实体对象中,一般存在若干个面片(facet),通过facet
和 endfacet
这一对关键词来描述一个面片。而面片描述信息包括法向量(normal)信息,以及构成面片的三个顶点(vertex)。其中法向量使用 facet normal
,后接 nj nj nk
三个浮点数,表示法向量(\(n_i\), \(n_j\), \(n_k\))。面片的三个顶点通常要成组出现,使用outer loop
和 endloop
这对关键词来分割。顶点的坐标使用vertex
来描述,后接v1x v1y v1z
三个浮点数,表示坐标(\(v_{1x},v_{1y},v_{1z}\)) 。
facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v3x v3y v3z
endloop
endfacet
值得注意的是,在stl文件中,相邻的三角面片必须共享两个公共顶点。
上图左侧这种情形则违反了上述原则,应该表示为右侧这种。
PLY
简介
PLY, 全称为 Polygon file format,即使用多边形来记录三维模型的一种文件格式。其主要存储的是构成面片的多边形顶点三维坐标。可以存储颜色、透明度、表面法向量、材质等信息。
文件格式
ply
format ascii 1.0
comment这是一个正四面体
element vertex 4
property float x
property float y
property float z
element face 4
property list uchar int vertex_index
end_header
0 3 0
2.449 -1.0 -1.414
0 -1 2.828
-2.449 -1.0 -1.414
3 0 1 3
3 0 2 1
3 0 3 2
3 1 2 3
在ply文件中,内容可以分为档头和内容两部分,在档头中描述了当前文件所使用的格式、自定义元素类型和数量等信息。在内容中则根据档头所描述的类型进行数据记录。通常ply分成三部分:
- 档头
- 顶点元素列表
- 面元素列表
首先,以ply作为识别ply文件的标识
ply
然后,声明当前文件格式,以下三种都可以
format ascii 1.0
format binary_little_endian 1.0
format binary_big_endian 1.0
档头还支持一些注解,通过关键词 comment 定义:
comment This is a comment!
接着定义内容区中的元素。格式如下,即先通过element
关键词声明元素名称和数量,然后定义元素中各成员变量的类型和名称。
element <element name> <number in file>
property <data_type> <property name 1>
property <data_type> <property name 2>
property <data_type> <property name 3>
内定的成员变量类型包括:
- char、uchar
- short、ushort
- int、uint
- float、double
- list
如,定义一个包含12个顶点的物体,每个顶点使用3个单精度浮点数 (x,y,z)代表点的座标,使用3个unsigned char代表顶点颜色,颜色顺序为 (B, G, R),则档头的写法为:
element vertex 12
property float x
property float y
property float z
property uchar blue
property uchar green
property uchar red
再如,定义一个具有10个面的物体,写法为:
element face 10
property list uchar int vertex_indices
最后结束档头:
end_header
STP
to be continued ……