当前位置: 首页 > 工具软件 > ply > 使用案例 >

点云ply格式文件详解

金子轩
2023-12-01

  PLy多边形文件格式,又被称作斯坦福三角形格式,它是一种为了储存计算机多边形图形集对象的格式。它即简单执行又是一个通用程度较高的格式。Ply文件有两种子格式ASCII和二进制形式,ASCII具有简单易操作的特点,二进制拥有读写紧凑的特点。

概要:典型的PLY格式只有xyz的三元列表和一个顶点列表中的索引所描述的面列表,多数PLY文件都包含这两种核信息。顶点和面是元素的两个示例,PLY文件的主体是它的元素列表。在所给的文件中每一元素都有固定的数值的属性,这些属性是为每个元素指定的。PlY种典型信息仅包含两种元素,顶点的xyz和每个面的顶点索引。应用可以新建附加属性在对象的元素上。例如,红绿蓝属性常常可以附加在顶点元素上。新的属性和旧的程序遭遇时上不会中断则新的属性可以被添加。不被程序所理解的属性也可以携带或者丢弃。此外,可以创建新的元素类型并且定义与该元素关联的属性。可以创建新的边界,材质和细胞元素。同样,新的元素在不被程序理解的情况下,也可以选择性的携带或者丢弃。

文件结构:

典型的PLY文件结构如下:

Header

    Vertex List

    Face List

(lists of other elements)

Header 是一系列以回车结尾的文本行,描述文件的剩余部分。Header包含对每一个元素类型的描述、包含元素的名称、在对象中素的数量和与元素相关联的各种属性的列表。Header也告诉了文件属于ASCII编码还是二进制编码。Header下面是每个元素类型的元素列表,按照header中的顺序显示。

下面是对一个立方体的完整ASCII描述。二进制header版本对同一对象的描述只有一处不同,就是将“binary_little_endian”或者“binary_big_endian”替换成“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文件的开头后面是关键字“formate”和ASCII或者二进制的规范,后面是版本号。接着是多边形文件中每一个元素的描述,在每个元素描述中是属性的规范。通常元素描述的形式是:

element  
property  
property  
property 
在“element”行之后列出的属性定义了属性的数据类型,以及每个元素的属性出现的顺序。属性可以具有两种数据类型:标量和列表。下面是一个属性可能具有的标量数据类型列表: 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

这意味着属性"vertex_index"首先包含一个无符号字符,说明该属性包含多少索引,然后是一个包含多少整数的列表。这个变长列表中的每个整数都是顶点的索引。

注意,面列表生成三角形的顺序是TRIANGLE FAN,而不是TRIANGLE STRIP。在上面的例子中,第一个面

4 0 1 2 3

由三角形0 1 20 2 3组成而不是0 1 21 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 }

这个文件为每个顶点指定一个红、绿、蓝值。为了说明vertex_index的变长特性,对象的前两个面是三角形而不是单一的正方形。这意味着这个物体的面数是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文件中可能很诱人。这种做法应该保持在最低限度。更好的方法是尝试调整公共元素(顶点、面、边、材料)以适应新的用途,这样其他理解这些元素的程序在操作这些调整过的元素时可能会有用。例如,一个应用程序将分子描述为球体和圆柱体的集合。为包含分子的PLY文件定义球体和圆柱体元素是很有诱惑力的。然而,如果我们为此目的使用顶点和边元素(为每个元素添加半径属性),我们可以使用操作和显示顶点和边的程序。显然,我们不应该为三角形和四边形创建特殊的元素,而应该使用face元素。如果程序不知道面和顶点之间的邻接关系(所谓的非共享顶点),该怎么办?在这里,每个三角形(比如说)都是空间中三个位置的纯粹集合,不知道某些三角形是否有公共顶点。这是一种相当常见的情况。假设给定对象中有N个三角形,那么应该将3N个顶点写入文件,然后将N个面连接这些顶点。我们预期将编写一个实用程序来在非共享和共享顶点文件之间进行转换。

 类似资料: