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();


        }

为了表示成功了,还是贴一个图吧!


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值