PLY文件

      

一、PLY简介

        PLY文件格式是Stanford大学开发的一套三维mesh模型数据格式,图形学领域内很多著名的模型数据,比如Stanford的三维扫描数据库(其中包括很多文章中会见到的Happy Buddha, Dragon, Bunny兔子),Geogia Tech的大型几何模型库,北卡(UNC)的电厂模型等,最初的模型都是基于这个格式的。

        PLY多边形文件格式的开发目标是建立一套针对多边形模型的,结构简单但是能够满足大多数图形应用需要的模型格式,而且它允许以ASCII码格式或二进制形式存储文件。PLY的开发者希望,这样一套既简单又灵活的文件格式,能够帮助开发人员避免重复开发文件格式的问题。然而由于各种各样的原因,在工业领域内,新的文件格式仍然在不断的出现,但是在图形学的研究领域中,PLY还是种常用且重要的文件格式。

        PLY作为一种多边形模型数据格式,不同于三维引擎中常用的场景图文件格式和脚本文件,每个PLY文件只用于描述一个多边形模型对象(Object),该模型对象可以通过诸如顶点、面等数据进行描述,每一类这样的数据被称作一种元素(Element)。相比于现代的三维引擎中所用到的各种复杂格式,PLY实在是种简单的不能再简单的文件格式,但是如果仔细研究就会发现,就像设计者所说的,这对于绝大多数的图形应用来说已经是足够用了。 

二、PLY结构

        PLY的文件结构简单:文件头加上元素数据列表。其中文件头中以行为单位描述文件类型、格式与版本、元素类型、元素的属性等,然后就根据在文件头中所列出元素类型的顺序及其属性,依次记录各个元素的属性数据。

        典型的PLY文件结构:
        头部
        顶点列表
        面片列表
      (其他元素列表)

         头部是一系列以回车结尾的文本行,用来描述文件的剩余部分。头部包含一个对每个元素类型的描述,包括元素名(如“边”),这个元素在工程里有多少,以及一个与这个元素关联的不同属性的列表。头部还说明这个文件是二进制的或者是ASCII的。头部后面的是一个每个元素类型的元素列表,按照在头部中描述的顺序出现。

        下面是一个立方体的完整ASCII描述。大括号中的注释不是文件的一部分,它们是这个例子的注解。文件中的注释一般在   “comment”开始的关键词定义行里。

ply 
format   ascii   1.0   {   ascii/二进制,格式版本数   } 
comment   made   by   anonymous   {   注释关键词说明,像其他行一样   } 
comment   this   file   is   a   cube 
element   vertex   8   {   定义“vertex”(顶点)元素,在文件中有8个   } 
property   float32   x   {   顶点包含浮点坐标“x”} 
property   float32   y   {   y   坐标同样是一个顶点属性   } 
property   float32   z   {   z   也是坐标   } 
element   face   6   {   在文件里有6个“face”(面片)   } 
property   list   uint8   int32   vertex_index   {   “vertex_indices”(顶点素引)是一列整数   } 
end_header   {   划定头部结尾   } 
0   0   0   {   顶点列表的开始   } 
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   {   面片列表开始   } 
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"是文件的头四个字符。

        跟在文件头部开头之后的,是关键词“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   格式同样允许用户定义它们自己的元素。定义新元素的格式于顶点、面片和边相同。这是头部定义材料属性的部分:

element   material   6 
property   ambient_red   uint8   {   环绕颜色   } 
property   ambient_green   uint8 
property   ambient_blue   uint8 
property   ambient_coeff   float32 
property   diffuse_red   uint8   {   扩散(diffuse)颜色   } 
property   diffuse_green   uint8 
property   diffuse_blue   uint8 
property   diffuse_coeff   float32 
property   specular_red   uint8   {   镜面(specular)颜色   } 
property   specular_green   uint8 
property   specular_blue   uint8 
property   specular_coeff   float32 
property   specular_power   float32   {   Phong   指数   } 

        这些行应该在头部顶点、面片和边的说明后直接出现。如果我们希望每个顶点有一个材质说明,我们可以将这行加在顶点属性末尾:property   material_index   int32

       这个整数现在是一个到文件内包含的材质列表的索引。这可能诱使一个新应用的作者编制一些信的元素保存在PLY文件中。

 

 

转载自:http://blog.csdn.net/lxfyzx/article/details/4997627

                http://blog.csdn.net/lxfyzx/article/details/4997780

 

 

 

你可能感兴趣的:(list,object,header,float,图形,引擎)