PLY文件格式

原文地址:PLY文件格式 作者:土人

本文转自 http://topic.csdn.net/u/20070602/13/1e879838-9133-4d79-ad1f-b5f22c4e2758.html

 

OpenGL怎么载入Ply格式的3D模型?

1.找到PLY格式的定义
2.用C++的文件流读入并解析
3.用OPENGL将解析的顶点,纹理显示出来。

 

*.ply是Animator   Pro创建的一种图形文件格式,其中包含用来描述多边形的一系列点的信息

 

典型的   PLY   文件结构:

头部
顶点列表
面片列表
(其他元素列表)

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

下面是一个立方体的完整ASCII描述。相同工程的二进制版本头部的唯一不同是用词“binary_little_endian”或者   “binary_big_endian”替换词“ascii”。大括号中的注释不是文件的一部分,它们是这个例子的注解。文件中的注释一般在   “comment”开始的关键词定义行里。

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

这个例子说明头部的基本组成。头部的每个部分都是以一个关键词开头以回车结尾的ASCII串。即使是头部的开始和结尾(“ply”和 “end_header”)也是以这种形式。因为字符“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   <数值类型>   <数值类型>   <属性名>

这种格式的一类例子是上面的立方体文件中的:

property   list   uint8   int32   vertex_index

这表示属性“vertex_index”首先包含一个非负字符报苏在属性里包含多少索引,接下来是一个列表包含许多整数。在这个边长列表里的每个整数都是一个顶点的索引。

另外一个例子
------------

另外一个立方体定义:

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条边   }
property   int32   vertex1    边的第一个顶点的索引   }
property   int32   vertex2    第二个顶点的索引   }
property   uint8   red    边颜色开始   }
property   uint8   green
property   uint8   blue
end_header
    255      顶点列表开始   }
    255    0
    255    0
    255    0
      255
      255
      255
      255
      面片列表开始,从一个三角形开始   }
      另一个三角形   }
       现在是一些四边形   }
     1
     2
     3
     0
   255   255   255    边列表开始,从白边开始   }
   255   255   255
   255   255   255
   255   255   255
       以一个黑线结束   }

这个文件为每个顶点指定一个红、绿、蓝值。为了说明变长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   文件中。这个练习应该保持在最小。试着将普通元素(顶点、面片、边、材质)改编用于新用途更好,使得其他能够读懂这些元素的程序在操作这些改编过的元素时更有用。比如,一个将分子描述成球体和圆柱体集合的应用。这将需要在包含分子的   PLY   文件里定义球体和圆柱体元素。然而,如果我们为了这个目的使用顶点和边元素(为每个添加半径属性),我们可以利用操作和显示顶点和边的程序。无疑不应该为三角形和四边形创建特殊元素,而应该使用面片元素。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wolflock/archive/2008/02/26/2121413.aspx

_________________________________________________________________________________________________________________________________
_________________________________________________________________________________________________________________________________

PLY 是一种电脑档案格式,全名为 多边形档案(Polygon File Format)史丹佛三角形档案(Stanford Triangle Format)

该格式主要用以储存立体扫描结果的三维数值,透过多边形片面的集合描述三维物体,与其他格式相较之下这是较为简单的方法。它可以储存的资讯包含颜色、透明度、表面法向量、材质座标与资料可性度,并能对多边形的正反两面设定不同的属性。

在档案内容的储存上 PLY 有两种版本,分别是纯文字(ASCII)版本与二元码(binary)版本,其差异在储存时是否以 ASCII 编码表示元素资讯。

 

档案格式

__________________________________________________________________________________________________________________________________

(本文并未提供完整的格式描述,以下仅介绍 PLY 的基本概念与格式)

每个 PLY 档都包含档头(header),用以设定网格模型的元素与属性。在档头后接着是一连串的元素,一般而言这些元素就是端点(vertices)和面(faces),另外还可能包含有边(edges)、深度图样本(samples of range maps)与三角带(triangle strips)等元素。无论是纯文字与二元码的 PLY 档,档头资讯都是以 ASCII 编码编写,接续其后的数值资料才有编码之分。PLY 档案以此行:

************************************************************************************************************************* 
*  ply
*************************************************************************************************************************
开头作为 PLY 格式的识别。接着第二行是版本资讯,目前有三种写法
.........................................................................................................................
.format ascii 1.0 
.format binary_little_endian 1.0 
.format binary_big_endian 1.0
..........................................................................................................................

其中 ascii, binary_little_endian, binary_big_endian 是档案储存的编码方式,而 1.0 是遵循的标准版本(现阶段仅有 PLY 1.0 版)。在标头中可使用 'comment' 作为一行的开头以编写注解,例如:

..................................................................................................................................................

comment This is a comment!

..................................................................................................................................................

在元素的数量定义上可使用 'element' 关键字。举例而言,若一个档案包含 12 个端点,则档头必须包含:

.....................................................................................................................................................

element vertex 12

property float x

property float y

property float z

......................................................................................................................................................

其中 vertex 是内定的元素类型,而这里也出现了 'property' 关键字,其功用是描述构成 vertex 元素的数值字段及其形态,例如上述范例定义 x, y, z 三字段为浮点数资料形态。内定的资料形态有char uchar short ushort int uint float double 与具有位元长度的 int8 uint8 int16 uint16 int32 uint32 float32 float64 几种。另一个常使用的元素是,例如一个具有十个多边面的物体,其 PLY 档头可能包含:

 element face 10
 property list uchar int vertex_index

此处的 'list' 表示该元素 face 的 vertex_index 字段是一数值资料列表,并以 'uchar' 开头表示列表的项目数,而每个项目的资料形态是 'int' 类型。最后标头必须以此行结尾:

 end_header

档头后接着的是元素资料(端点座标、拓谱连结等)。在 ASCII 格式中各个端点与面的资讯都是以独立的一行描述,而二元编码格式则连续储存这些资料,加载时须以 'element' 定义的元素数目以及 'property' 中设定的资料形态计算各笔字段的长度。一个典型的 PLY 档案结构是:

 檔頭
 端點元素列表
 面元素列表

其中的 端点元素列表 一般以 x y z 方式排列,形态如档头所定义;而 面元素列表 是以

<組成面的端點數 N> <端點#1的索引> <端點#2的索引> ... <端點#N的索引>

表示,举例如下:

 ply
 ... (一些檔頭資訊)
 end_header
 0 0 1
 0 1 1
 ... (更多的端點元素)
 3 0 1 2
 3 0 1 3
 4 1 2 3 5
 ... (更多的面元素)

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值