跳转至

常见三维模型文件介绍

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)
Header是一系列以回车结束的文本行,用于描述文件的其余部分。Header包含每个元素类型的描述,包括元素的名称(例如:“edge”),对象中有多少这样的元素, 以及与元素相关的各种属性的列表。头文件还告诉文件是二进制文件还是ASCII文件。标题后面是每个元素类型的元素列表,按照标题中描述的顺序显示。
下面是多维数据集的完整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的基本组件。Header的每一部分都是一个以关键字开头的以回车结尾的ASCII字符串。甚至报头的开始和结束(“ply”和“end header”) 也是这种形式。字符“ply”必须是文件的前四个字符,因为它们充当了文件的神奇数字
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
这意味着属性“顶点索引”首先包含一个unsigned char,告诉属性包含多少索引,然后是一个包含多个整数的列表。这个变长列表中的每个整数都是顶点的索引。 注意,面列表按照TRIANGLE FAN的顺序生成三角形,而不是TRIANGLE STRIP。在上面的例子中,第一个面片
4 0 1 2 3
由三角形0,1,2和0,2,3组成而不是0,1,2,3和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 }
这个文件为每个顶点指定一个红色、绿色和蓝色的值。为了说明顶点索引的可变长度特性,对象的前两个面是三角形而不是单个正方形。这意味着物体的面数是7。 该对象还包含一个边列表。每条边都包含两个指向描述该边的顶点的指针。每条边都有一个颜色。上面定义的五条边是为了突出文件中的两个三角形。 前四条边是白色的,它们围绕着两个三角形。最后的边缘是黑色的,它是分割三角形的边

用户定义的元素

上面的例子展示了三个元素的使用:顶点、面和边。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
这个整数现在是文件中包含的材料列表的索引。对于新应用程序的作者来说,发明几个新元素存储在PLY文件中可能很有诱惑力。这种做法应该保持在最低限度。 更好的方法是尝试调整常见元素(顶点、面、边、材质)以适应新的用途,这样其他了解这些元素的程序在操作这些调整后的元素时可能会有用

评论