天天看點

PLY格式介紹

PLY格式介紹

PLY是一種電腦檔案格式,全名為多邊形檔案(Polygon File Format)或 斯坦福三角形檔案(Stanford Triangle Format)。 

史丹佛大學的 The Digital Michelangelo Project計劃采用PLY格式儲存極高分辨率之米開朗基羅的作品"大衛"雕塑。

該格式主要用以儲存立體掃描結果的三維數值,透過多邊形片面的集合描述三維物體,與其他格式相較之下這是較為簡單的方法。它可以儲存的資訊包含顔色、透明度、表面法向量、材質座标與資料可信度,并能對多邊形的正反兩面設定不同的屬性。

在檔案内容的儲存上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\'及\'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行則是面元素清單。

其中: 0 3 0是頂點

曆史

PLY格式發展于90年代中期,在史丹佛大學圖學實驗室的Marc Levoy教授指導下,由Greg Turk及其他成員開發出來。PLY格式受Wavefront .obj格式的啟發,但改進了Obj格式所缺少的對任意屬性及群組的擴充性。是以PLY格式發明了"property"及"element"這兩個關鍵詞,來概括“頂點、面、相關資訊、群組”的概念。

注意

ply檔案不支援中文格式的檔案名字,是以在使用過程中避免使用中文來命名。