您的位置:首页 > 运维架构

opengl加载obj模型

2016-08-18 23:04 288 查看
一、首先来分析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();

}

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: