要順利讀取
obj模型檔案,先要了解obj檔案的格式。
obj檔案格式是非常簡單的,它以純文字的形式儲存了模型的頂點、法線和紋理座標和材質使用資訊。
obj檔案的每行的格式如下:
字首引數1引數
2引數3 ...
其中,字首標識了這一行所儲存的資訊型別。引數則是具體的資料。
obj檔案常見的的字首有: §
v表示本行指定乙個頂點。
字首後跟著
3個單精度浮點數,分別表示該定點的x、
y、z座標值 §
vt表示本行指定乙個紋理座標。此字首後跟著兩個單精度浮點數。分別表示此紋理座標的u、
v值 §
vn表示本行指定乙個法線向量。此字首後跟著
3個單精度浮點數,分別表示該法向量的x、
y、z座標值 §
f表示本行指定乙個表面
(face)
。乙個表面實際上就是乙個三角形圖元。此字首行的引數格式後面將詳細介紹。 §
usemtl
此字首後只跟著乙個引數。該引數指定了從此行之後到下乙個以
usemtl
開頭的行之間的所有表面所使用的材質名稱。該材質可以在此
obj檔案所附屬的
mtl檔案中找到具體資訊。 §
mtllib
此字首後只跟著乙個引數。該引數指定了此
obj檔案所使用的材質庫檔案
(*.mtl)
的檔案路徑
現在,我們再來看一下
obj檔案的結構。在乙個
obj檔案中,首先有一些以v、
vt或vn字首開頭的行指定了所有的頂點、紋理座標、法線的座標。然後再由一些以
f開頭的行指定每乙個三角形所對應的頂點、紋理座標和法線的索引。在頂點、紋理座標和法線的索引之間,使用符號
「/」隔開的。 乙個
f行可以以下面幾種格式出現: §
f 1 2 3
這樣的行表示以第1、
2、3號頂點組成乙個三角形。 §
f 1/3 2/5 3/4
這樣的行表示以第1、
2、3號頂點組成乙個三角形,其中第乙個頂點的紋理座標的索引值為
3,第二個頂點的紋理座標的索引值為
5,第三個頂點的紋理座標的索引值為4。
§f 1/3/4 2/5/6 3/4/2
這樣的行表示以第1、
2、3號頂點組成乙個三角形,其中第乙個頂點的紋理座標的索引值為
3,其法線的索引值是
4;第二個頂點的紋理座標的索引值為
5,其法線的索引值是
6;第三個頂點的紋理座標的索引值為
6,其法線的索引值是2。
§f 1//4 2//6 3//2
這樣的行表示以第1、
2、3號頂點組成乙個三角形,且忽略紋理座標。其中第乙個頂點的法線的索引值是
4;第二個頂點的法線的索引值是
6;第三個頂點的法線的索引值是2。
值得注意的是檔案中的索引值是以
1作為起點的,這一點與
c語言中以
0作為起點有很大的不同。在渲染的時候應注意將從檔案中讀取的座標值減去1。
由於通常我們拿到的檔案中只出現頂點和法線資料,每個面儲存頂點和法線索引,所以我們要宣告如下幾個全域性函式:
int v_num=0; //
記錄點的數量
int vn_num=0;//
記錄法線的數量
int f_num=0; //
記錄面的數量
glfloat **varr; //
存放點的二維陣列
glfloat **vnarr;//
存放法線的二維陣列
int **fvarr; //
存放面頂點的二維陣列
int **fnarr; //
存放面法線的二維陣列
string s1;
glfloat f2,f3,f4;
為了給存放頂點法線等二維陣列分配儲存空間,需要知道頂點和法線等的數量,使用下面的函式計算點、法線、面的數量:
void getlinenum(const std::string & sfilename)
else if(sline[0]=='f')
f_num++;
getline(infile,sline);
}infile.close();}
用下面的函式把檔案內容讀到上面定義的陣列中去
int readfile(string addrstr)
vnarr=new glfloat*[vn_num];
for (i=0;i
fvarr=new int*[f_num];
fnarr=new int*[f_num];
for (i=0;i
ifstream infile(addrstr.c_str());
string sline;//
每一行
int ii=0,jj=0,kk=0;
while(getline(infile,sline))
else//v
}if (sline[0]=='f') //
讀取面
fvarr[kk][i]=a;
a=0;
for(k=k+2;s1[k];k++)
fnarr[kk][i]=a; }
kk++; }
}return 0; }
然後在繪製之前,初始化時,呼叫這兩個函式讀取模型即可:
getlinenum("cow.obj");
readfile("cow.obj");
相應的繪製**:
for (int i=0;i
如果想讀取其他的
obj檔案,相應的分配乙個儲存空間,讀取相應的資料,然後在繪製時使用這些資料就行了。
OpenGL讀取Obj模型檔案
想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔案中,每行的格式如下 字首 引數1 引數2 引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是...
OpenGL讀取Obj模型檔案
2012 09 07 19 16 01 分類 計算機圖形學 舉報 字型大小訂閱 昨天,幫助別人寫了乙個程式,讀取obj檔案中的3d模型,就學習了下使用opengl如何讀取這種檔案。想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 ...
OpenGL讀取Obj模型檔案
昨天,幫助別人寫了乙個程式,讀取obj檔案中的3d模型,就學習了下使用opengl如何讀取這種檔案。想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔...