2015-02-11 69 views
2

爲了某種目的,我需要讀取帶嵌入紋理的PLY文件(斯坦福三角格式)。我看到了幾個PLY文件的規範,但是找不到指定紋理映射語法的單個源。似乎有這麼多的庫讀取PLY文件,但其中大多數似乎不支持紋理(他們只是崩潰;我嘗試了2-3)。 以下是在與紋理層文件頭:帶紋理座標的PLY文件規格

ply 
format binary_little_endian 1.0 
comment TextureFile Parameterization.png 
element vertex 50383    
property float x 
property float y 
property float z 
property float nx 
property float ny 
property float nz 
element face 99994    
property list uint8 int32 vertex_index 
property list uint8 float texcoord 
end_header 

我不明白的是行property list uint8 float texcoord。此外,與臉部對應的列表是

3 1247 1257 1279 6 0.09163 0.565323 0.109197 0.565733 0.10888 0.602539 6 9 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157`. 

這是什麼名單;格式是什麼?雖然我明白PLY爲您提供了爲元素定義自己的屬性的機會,但處理紋理似乎幾乎是一個標準,許多應用程序(如流行的Meshlab)似乎使用上述語法打開紋理PLY文件。

我想知道什麼是讀取紋理PLY文件後遵循的標準語法,如果可能的話,找到這些信息的來源。

回答

4

在PLY文件中,faces通常包含值列表,這些列表的大小可能有所不同。如果它是一個三角形的面,期待三個值,一個quad = 4等等直到任意的n-gon。名單在這樣的行宣稱:

property list uint8 int32 vertex_index 

這是一個名爲'的vertex_index名單。它將總是由一個8位無符號整數(即uint8)組成,它的大小爲N,後面跟着N個32位整數(即int32)。

在本例中此行馬上顯示出來:

3 1247 1257 1279 

此說,來了3個值,然後它給你三個。

現在第二個名單是其中紋理座標應該是:

property list uint8 float texcoord 

這就像在第一個列表的大小是第一位的(作爲一個無符號字節),但是這一次它會跟着一個一系列32位浮點數而不是整數(對紋理座標有意義)。直接的解釋是,vertex_index中列出的每個頂點都會有一個紋理座標。如果我們假設這些都只是2D紋理座標(一個非常安全的假設),我們應該會看到後跟6數量6浮點值......我們這樣做:

6 0.09163 0.565323 0.109197 0.565733 0.10888 0.602539 

這些是對應的紋理座標三個頂點已經列出。

現在,對於一張臉,應該是這樣。我不知道剩下的部分是什麼東西。根據你的頭文件其餘的文件應該是二進制的,所以我不知道你是如何得到它作爲一行ascii文本,但該行上的額外數據不應該在那裏(也根據頭完全定義面對)。

+0

謝謝您的回答,但問題是解釋整個字符串'3 1247 1257 1279 6 0.09163 0.565323 0.109197 0.565733 0.10888 0.602539 6 9 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157 0.992157'不只是它的一半。我學到的是PLY沒有「嚴格」的規則,事實上你定義了自己的規則並解釋它 - 這是PLY的整個哲學。這是由一個軟件編寫的txt座標可能與其他軟件不同的原因。 – krips89 2015-03-27 15:51:26

+0

那麼最終我的回答是,這個字符串不是一個合適的PLY行。它違反了標題設置的規則。 PLY文件是獨立的。標題描述了每行應該有的數據,然後是行。您顯示的行比標題說明的要多。 – OllieBrown 2015-04-02 21:23:16