生活随笔
收集整理的這篇文章主要介紹了
opengl关于obj文件相关知识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先看一下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.3687632. 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.9134253.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文件相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。