OpenGL讀取Obj模型檔案

2021-09-30 13:12:53 字數 2526 閱讀 2559

2012-09-07 19:16:01

|  分類:

計算機圖形學|舉報

|字型大小訂閱

昨天,幫助別人寫了乙個程式,讀取obj檔案中的3d模型,就學習了下使用opengl如何讀取這種檔案。

想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點、法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔案中,每行的格式如下:

字首 引數1 引數2 引數3 ...
其中,字首標識了這一行所儲存的資訊型別。引數則是具體的資料。obj檔案常見的的字首有

現在,我們再來看一下obj檔案的結構。在乙個obj檔案中,首先有一些以v、vt或vn字首開頭的行指定了所有的頂點、紋理座標、法線的座標。然後再由一些以f開頭的行指定每乙個三角形所對應的頂點、紋理座標和法線的索引。在頂點、紋理座標和法線的索引之間,使用符號「/」隔開的。乙個f行可以以下面幾種格式出現:

值得注意的是檔案中的索引值是以1作為起點的,這一點與c語言中以0作為起點有很大的不同。在渲染的時候應注意將從檔案中讀取的座標值減去1。

我拿到的obj檔案,內容如下:

# max2obj version 4.0 mar 10th, 2001 # # object line01 to come ... # 

v -9.574153 -2.220963 -2.000000 v -7.893424 -2.280989 -2.000000 ...省略若干相同格式的行 v -7.195892 -1.380599 -0.980160 v -9.580536 -1.320573 -1.967912 # 160 vertices vn -0.071382 -1.998675 0.014198 vn -0.035691 -0.999338 0.007099 ...同樣省略若干相同格式的行 vn -0.825224 1.736366 -0.551397 vn 0.039418 1.999438 0.026341 # 160 vertex normals g line01 s 1 f 1//1 12//12 2//2 f 1//1 11//11 12//12 s 4 f 2//2 13//13 3//3 f 2//2 12//12 13//13 ...同樣的省略若干相同格式的行 s 4 f 160//160 1//1 151//151 f 160//160 10//10 1//1 # 320 faces g

前面帶有'#'的行是注釋行,這個檔案中包含的字首有:v,表示頂點;vn,表示法線;g,表示組,行 "g line01" 和行 "g" 之前的所有行表示乙個名為"line01"的組;f,表示乙個面;s,表示光滑組。

由於檔案中只出現頂點和法線資料,每個面儲存頂點和法線索引,所以我們要宣告如下幾個全域性函式:

intv_num=0

;//記錄點的數量 

int vn_num=0;//記錄法線的數量
int f_num=0; //記錄面的數量
glfloat **varr; //存放點的二維陣列
glfloat **vnarr;//存放法線的二維陣列
int **fvarr; //存放面頂點的二維陣列
int **fnarr; //存放面法線的二維陣列

string s1; glfloat f2,f3,f4;
為了給存放頂點法線等二維陣列分配儲存空間,需要知道頂點和法線等的數量,使用下面的函式計算點、法線、面的數量:

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("wan.obj"); readfile("wan.obj");
相應的繪製**:

for

(inti=

0;i<

f_num;i

++)

這樣就完成了繪製,上面的**僅僅針對我的wan.obj這個檔案,對於想讀取其他的obj檔案,相應的分配乙個儲存空間,讀取相應的資料,然後在繪製時使用這些資料就行了。

OpenGL讀取Obj模型檔案

想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔案中,每行的格式如下 字首 引數1 引數2 引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是...

opengl讀取OBJ模型檔案

要順利讀取 obj模型檔案,先要了解obj檔案的格式。obj檔案格式是非常簡單的,它以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每行的格式如下 字首引數1引數 2引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是具體的資料。obj檔案常見的的字首有 v表示本行指定...

OpenGL讀取Obj模型檔案

昨天,幫助別人寫了乙個程式,讀取obj檔案中的3d模型,就學習了下使用opengl如何讀取這種檔案。想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔...