opengl讀取OBJ模型檔案

2021-07-10 03:50:14 字數 2903 閱讀 8391



要順利讀取

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檔...