最近接触到三维模型文件,发现格式五花八门的,这里做一个汇总和解读。
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,即使用多边形来记录三维模型的一种文件格式。其主要存储的是构成面片的多边形顶点三维坐标。可以存储颜色、透明度、表面法向量、材质等信息。
文件格式
plyformat ascii 1.0comment这是一个正四面体element vertex 4property float xproperty float yproperty float zelement face 4property list uchar int vertex_indexend_header0 3 02.449 -1.0 -1.4140 -1 2.828-2.449 -1.0 -1.4143 0 1 33 0 2 13 0 3 23 1 2 3
在ply文件中,内容可以分为档头和内容两部分,在档头中描述了当前文件所使用的格式、自定义元素类型和数量等信息。在内容中则根据档头所描述的类型进行数据记录。通常ply分成三部分:
- 档头
- 顶点元素列表
- 面元素列表
首先,以ply作为识别ply文件的标识
ply
然后,声明当前文件格式,以下三种都可以
format ascii 1.0format binary_little_endian 1.0format 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 12property float xproperty float yproperty float zproperty uchar blueproperty uchar greenproperty uchar red
再如,定义一个具有10个面的物体,写法为:
element face 10property list uchar int vertex_indices
最后结束档头:
end_header
STP
to be continued ……
IGS
OBJ
DXF
参考资料
-
https://zh.wikipedia.org/wiki/STL_(檔案格式)
-
https://windsong.top/STL与蒙特卡罗/#stl文件
-
https://zh.wikipedia.org/wiki/PLY
-
https://en.wikipedia.org/wiki/ISO_10303-21
-
如何理解STP格式和STL格式?
-
3D软件格式及转换