学习OpenGL ES for Android(十五)— 模型结构

在之前的文章中都是我们使用代码绘制的图形图像,而如果我们想要使用别人设计的模型时就需要使用到模型加载。和桌面不同的是,Android上的模型加载库推荐使用jPCT-AE,官网http://www.jpct.net/jpct-ae/,可以直接下载并参考文档学习使用。当3D大师们使用Blender3DS Max或者Maya等软件制作模型后,可以导出例如.blend,.x3d,.obj等等各种类型的文件,我们要使用.obj类型的文件来读取模型的信息。jPCT-AE软件已经封装好读取的方法,虽然jPCT-AE使用方便,但是因为它封装了各个功能,使用起来就变成了它的方法调用而不是我们熟悉的OpenGL ES代码了,这里我们还是选择自己封装读取方法。

一个模型的文件可能只有一个obj文件,此时表示该模型没有纹理文件,只是使用纯色来绘制的图形;当有纹理文件时,还会有一个.mtl文件,用来存放纹理文件信息,还会有各种图片。我们这里使用免费的3d网站(https://free3d.com/)来找一些模型,我们找一个简单的没有纹理的模型:https://free3d.com/3d-model/plastic-cup-high-poly-version-79161.html,下载之后我们使用文本编辑器打开.obj文件。参考https://en.wikipedia.org/wiki/Wavefront_.obj_file我们先分析下obj文件的内容格式

#开头 注释行,读取时忽略

mtllib file.mtl 使用的纹理文件名

g default 使用的组名称(一个obj可含多个group)

o testvt.obj 对象名称(Object name)

v -0.5 -0.5 0.1 顶点

vn 0 0 1 法向量(可能不是单位向量)

vt 0 1 纹理坐标

usemtl Default 当前所用纹理

f 1 2 3 4  四边形顶点索引,索引起始于1

f 1 2 3  三角形顶点索引

f 1/1 2/2 3/3 顶点索引/纹理索引

f 1//1 2//2 3//3 顶点索引//法向量索引

f 1/1/1 2/2/1 3/3/1 4/4/1 顶点索引/纹理索引/法向量索引

l 5 8 1 2 4 9   线  暂时忽略​

读取文件时,忽略掉注释行,然后根据开头的字符来读取数据,若是顶点数据,纹理数据,法向量数据,分别存储到列表中,随后我们读取索引,读取完成后再根据索引设置真正的顶点,纹理和法向量数据。读取模型信息的工具类源码地址:https://github.com/jklwan/OpenGLProject/blob/master/sample/src/main/java/com/chends/opengl/utils/model/LoadObjectUtil.java

我们先尝试读取这个没有纹理的模型,模型是一只鹿,因为它的顶点比较大,我们设置观察点时需要注意,绘制方面就比较简单了,和绘制三角形没有区别,这里我们设置颜色固定为白色,效果图如下

因为都是白色的,只能看到轮廓,无法看到细节,使用纹理才能看到更好的效果,下一章我们学习纹理和光照效果的读取与设置。

源码地址https://github.com/jklwan/OpenGLProject/blob/master/sample/src/main/java/com/chends/opengl/renderer/model/LoadModelRenderer.java

发布了53 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/jklwan/article/details/103808993