連結:http://blog.csdn.net/szchtx/article/details/7587999
http://cdu.net.cn/3D/2014-04-23/705.html
一、PLY簡單介紹
PLY檔案格式是Stanford大學開發的一套三維mesh模型資料格式,圖形學領域内非常多著名的模型資料,比方Stanford的三維掃描資料庫(當中包含非常多文章中會見到的Happy Buddha, Dragon, Bunny兔子),Geogia Tech的大型幾何模型庫。北卡(UNC)的電廠模型等,最初的模型都是基于這個格式的。
PLY多邊形檔案格式的開發目标是建立一套針對多邊形模型的,結構簡單可是可以滿足大多數圖形應用須要的模型格式,并且它同意以ASCII碼格式或二進制形式存儲檔案。PLY的開發人員希望。這樣一套既簡單又靈活的檔案格式,可以幫助開發人員避免反複開發檔案格式的問題。然而因為各種各樣的原因,在工業領域内,新的檔案格式仍然在不斷的出現,可是在圖形學的研究領域中,PLY還是種經常使用且關鍵的檔案格式。
PLY作為一種多邊形模型資料格式,不同于三維引擎中經常使用的場景圖檔案格式和腳本檔案。每一個PLY檔案僅僅用于描寫叙述一個多邊形模型對象(Object),該模型對象能夠通過諸如頂點、面等資料進行描寫叙述,每一類這種資料被稱作一種元素(Element)。相比于現代的三維引擎中所用到的各種複雜格式。PLY實在是種簡單的不能再簡單的檔案格式,可是假設細緻研究就會發現,就像設計者所說的,這對于絕大多數的圖形應用來說已經是足夠用了。
二、PLY結構
PLY的檔案結構簡單:檔案頭加上元素資料清單。當中檔案頭中以行為機關描寫叙述檔案類型、格式與版本号、元素類型、元素的屬性等,然後就依據在檔案頭中所列出元素類型的順序及其屬性,依次記錄各個元素的屬性資料。
典型的PLY檔案結構:
頭部
頂點清單
面片清單
(其它元素清單)
頭部是一系列以回車結尾的文本行。用來描寫叙述檔案的剩餘部分。
頭部包括一個對每一個元素類型的描寫叙述,包括元素名(如“邊”)。這個元素在project裡有多少,以及一個與這個元素關聯的不同屬性的清單。頭部還說明這個檔案是二進制的或者是ASCII的。頭部後面的是一個每一個元素類型的元素清單,依照在頭部中描寫叙述的順序出現。
以下是一個立方體的完整ASCII描寫叙述。大括号裡的凝視不是檔案的一部分,它們是這個樣例的注解。檔案裡的凝視一般在 “comment”開始的關鍵詞定義行裡。
[plain] view
plaincopyprint?
- <span style="font-size:16px;">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 </span>
這個樣例說明頭部的基本組成。頭部的每一個部分都是一個以關鍵詞開頭。以回車結尾的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 <數值類型> <數值類型> <屬性名> ,這樣的格式,一個非負字元表示在屬性裡包括多少索引,接下來是一個清單包括很多整數。在這個邊長清單裡的每一個整數都是一個頂點的索引。
另外一個立方體定義:
[plain] view
plaincopyprint?
- 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 格式相同同意使用者定義它們自己的元素。定義新元素的格式于頂點、面片和邊相同。這是頭部定義材料屬性的部分:
[plain] view
plaincopyprint?
- 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
