日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opengl关于obj文件相关知识

發(fā)布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opengl关于obj文件相关知识 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先看一下obj文件格式:

?obj文件中可以有v(頂點(diǎn)位置)、vt(頂點(diǎn)紋理坐標(biāo))、vn(頂點(diǎn)法向量)、f(面)開頭的四種類型數(shù)據(jù)。

?所有的obj文件中都有v型數(shù)據(jù)。格式如下:

v 0.437500 0.164062 0.765625 v -0.437500 0.164062 0.765625 v 0.500000 0.093750 0.687500

  • vt(頂點(diǎn)紋理坐標(biāo)),格式如下: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(頂點(diǎn)法向量坐標(biāo)),格式如下: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現(xiàn)一一分析介紹:
  • 1.v(頂點(diǎn)坐標(biāo)位置): ?可以看到v后面有三個參數(shù),分別代表該頂點(diǎn)的x、y、z三個坐標(biāo)值。 2.vt(頂點(diǎn)紋理坐標(biāo)): ?vt后面兩個參數(shù),分別代表紋理的U、V值。 3.vn(頂點(diǎn)法向量): ?vn后面三個參數(shù),分別代表法向量的x、y、z值。 對于頂點(diǎn)法向量想說的是:我們向opengl中導(dǎo)入3D模型時,如果obj文件中沒有vn,就需要我們手動計(jì)算面片的法向量, 否則顯示出來的圖形可能不正確。如果obj文件中有vn,那么,我們就一個點(diǎn)一個點(diǎn)進(jìn)行繪制,不需要計(jì)算面的法向量。 vn表示的是頂點(diǎn)的法向量,不是面的法向量。 ?舉個例子:如果繪制的是四角面片(網(wǎng)上太多例子是三角面片了) VN[0] = (vnSets[firstVertexIndexf])[0];//第一個點(diǎn)的法向量的x VN[1] = (vnSets[firstVertexIndexf])[1];//第一個點(diǎn)的法向量的y VN[2] = (vnSets[firstVertexIndexf])[2];//第一個點(diǎn)的法向量的z glNormal3f(VN[0], VN[1], VN[2]); glVertex3f(V1[0], V1[1], V1[2]);VN[0] = (vnSets[secondVertexIndexf])[0];//第二個點(diǎn)的法向量的x VN[1] = (vnSets[secondVertexIndexf])[1];//第二個點(diǎn)的法向量的y VN[2] = (vnSets[secondVertexIndexf])[2];//第二個點(diǎn)的法向量的z glNormal3f(VN[0], VN[1], VN[2]); glVertex3f(V2[0], V2[1], V2[2]);VN[0] = (vnSets[thirdVertexIndexf])[0];//第三個點(diǎn)的法向量的x VN[1] = (vnSets[thirdVertexIndexf])[1];//第三個點(diǎn)的法向量的y VN[2] = (vnSets[thirdVertexIndexf])[2];//第三個點(diǎn)的法向量的z glNormal3f(VN[0], VN[1], VN[2]); glVertex3f(V3[0], V3[1], V3[2]);VN[0] = (vnSets[fourthVertexIndexf])[0];//第四個點(diǎn)的法向量的x VN[1] = (vnSets[fourthVertexIndexf])[1];//第四個點(diǎn)的法向量的y VN[2] = (vnSets[fourthVertexIndexf])[2];//第四個點(diǎn)的法向量的z glNormal3f(VN[0], VN[1], VN[2]); glVertex3f(V4[0], V4[1], V4[2]);這樣就可以繪制出四邊形了。
    4.f(面): 面較為復(fù)雜,如果是簡單的obj文件,面的格式可以為:f 47 1 3 f 4 2 48 f 45 3 5 f 6 4 46復(fù)雜的可以為: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面是由點(diǎn)構(gòu)成的。一行有幾個空格(n)區(qū)分,就有n+1個點(diǎn)。opengl允許繪制多邊形,所以一行可以有多個點(diǎn)構(gòu)成。 每個點(diǎn)又分為3項(xiàng):頂點(diǎn)位置坐標(biāo)索引、頂點(diǎn)紋理坐標(biāo)索引、頂點(diǎn)法向量坐標(biāo)索引。 注意:這里都是索引。為什么引入索引??--方便查找。 頂點(diǎn)位置坐標(biāo)索引對應(yīng)obj文件的v數(shù)據(jù); 頂點(diǎn)紋理坐標(biāo)索引對應(yīng)obj文件的vt數(shù)據(jù); 頂點(diǎn)法向量坐標(biāo)索引對應(yīng)obj文件的vn數(shù)據(jù); 我們要根據(jù)索引一步一步找到obj文件中各個點(diǎn)對應(yīng)的真實(shí)數(shù)據(jù)。這樣才能進(jìn)行繪制。



    總結(jié)

    以上是生活随笔為你收集整理的opengl关于obj文件相关知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。