石鑫华机器视觉网:PLY 是一种电脑档案格式,全名为 多边形档案(Polygon File Format) 或 史丹佛三角形档案(Stanford Triangle Format)。
史丹佛大学的 的 The Digital Michelangelo Project 计划采用 PLY 格式储存极高分辨率之 米开朗基罗 的作品 "大卫" 雕塑。
该格式主要用以储存立体扫描结果的三维数值,透过多边形片面的集合描述三维物体,与其他格式相较之下这是较为简单的方法。它可以储存的资讯包含颜色、透明度、表面法向量、材质坐标与资料可信度,并能对多边形的正反两面设定不同的属性。
在档案内容的储存上 PLY 有两种版本,分别是纯文字(ASCII)版本与二元码(binary)版本,其差异在储存时是否以 ASCII 编码表示元素资讯。
每个 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' 及 'property' 的关键字,一般的格式为 element 下方接着属性列表,例如:
element <element name> <number in file>
property <data_type> <property name 1>
property <data_type> <property name 2>
property <data_type> <property name 3>
'property' 不仅定义了资料的型态,其出现顺序亦定义了资料的顺序。内定的资料形态有两种写法:一种是 char uchar short ushort int uint float double, 另外一种是具有位元长度的 int8 uint8 int16 uint16 int32 uint32 float32 float64。 例如, 描述一个包含 12 个顶点的物体,每个顶点使用 3 个单精度浮点数 (x,y,z) 代表点的座标, 使用 3 个 unsigned char 代表顶点颜色,颜色顺序为 (B, G, R), 则档头的写法为:
element vertex 12
property float x
property float y
property float z
property uchar blue
property uchar green
property uchar red
其中 vertex 是内定的元素类型,接续的 6 行 property 描述构成 vertex 元素的数值字段顺序代表的意义,及其资料形态。
另一个常使用的元素是面。由于一个面是由 3 个以上的顶点所组成,因此使用一个“顶点列表”即可描述一个面, PLY 格式使用一个特殊关键字 'property list' 定义之。 例如, 一个具有 10 个面的物体,其 PLY 档头可能包含:
element face 10
property list uchar int vertex_indices
'property list' 表示该元素 face 的特性是由一行的顶点列表来描述。列表开头以 uchar 型态的数值表示列表的项目数,后面接着资料型态为 int 的顶点索引值 (vertex_indices),顶点索引值从 0 开始。
最后,标头必须以此行结尾:
end_header
档头后接着的是元素资料(端点坐标、拓扑连结等)。在 ASCII 格式中各个端点与面的资讯都是以独立的一行描述,而二元编码格式则连续储存这些资料,加载时须以 'element' 定义的元素数目以及 'property' 中设定的资料形态计算各笔字段的长度。
一个典型的 PLY 档案结构分成三部分:
檔頭 (從 ply 開始到 end_header )
頂點元素列表
面元素列表
其中的 顶点元素列表 一般以 x y z 方式排列,形态如档头所定义;而 面元素列表 是以下列格式表示。
<組成面的端點數 N> <端點#1的索引> <端點#2的索引> ... <端點#N的索引>
例如画出一个有 4 个顶点,4 个面的四面体,档案内容为:
ply
format ascii 1.0
comment 這是一個正四面體
element vertex 4
property float x
property float y
property float z
element face 4
property list uchar int vertex_index
end_header
0 3 0
2.449 -1.0 -1.414
0 -1 2.828
-2.449 -1.0 -1.414
3 0 1 3
3 0 2 1
3 0 3 2
3 1 2 3
其中 1~10 行是档头, 11~14 行是顶点元素列表, 15~18 行则是面元素列表 。
PLY 格式发展于 90年代中期,在史丹佛大学图学实验室的 Marc Levoy 教授指导下,由 Greg Turk 及其他成员开发出来。PLY 格式受 Wavefront .obj 格式的启发,但改进了 Obj 格式所缺少的对任意属性及群组的扩充性。因此 PLY 格式发明了 "property" 及 "element" 这两个关键词,来概括“顶点、面、相关资讯、群组”的概念。