一. PLY简介
PLY文件格式是Stanford大学开发的一组三维mesh模型数据格式,在图形学领域中,使用Stanford的三维扫描数据库(包括在许多文章中看到的HappyBuddha、Dragon、Bunny兔)、ggy
PLY多边形文件格式的开发目标是创建一组多边形模型。 虽然结构简单,但它可以满足大多数图形APP应用所需的模型格式。 也可以以ASCII代码或二进制格式保存文件。 PLY的开发者希望这种简单灵活的文件格式集能帮助开发者避免文件格式重复开发的问题。 但是由于各种各样的原因,在工业领域,新的文件格式层出不穷,而在图形学的研究领域,PLY还是一种很常用、很重要的文件格式。
PLY用作多边形模型数据格式,与3d引擎中常用的场景图形文件格式和脚本文件不同。 每个PLY文件仅用于描述可以用顶点和面等数据描述的多边形模型对象(Object ),每种类型的数据都称为元素。 与现代三维引擎中使用的各种复杂格式相比,PLY是一种简单的文件格式,但如果仔细研究,就会发现它对于大多数图形APP应用来说已经足够有效了
二. PLY结构
PLY的文件结构很简单。 文件头和要素数据的列表。 文件标题以行为单位描述文件类型、格式和版本、元素类型、元素属性等,并根据标题中列出的元素类型的顺序及其属性顺序记录每个元素的属性数据。
典型的PLY文件结构:
头儿
顶点列表
修补程序列表
(其他元素列表() ) ) ) ) )。
头是以换行符结束的一系列文本行,用于描述文件的剩馀部分。 头部包含每个元素类型的说明,例如元素名称(如“边”)、项目中元素的数量以及与元素关联的各种属性的列表。 头部还说明该文件是二进制文件或ASCII。 头部后面是每个元素类型的元素列表,按头部描述的顺序显示。
立方体的完整ASCII说明如下所示。 大括号中的注释不是文档的一部分,而是本例中的注释。 文件中的注释通常位于以" comment "开头的关键字定义行中。
ply format ascii 1.0 { ascii/二进制,格式版本数} comment made by anonymous {注释关键字说明, 与其他行一样} commentthisfileisacubeelementvertex8{定义“vertentthisfileisacubeelementvertex 8”文件中有8个} property float32 x {浮动在顶点上property float32 x {坐标也是相同的顶点属性} property float32 z { z也是坐标} element face 6 {文件中有六个“face”propertylistuint8int 32 vertex _ index (“vertex _ indices”)顶点参数(整数列) } end_header { (确定头部的结尾) 00 )顶点列表的开始) 01010101010111111040123 {修补程序列表开始}476544404541526273740本示例说明头部的基本配置的每个部分都是以关键字开始,以换行符结束的ASCII字符串。 “ply”是文件的前四个字符。
文件的开头是关键字“format”和特定的ASCII或二进制格式,接下来是版本号。
以下是多边形文件中每个元素的说明。 每个元素还具有多个属性说明。 一般元素以以下格式编写:
文件中element元素名称的数量
property数据类型属性名称-1
property数据类型属性名称-2
property数据类型属性名称-3
属性会排列在“element”(元素)行之后
面定义,既包含属性的数据类型,也包含属性在每个元素中出现的次序。一个属性可以有三种数据类型:标量,字符串和列表。属性可能具有的标量数据类型列表如下: 名称 类型 字节数
-------------------------------
int8 字符 1
uint8 非负字符 1
int16 短整型 2
uint16 非负短整型 2
int32 整型 4
uint32 非负整型 4
float32 单精度浮点数 4
float64 双精度浮点数 8
这些字节计数很重要,而且在实现过程中不能修改以使这些文件可移植。
使用列表数据类型的属性定义有一种特殊的格式:property list <数值类型> <数值类型> <属性名> ,这种格式,一个非负字符表示在属性里包含多少索引,接下来是一个列表包含许多整数。在这个边长列表里的每个整数都是一个顶点的索引。
另外一个立方体定义:
ply format ascii 1.0 comment author: anonymous comment object: another cube element vertex 8 property float32 x property float32 y property float32 z property red uint8 { 顶点颜色开始 } property green uint8 property blue uint8 element face 7 property list uint8 int32 vertex_index { 每个面片的顶点个数 } element edge 5 { 物体里有5条边 } property int32 vertex1 { 边的第一个顶点的索引 } property int32 vertex2 { 第二个顶点的索引 } property uint8 red { 边颜色开始 } property uint8 green property uint8 blue end_header 0 0 0 255 0 0 { 顶点列表开始 } 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 { 面片列表开始,从一个三角形开始 } 3 0 2 3 { 另一个三角形 } 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 0 1 255 255 255 { 边列表开始,从白边开始 } 1 2 255 255 255 2 3 255 255 255 3 0 255 255 255 2 0 0 0 0 { 以一个黑线结束 }这个文件为每个顶点指定一个红、绿、蓝值。
为了说明变长vertex_index(顶点索引)的能力,物体的头两个面片是两个三角形而不是一个四边形。这意味着物体的面片数是7。这个物体还包括一个边列表。每条边包括两个指向说明边的顶点的指针。每条边也有一种颜色。上面定义的五条边指定了颜色,使文件里的两个三角形高亮。前四条边白色,它们包围两个三角形。最后一条边是黑的,他是分割三角形的边。
三、用户定义元素
上面的例子显示了顶点、面片和边三种元素的用法。PLY 格式同样允许用户定义它们自己的元素。定义新元素的格式于顶点、面片和边相同。这是头部定义材料属性的部分:
这些行应该在头部顶点、面片和边的说明后直接出现。如果我们希望每个顶点有一个材质说明,我们可以将这行加在顶点属性末尾:property material_index int32
这个整数现在是一个到文件内包含的材质列表的索引。这可能诱使一个新应用的作者编制一些信的元素保存在PLY文件中。
转载自:http://blog.csdn.net/lxfyzx/article/details/4997627
http://blog.csdn.net/lxfyzx/article/details/4997780