opengl關於obj檔案相關知識

2021-08-15 10:19:43 字數 3157 閱讀 5475

首先看一下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檔案格式是非常簡單的。這種檔案以純文字的形式儲存了模型的頂點 ...