ply文件格式詳細說明
典型的 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 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”和 “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 { 物體裏有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 文件中。這個練習應該保持在最小。試着將普通元素(頂點、面片、邊、材質)改編用於新用途更好,使得其他能夠讀懂這些元素的程序在操作這些改編過的元素時 更有用。比如,一個將分子描述成球體和圓柱體集合的應用。這將需要在包含分子的 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 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”和 “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 { 物體裏有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 文件中。這個練習應該保持在最小。試着將普通元素(頂點、面片、邊、材質)改編用於新用途更好,使得其他能夠讀懂這些元素的程序在操作這些改編過的元素時 更有用。比如,一個將分子描述成球體和圓柱體集合的應用。這將需要在包含分子的 PLY 文件裏定義球體和圓柱體元素。然而,如果我們爲了這個目的使用頂點和邊元素(爲每個添加半徑屬性),我們可以利用操作和顯示頂點和邊的程序。無疑不應該爲 三角形和四邊形創建特殊元素,而應該使用面片元素。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.