常见三维模型文件介绍
OBJ¶
Obj文件格式是一种简单的单独表示3D几何图元的文件格式——也就是,顶点的坐标,每个顶点纹理的UV坐标,顶点法向量,以及组成多边形的面的顶点坐标、以及纹理UV坐标序列。 面的顶点默认为逆时针顺序,法向量不是必须的。OBJ文件并非归一化的,但是可以在注释中加入缩放信息。
STL¶
STL文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式,是最多快速原型系统所应用的标准文件类型。
PLY¶
介绍¶
PLY(Polygon File Format,多边形文件格式),是一种用于存储描述多边形集合的图形对象的格式。是一种简单且易于实现的格式,但这种格式足够通用,
可以用于广泛的模型。该文件格式有两个子格式:用于方便入门的ASCII表示,以及用于紧凑存储和快速保存和加载的二进制版本。
PLY格式将对象描述为顶点、面和其他元素的集合,以及可以附加到这些元素的颜色和法线方向等属性。一个PLY文件只包含一个对象的描述。
这些对象的来源包括:手工数字化对象、建模程序中的多边形对象、距离数据、行进立方体中的三角形(体数据中的等值面)、地形数据、辐射模型。
可能与对象一起存储的属性包括:颜色、表面法线、纹理坐标、透明度、范围数据置信度和差异
PLY格式并不是一种通用的场景描述语言,一种着色语言或一种万能的建模格式。这意味着它不包括转换矩阵、对象实例化、建模层次结构或对象子部分。
它不包括参数化的补丁,二次曲面,建设性的实体几何操作,三角形带,带孔的多边形,或纹理描述(不要与纹理坐标混淆,它是支持的!)
典型的PLY对象定义就是顶点的(x,y,z)三元组列表和顶点列表中的索引所描述的面列表。大多数PLY文件都包含这个核心信息。顶点和面是“元素”的两个例子,
而PLY文件的主体是它的元素列表。给定文件中的每个元素都有固定数量的“属性”,这些属性是为每个元素指定的。PLY文件中的典型信息只包含两个元素,
顶点的(x,y,z)三元组和每个面的顶点索引
应用程序可以创建附加到对象元素的新属性。例如,属性红色、绿色和蓝色通常与顶点元素相关。新属性的添加方式使旧程序在遇到这些新属性时不会中断。
程序不能理解的属性可以不解释地携带,也可以丢弃。此外,还可以创建新的元素类型,并定义与该元素相关的属性。新元素的例子有边、
单元格(指向面的指针列表)和材质
文件结构¶
这是一个典型的PLY文件的结构
Header
Vertex List
Face List
(lists of other elements)
下面是多维数据集的完整ASCII描述。同一个对象的二进制版本的报头的不同之处仅在于用“二进制小端”或“二进制大端”代替“ascii”。 括号中的注释不是文件的一部分,它们是这个示例的注释。文件中的注释是普通的关键字标识的行,以单词“comment”开头
ply
format ascii 1.0 { ascii/binary, format version number }
comment made by Greg Turk { comments keyword specified, like all lines }
comment this file is a cube
element vertex 8 { define "vertex" element, 8 of them in file }
property float x { vertex contains float "x" coordinate }
property float y { y coordinate is also a vertex property }
property float z { z coordinate, too }
element face 6 { there are 6 "face" elements in the file }
property list uchar int vertex_index { "vertex_indices" is a list of ints }
end_header { delimits the end of the header }
0 0 0 { start of vertex list }
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3 { start of face list }
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
Header的开头后面是关键字“format”和ASCII或二进制格式的规范,后面是版本号。接下来是多边形文件中每个元素的描述,在每个元素描述中是属性的说明。 通用元素描述具有这种形式
element
property
property
property
...
name | type | number of bytes |
---|---|---|
char | character | 1 |
uchar | unsigned character | 1 |
short | short integer | 2 |
ushort | unsigned short integer | 2 |
int | integer | 4 |
uint | unsigned integer | 4 |
float | single-precision float | 4 |
double | double-precision float | 8 |
这些字节数很重要,而且为了使这些文件具有可移植性,不能在不同的实现中变化。有一种特殊形式的属性定义使用列表数据类型
property list
property list uchar int vertex_index
4 0 1 2 3
另一个例子¶
ply
format ascii 1.0
comment author: Greg Turk
comment object: another cube
element vertex 8
property float x
property float y
property float z
property uchar red { start of vertex color }
property uchar green
property uchar blue
element face 7
property list uchar int vertex_index { number of vertices for each face }
element edge 5 { five edges in object }
property int vertex1 { index to first vertex of edge }
property int vertex2 { index to second vertex }
property uchar red { start of edge color }
property uchar green
property uchar blue
end_header
0 0 0 255 0 0 { start of vertex list }
0 0 1 255 0 0
0 1 1 255 0 0
0 1 0 255 0 0
1 0 0 0 0 255
1 0 1 0 0 255
1 1 1 0 0 255
1 1 0 0 0 255
3 0 1 2 { start of face list, begin with a triangle }
3 0 2 3 { another triangle }
4 7 6 5 4 { now some quadrilaterals }
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0
0 1 255 255 255 { start of edge list, begin with white edge }
1 2 255 255 255
2 3 255 255 255
3 0 255 255 255
2 0 0 0 0 { end with a single black line }
用户定义的元素¶
上面的例子展示了三个元素的使用:顶点、面和边。PLY格式还允许用户定义自己的元素。定义新元素的格式与定义顶点、面和边的格式完全相同。下面是标题中定义material属性的部分
element material 6
property ambient_red uchar { ambient color }
property ambient_green uchar
property ambient_blue uchar
property ambient_coeff float
property diffuse_red uchar { diffuse color }
property diffuse_green uchar
property diffuse_blue uchar
property diffuse_coeff float
property specular_red uchar { specular color }
property specular_green uchar
property specular_blue uchar
property specular_coeff float
property specular_power float { Phong power }
property material_index int