2010-11-06 69 views
1

我有一些.off格式的3D對象,我想用OpenGL + C來處理。有沒有一種標準的,簡單的方法來做到這一點?在opengl中工作.off文件

+0

什麼是OFF? [This?](http://people.sc.fsu.edu/~jburkardt/data/off/off.html) – genpfault 2010-11-06 17:50:58

+0

是的。那。究竟。 – andandandand 2010-11-06 21:24:21

回答

2

Based on the link genpfault posted,您的第一個問題是您使用的是ASCII模式格式。儘管可以這樣做,但您會介紹轉換問題。很難,不是真的,有點痛苦,是的。另外,這種格式有二進制和ASCII變體,所以你必須處理兩種格式。

現在,格式的細節,如在本節中(從頁取)指出:

線1條OFF

行2 vertex_count FACE_COUNT EDGE_COUNT

一個用於每個線頂點:XYZ
頂點0,1,...,vertex_count-1 爲每個多邊形面一行:N V1 V2 ... VN,

頂點的數量以及每個面的頂點索引。

看起來,第一眼看上去就是以非常友善的OpenGL格式定義事物。事實上,我敢打賭你可以直接從模型文件中渲染。這隻會工作一次,但這意味着與一些瘋狂的格式相比,你的開局不錯。

你想要做的是採取第二行,並找到頂點和麪數。存儲這個(僞代碼片段)。然後瀏覽頂點和臉部列表並加載每一個,並以任何形式保存它。這一過程將去是這樣的:

List<Vector3> vertices; 

Open file model.off 
Read line 
if (line == "OFF") 
{ 
    // We know it's a model 
    Read line 
    Attributes[] = Split line(' ') 
    Vertex count = Attributes[0] 
    Face count = Attributes[1] 
    // Save edge count if necessary 
    For (vert = 0; vert < vertex count; vert += 1) 
    { 
     Read line 
     Coordinates[] = Split line(' ') 
     float X = FloatFromString(Coordinates[0]) 
     float Y = FloatFromString(Coordinates[1]) 
     float Z = FloatFromString(Coordinates[2]) 
     vertices.push(new Vector3(x, y, z)) 
    } 
    // Repeat for faces 
} 

現在,一旦您已加載的所有數據,您需要將其設置爲渲染。你可以在你的模型類的一個小功能,簡單地調用:

glBegin(TRIS) 
for each (face) 
{ 
    retrieve the verts from the list 
    glVertex3f(x, y, z) 
} 

顯然,這是不完全一樣,但是這是大概的瞭解。您可以將卡片緩存緩存到卡片上的VBO或其他任何方法中,但使用這種簡單的渲染可以使模型格式和渲染過程之間的聯繫更加簡單,在我看來。

+0

該鏈接稱它爲「目標文件格式」,但我更喜歡你的術語(OpenGL友好格式)。 – 2010-11-07 04:36:33

+0

在將它們傳遞給'GL_TRIANGLES'之前,您必須對這些n-gons進行三角化。我想你*可以*穿過你的所有手指和腳趾,並希望你遇到的每個多邊形都是凸面和平面的,並將它傳遞給'GL_POLYGON' :) – genpfault 2010-11-07 08:07:45

+0

@genpfault:你也許可以使用三扇。我沒有在頁面上看到有關vert的設置,也沒有保證它們兼容,所以可能需要更多的工作。 – ssube 2010-11-07 18:56:43

0

如果您打算編寫加載程序,則必須找到「.off」文件的「文件結構」文檔。

像這樣的東西(這是「.MD2‘):en.wikipedia.org/wiki/MD2_(file_format)

雖然我建議你試着從’.off」到「.FBX」或」 .md2" 或任何其它轉換器文件格式被廣泛使用。