1、Obj模型数据格式
obj模型文件是文本文件,主要由以下几部分组成:
;模型用贴图的描述文件,mtl文件描述贴图文件的信息,包括文件名等
mtllib xxx.mtl
;顶点坐标数据
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
…
;纹理坐标的定义
vt 0.748573 0.750412
vt 0.749279 0.501284
vt 0.999110 0.501077
…
;顶点的法向量
vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
…
; 面数据:面使用1/2/8这样格式,表示顶点位置/纹理坐标/法向量的索引,这里索引的是前面用v,vt,vn定义的数据 注意这里Obj的索引是从1开始的,而不是0
f 5/1/1 1/2/1 4/3/1
f 5/1/1 4/3/1 8/4/1
f 3/5/2 7/6/2 8/7/2
2、源码演示
#include "Model.h"
Model ourModel("model/nanosuit.obj");
GLint Step12_xAngle = 0;
GLint Step12_yAngle = 0;
GLint Step12_zAngle = 0;
GLint Step12_fScale = 90;
GLint Step12_lid = 0;
GLfloat Step12_noLight[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat Step12_ambientLight[4] = { 0.3f, 0.3f, 0.3f, 1.0f };
GLfloat Step12_diffuseLight[4] = { 0.7f, 0.7f, 0.7f, 1.0f };
GLfloat Step12_brightLight[4] = { 1.0f, 0.5f, 0.5f, 1.0f };
GLfloat Step12_lightPos[] = { 5.0f, 5.0f, 5.0f, 1.0f };//光的位置在右上角
void Step12_Display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
glClearColor(0, 0, 0, 0);
glLoadIdentity(); // 重置模型观察矩阵
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
//开启颜色追踪
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
//设置光照环境
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Step12_noLight);
glLightfv(GL_LIGHT0, GL_AMBIENT, Step12_ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, Step12_diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, Step12_brightLight);
glLightfv(GL_LIGHT0, GL_POSITION, Step12_lightPos);
glRotatef(Step12_xAngle, 1.0, 0.0, 0.0);
glRotatef(Step12_yAngle, 0.0, 1.0, 0.0);
glRotatef(Step12_zAngle, 0.0, 0.0, 1.0);
glScalef(0.5, 0.5, 0.5);
glColor3f(1, 1, 0.6);
ourModel.Draw();
glutSwapBuffers();
}
运行结果演示:
、
3、下载工程项目文件
在Debug x86下载编译成功。