opengl加載obj模型

一、首先來分析obj模型的基本格式

1、註釋

# This file uses centimeters as units for non-parametric coordinates.

解析:完全沒用的信息,很多時候裏面的關鍵字干擾文件讀取,建議直接刪除。

2、v 

v -4.155522 -0.314289 -1.723965
v -3.829932 -0.314289 -1.723965
v -4.017903 0.116516 -1.723965
v -3.603311 0.116516 -1.723965
v -4.017903 0.116516 -1.920677
v -3.603311 0.116516 -1.920677
v -4.155522 -0.314289 -1.920677
v -3.829932 -0.314289 -1.920677
v -4.046617 0.035995 -1.689540
v -4.046617 0.035995 -1.955102

解析:代表三維頂點座標

3、vn

vn -0.163981 -0.965497 0.202302
vn -0.191392 -0.961027 0.199489
vn -0.137743 -0.819877 0.555724
vn -0.111407 -0.671794 0.732312
vn -0.132362 -0.679175 0.721943
vn -0.162052 -0.821792 0.546258
vn -0.169777 -0.694476 0.699199
vn -0.204294 -0.825628 0.525930

解析:代表法向量座標

4、f

形式一:三角面片

f 2082/2094/2101 2065/2077/2084 2083/2095/2102 

解析:

點集合2082,2065,2083 三個頂點構成一個面片,即帶v的行裏的這三行的數據

三個點的紋理映射分別是貼圖集合的2094、2077、2095個,即帶vt的行裏這三行的數據

三個點法向量分別是貼圖集合第2101、2084、2102,即帶vn的行裏這三行的數據


f   頂點1/頂點1的貼圖/頂點1的法向量    頂點2/頂點2的貼圖/頂點2的法向量   頂點3/頂點3的貼圖/頂點3的法向量 


形式二:四邊形面片,比上面多一項


形式三:純頂點(三項或四項代表三角形面片和四邊形面片)

f 6289 6282 1602 6286 
f 6287 6289 6286 313 
f 1603 6288 6289 6287 
f 6288 1606 6282 6289 
f 6292 1606 6288 6293 
f 6290 6293 6288 1603 
f 312 6291 6293 6290 
f 1604 6292 6293 6291 
f 6295 1605 6283 6296 
f 6296 6283 1606 6292 
f 6294 6296 6292 1604 
f 309 6295 6296 6294 
f 6300 316 6297 6301 


形式四:有負數

暫時沒遇到,略了先哈....


二、opengl繪製

分析完格式,就是如何組織數據結構,加載並繪製了。

此處沒什麼技術含量,注意向量對光照的影響很大。

棱角的物體(如棱錐,立方體),最好採用面向量,即每次畫三角形面片和四邊形面片之前,只用glNormal3f指定一次面的向量,就開始畫。

形狀豐富自由的物體(絕大多數物體),採用點向量,畫面片的每個點之前,用glNormal3f指定該點的向量。

加載完後,繪製過程如下:

   

                for(int i=0;i<facelist.size();i++)
        {
            glBegin(GL_QUADS); //開始繪製四邊形面片
            int p1=facelist[i].v1;
            int p2=facelist[i].v2;
            int p3=facelist[i].v3;
            int p4=facelist[i].v4; //取面片的四個點的索引


            vertex v1=vertexlist[p1-1];
            vertex v2=vertexlist[p2-1];
            vertex v3=vertexlist[p3-1];
            vertex v4=vertexlist[p4-1]; 


            int n1=v2n[p1]-1;
            int n2=v2n[p2]-1;
            int n3=v2n[p3]-1;
            int n4=v2n[p4]-1; //取四個點各自的法向量的索引



            glNormal3f(normallist[n1].x,normallist[n1].y,normallist[n1].z); //指定法向量
            glVertex3f(v1.x,v1.y,v1.z); //繪製


            glNormal3f(normallist[n2].x,normallist[n2].y,normallist[n2].z);
            glVertex3f(v2.x,v2.y,v2.z);


            glNormal3f(normallist[n3].x,normallist[n3].y,normallist[n3].z);
            glVertex3f(v3.x,v3.y,v3.z);


            glNormal3f(normallist[n4].x,normallist[n4].y,normallist[n4].z);
            glVertex3f(v4.x,v4.y,v4.z);


            glEnd();


        }

爲了表示成功了,還是貼一個圖吧!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章