读取obj+mtl 文件 (OpenGL C++)源码已经上传了

本学期我们开设了计算机图形学的课,最后的大作业老师要求做一个场景,为了使做出的场景更美观,写了这个读取obj文件的程序,从CG模型网上下载了一些模型并加载,如图所示,大部分的模型都能够加载成功,由于我只写了加载jpg类型图片的代码,要是需要加载其他类型图片,则需要增添一些代码。

读取obj+mtl 文件 (OpenGL C++)源码已经上传了_第1张图片读取obj+mtl 文件 (OpenGL C++)源码已经上传了_第2张图片读取obj+mtl 文件 (OpenGL C++)源码已经上传了_第3张图片

对于mtl以及obj文件的格式在这里就不细说了,网上也有更详细的,这里主要说一下我读取文件的基本思路。

mtl文件的读取,我们首先要做的就是分割每个数据,如下图 我们需要按行分割,以及将每一行中的数据按空格切分。相当于分割字符串。map_Ka 表示引用图片。因此当读取到map_Ka 这个字符串时,要把下一个字符串设为读取纹理的地址。

map_Ka ggtt_jiaoliang_002.jpg
newmtl Material__58
	Ns 10.0000
	Ni 1.5000
	d 1.0000
	Tr 0.0000
	Tf 1.0000 1.0000 1.0000 
	illum 2
	Ka 0.5880 0.5880 0.5880
	Kd 0.5880 0.5880 0.5880
	Ks 0.0000 0.0000 0.0000
	Ke 0.0000 0.0000 0.0000
	map_Ka ggtt_jiaoliang_002.jpg
	map_Kd ggtt_jiaoliang_002.jpg

其它的 例如Ka Kd等表示的都是材质光照之类的,有对应的opengl函数可以设置。如下:为一个例子

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, m_mtls[i]->Ka);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, m_mtls[i]->Kd);
在读取obj文件中,除了要分割空格,还要分割 "/" ,当读取的第一个数据内容为f时,就需要分割“/”
f 1/1/1 2/2/1 3/3/1 4/4/1 
f 1/1/2 5/5/2 6/6/2 2/2/2 
f 7/7/3 8/8/3 2/2/3 6/6/3 

分割后,再进行存储数据。

在obj中,三个顶点构成的面与四个顶点构成的面,我都用了三角面片来表示。具体的看注释。

先写到这儿~有时间再继续写

你可能感兴趣的:(计算机图形学,OpenGL)