首先看一下obj檔案格式:
obj檔案中可以有v(頂點位置)、vt(頂點紋理座標)、vn(頂點法向量)、f(面)開頭的四種型別資料。
所有的obj檔案中都有v型資料。格式如下:
v 0.437500 0.164062 0.765625
v -0.437500 0.164062 0.765625
v 0.500000 0.093750 0.687500
vt(頂點紋理座標),格式如下:
vt 0.651583 0.342268
vt 0.652889 0.355515
vt 0.641220 0.366408
vt 0.628246 0.364052
vt 0.654194 0.368763
2. vn(頂點法向量座標),格式如下:vn 0.837179 -0.311379 0.449639
vn 0.878055 0.385575 0.283465
vn 0.276184 0.130417 0.952215
vn 0.287141 -0.526486 0.800227
vn 0.255366 0.316928 0.913425
3.f(面),格式如下:f 6203/4489/4130 1062/4483/4124 6215/4510/4151 3078/4513/4154
f 5471/2749/2665 3078/4513/4154 6216/4514/4155 710/2752/2668
f 3078/4513/4154 6215/4510/4151 1067/4512/4153 6216/4514/4155
f 1006/3940/3718 6008/3937/3734 3079/4515/4156 6218/4516/4157
f 6008/3937/3734 714/2761/2677 5476/2760/2676 3079/4515/4156
現一一分析介紹:
1.v(頂點座標位置):
可以看到v後面有三個引數,分別代表該頂點的x、y、z三個座標值。
2.vt(頂點紋理座標):
vt後面兩個引數,分別代表紋理的u、v值。
3.vn(頂點法向量):
vn後面三個引數,分別代表法向量的x、y、z值。
對於頂點法向量想說的是:我們向opengl中匯入3d模型時,如果obj檔案中沒有vn,就需要我們手動計算麵片的法向量,
否則顯示出來的圖形可能不正確。如果obj檔案中有vn,那麼,我們就乙個點乙個點進行繪製,不需要計算面的法向量。
vn表示的是頂點的法向量,
不是面的法向量。
舉個例子:如果繪製的是四角麵片(網上太多例子是三角麵片了)
vn[0] = (vnsets[firstvertexindexf])[0];//第乙個點的法向量的x
vn[1] = (vnsets[firstvertexindexf])[1];//第乙個點的法向量的y
vn[2] = (vnsets[firstvertexindexf])[2];//第乙個點的法向量的z
glnormal3f(vn[0], vn[1], vn[2]);
glvertex3f(v1[0], v1[1], v1[2]);
vn[0] = (vnsets[secondvertexindexf])[0];//第二個點的法向量的x
vn[1] = (vnsets[secondvertexindexf])[1];//第二個點的法向量的y
vn[2] = (vnsets[secondvertexindexf])[2];//第二個點的法向量的z
glnormal3f(vn[0], vn[1], vn[2]);
glvertex3f(v2[0], v2[1], v2[2]);
vn[0] = (vnsets[thirdvertexindexf])[0];//第三個點的法向量的x
vn[1] = (vnsets[thirdvertexindexf])[1];//第三個點的法向量的y
vn[2] = (vnsets[thirdvertexindexf])[2];//第三個點的法向量的z
glnormal3f(vn[0], vn[1], vn[2]);
glvertex3f(v3[0], v3[1], v3[2]);
vn[0] = (vnsets[fourthvertexindexf])[0];//第四個點的法向量的x
vn[1] = (vnsets[fourthvertexindexf])[1];//第四個點的法向量的y
vn[2] = (vnsets[fourthvertexindexf])[2];//第四個點的法向量的z
glnormal3f(vn[0], vn[1], vn[2]);
glvertex3f(v4[0], v4[1], v4[2]);
這樣就可以繪製出四邊形了。
4.f(面):
面較為複雜,如果是簡單的obj檔案,面的格式可以為:
f 47 1 3
f 4 2 48
f 45 3 5
f 6 4 46
複雜的可以為:f 3643/6900/6406 7305/6826/6332 1602/6797/6303 7332/6880/6386
f 1592/6749/6259 7343/6901/6407 3644/6902/6408 7269/6750/6260
f 7343/6901/6407 1631/6903/6409 7344/6904/6410 3644/6902/6408
f 7269/6750/6260 3644/6902/6408 7345/6905/6411 1595/6753/6263
面是由點構成的。一行有幾個空格(n)區分,就有n+1個點。opengl允許繪製多邊形,所以一行可以有多個點構成。
每個點又分為3項:頂點位置座標索引、頂點紋理座標索引、頂點法向量座標索引。
注意:這裡都是索引。為什麼引入索引?--方便查詢。
頂點位置座標索引對應obj檔案的v資料;
頂點紋理座標索引對應obj檔案的vt資料;
頂點法向量座標索引對應obj檔案的vn資料;
我們要根據索引一步一步找到obj檔案中各個點對應的真實資料。這樣才能進行繪製。
OpenGL讀取Obj模型檔案
想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每一行,都有極其相似的格式。在obj檔案中,每行的格式如下 字首 引數1 引數2 引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是...
opengl讀取OBJ模型檔案
要順利讀取 obj模型檔案,先要了解obj檔案的格式。obj檔案格式是非常簡單的,它以純文字的形式儲存了模型的頂點 法線和紋理座標和材質使用資訊。obj檔案的每行的格式如下 字首引數1引數 2引數3 其中,字首標識了這一行所儲存的資訊型別。引數則是具體的資料。obj檔案常見的的字首有 v表示本行指定...
OpenGL讀取Obj模型檔案
2012 09 07 19 16 01 分類 計算機圖形學 舉報 字型大小訂閱 昨天,幫助別人寫了乙個程式,讀取obj檔案中的3d模型,就學習了下使用opengl如何讀取這種檔案。想要順利讀取obj模型檔案,先要了解這種檔案的格式,obj檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 ...