一、首先来分析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();
}
为了表示成功了,还是贴一个图吧!