PLY文件格式

翻译自:PLY - Polygon File Format

PLY - 多边形文件格式

也被称为斯坦福三角格式

源代码示例: ply.hplytest.cplyfile.cplydocs.txt

一个ascii ply文件的例子


介绍

本文档介绍了PLY多边形文件格式,用于存储被描述为多边形集合的图形对象的格式。我们的目标是提供一种简单易于实现的格式,但这种格式对于广泛的模型来说是非常有用的。文件格式有两种子格式:用于轻松启动的ASCII表示形式,以及用于紧凑存储和快速保存和加载的二进制版本。我们希望这种格式将促进程序之间以及人群之间的图形对象的交换。


概观

任何在计算机图形领域工作甚至很短时间的人都知道图形对象存储格式是令人迷惑的数组。似乎每个程序员都为几乎每个新的编程项目创建一个新的文件格式。走出这种格局的方式是创建一个单一的文件格式,既足够灵活,足以预测未来的需求,而且这种格式足够简单,以免驱赶潜在的用户。一旦定义了这样的格式,就可以编写一套以这种格式为中心的实用程序(程序和整个程序)。添加到套件中的每个新实用程序都可以利用其他功能。

PLY格式不是一般场景描述语言,着色语言或全部建模格式。这意味着它不包括变换矩阵,对象实例化,建模层次结构或对象子部分。它不包括参数补丁,二次曲面,建构实体几何操作,三角形条,带孔的多边形或纹理描述(不要与纹理坐标混淆,那个是它支持的)。

典型的PLY对象定义仅仅是顶点的(x,y,z)三元组列表和由顶点列表中的索引描述的面的列表。大多数PLY文件都包含此核心信息。顶点和面是“元素”的两个示例,PLY文件的大部分是其元素列表。给定文件中的每个元素都有固定数量的为每个元素指定的“属性”。 PLY文件中的典型信息只包含两个元素,即顶点的(x,y,z)三元组和每个面的顶点索引。应用程序可以创建附加到对象元素的新属性。例如,红色,绿色和蓝色的属性通常与顶点元素相关联。添加新属性,使得旧程序在遇到这些新属性时不会中断。程序不能理解的属性可以沿着未解释的方式携带,也可以被丢弃。另外,可以创建一个新的元素类型并定义与该元素关联的属性。新元素的例子是边缘,单元格(指向表面的指针列表)和材料(环境,漫反射和镜面颜色和系数)。新元素也可以被不理解的程序携带或丢弃。


文件结构

这是一个典型的PLY文件的结构:
  Header
  Vertex List
  Face List
  (lists of other elements)
标题是一系列回车终止的文本行,描述文件的其余部分。 标题包括每个元素类型的描述,包括元素的名称(例如“边”),对象中有多少这样的元素以及与该元素相关联的各种属性的列表。 标题还会告知文件是二进制还是ASCII文件。 在标题之后是每个元素类型的元素列表,按照标题中描述的顺序呈现。以下是多维数据集的完整ASCII描述。 相同对象的二进制版本的标题不同之处在于将“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


此示例演示了标题的基本组件。 标题的每个部分都是以关键字开头的回车终止的ASCII字符串。 即使标头(“ply”和“end_header”)的开头和结尾都是这种形式。 字符“ply”必须是文件的前四个字符,因为它们作为文件的魔术数字。

标题开头之后是关键字“格式”,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
这意味着属性“vertex_index”首先包含一个无符号字符,表示该属性包含多少个索引,后跟一个包含多个整数的列表。 此变长列表中的每个整数都是顶点的索引。


另一个例子

这是另一个立方体定义:

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格式允许用户自己定义元素。 用于定义新元素的格式与顶点,面和边缘完全相同。 以下是定义材质属性的标题部分:
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文件,将是诱人的定义球体和圆柱体元素。但是,如果我们为此使用顶点和边缘元素(将radius属性添加到每个元素),我们可以使用操纵和显示顶点和边的程序。显然,不应该为三角形和四边形创建特殊元素,而是使用面元素。如果程序不知道面和顶点之间的邻接(所谓的非共享顶点)怎么办?这就是每个三角形(说)纯粹是空间中三个位置的集合,没有概念是否有一些三角形有共同的顶点。这是一个相当普遍的情况。假设给定对象中有N个三角形,则应将3N顶点写入文件,然后再将N个面简单地连接到这些顶点。我们预计将编写一个在非共享和共享顶点文件之间进行转换的实用程序。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值