【openGL2021版】obj模型
大家好,我是Lampard猿奋~
欢迎来到船新的openGL基础系列的博客,今天学习的是obj模型
(一)要做什么
上周我们给制作的图形(三角形,矩形)贴上了皮肤,学习到了法线,光照,纹理坐标等知识。然后又解读了obj格式的文件
因此本周我们只需要解码这个obj文件,然后利用openGL给我们接口,去批量的生成绘制的点,就很方便的画出我们想要的图形了
(二)解码obj数据
(1)obj文件格式
一个obj格式的文件可能包含了顶点数据,自由形式的曲面/表面属性,绘制索引序列,自由形式的曲面/表面内容声明,关联自由形式的表面,组和渲染属性信息。我们关注的是顶点数据以及点的组成方式
下图中v代表的是顶点的坐标,vt代表的是纹理坐标,vn代表的是法线。f后面接的是三个点,三个点组成一个三角形,如“1/1/1”代表用第一个顶点信息,第一个纹理坐标信息以及第一个法线信息构成一个点,然后由点‘1/1/1’,“2/2/2”和“3/3/3”来构成一个面
(2)读取需要的内容
在创建对象的时候需要先创建一个对象的类,我们首先需要在Init方法中读取obj格式文件的数据,然后在draw方法中去调用API绘制图形,其头文件包含以下的内容
其中VertexData是这样的一个结构,记录每个点三项属性的数据,实际去重后有多少个点
mIndices是记录第几个点的一个数组,如上图obj格式中,就是1,2,3,3,2,4(两个三角形有6个点,但是实际我们只需要绘制4个点),具体的读取字符串的方式就不表了,打印一下存储的内容
(三)调用openGL接口生成模型
绘制就比较简单了,我们可以利用glTexCoord2fv,glNormal3fv以及glVertex3fv来绘制我们的点,然后在main中调用这个draw方法即可。我们上图的正方形obj绘制出来的结果是这样:
使用线框模式glPolygonMode(GL_FRONT, GL_LINE);可以明显的看出每个点之间的关系
同样的我们可以把一个球模型放进去看看效果
这是线框模式下的球,可以看到一个球就是由不同的三角形面组成的,而我们就可以利用编辑器像maya这种制作模型,然后导入到引擎中,非常方便