读取obj+mtl 文件 (OpenGL C++)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 02:14   14   0

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

对于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中,三个顶点构成的面与四个顶点构成的面,我都用了三角面片来表示。具体的看注释。

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP