OpenGL读取obj模型 源码 以及文件解析

心不动则不痛 提交于 2020-10-12 08:32:47

在最开始先贴出源码的下载路径

最初版本:http://download.csdn.net/detail/mahabharata_/9614958  

! 最新版本: 主体代码 http://download.csdn.net/detail/mahabharata_/9821347

                        漏掉的一段reference.h :http://download.csdn.net/detail/mahabharata_/9847993

                       (对于最新版本,这两个链接都要下载,因为我在reference.h中实现了一些接口)

                    本来是免费资源,但是CSDN换新版后给我调了。
                    因为CSDN无法调整积分,如果没有积分的可以邮箱联系我直接发(liuzh96@outlook.com)

【下载前请读】

1. 这两份资源,是我在大一时做的代码。若需要了解进一步优化,请邮箱联系我。

2. 为什么分成了两部分上传?因为CSDN的原因,我至今无法删除已上传过的资源,所以干脆单独上传了之前漏掉的头文件。我上传过的大多数文件积分最初设置是0-5分,但是CSDN换成新版之后,我的所有资源都设成了需要积分下载,且原有积分都被提高了(我估计是CSDN需要各位充钱)。如果没有积分的朋友,可以邮箱联系我,我有时间给您单独发~~~

但是!竟然有人举报我????我滴个天鸭,分享资源还要被骂的,况且这分数还不是我自己设置的,搞不明白!!!!!  生气!!希望各路大仙们,有问题好好交流。说实话,我本没有分享代码的义务的,但是因为我自己在初学计算机图形学时遇到太多困难,所以分享出这些入门级代码也写了一些小教程来帮助初学者。我也知道喷子是少数,但是国内为啥分享的氛围不好,我觉得很大程度上拖了这帮自私者的福。

很多涉及科研的工作自然不能分享,但是我还是很乐意帮助初学者去入门这个领域,和讨论学术性问题。我也开发了很多建模辅助性工具,免费分享出来。希望各位能通过我的代码,对Computer Graphics感兴趣。

 

程序执行结果如下:

         

       这个程序是博主大二暑假写的,现在的这一段话是发表这边博文后的一年才加上的,回看那个时候的程序,我滴妈,我竟然不会使用顶点数组啊,也没有速度优化啊,而且只能支持单纹理文件,读取方法也非常局限。因此,现在在原来的基础上重新上传了一个最新版本。

 

说明:

      两个版本的代码是Qt下,使用C++/OpenGL编写的。

      - 最初的版本:

             1. 仅仅支持单个纹理、对mtl文件的诸多材质不能很好的处理。

             2. 采用最原始的方法glvertex..()显示顶点,计算效率非常低。

             3. 这个版本是完整的工程文件,使用qt加载之后,可以直接运行。

      - 最新的版本:

             1. 能够支持多个纹理文件,能够解析包含多种材质的mtl文件。

             2. 使用vertex array改进绘制方式,渲染速度有了很大的提高~。

             3. 这里上传的是.h和.cpp文件,在.h文件中仅仅包含几个函数。可以采用下面的代码来读取和显示模型。

// 加载模型
ObjLoader loader;
loader.loadFromFile("D:/ali.obj","D:/ali.mtl");

// 渲染模型
loader.renderObj();

 

使用我的代码的一个要注意的地方:

 

          需要将objLoader.cpp的72行,修改为你的电脑中纹理所在的文件夹路径。如下图所示:

三维模型比较常见的是obj模型和3ds模型,处理方法大同小异,下面先介绍一下obj文件的简单处理方法:

OBJ文件的基本结构
    OBJ文件由一行行文本组成,可以用记事本打开。注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。 注意连接符(\)后面不能出现空格或Tab格,否则将导致文件出错。
下列常用的关键字可以在OBJ文件使用。
顶点数据(Vertex data):
          v 几何体顶点(Geometric vertices)
           vt 贴图坐标点(Texture vertices)
           vn 顶点法线(Vertex normals)
           vp 参数空格顶点 (Parameter space vertices)






元素(Elements):
        p  点(Point)
             l  线(Line)
             f  面(Face)


成组(Grouping):
              g  组名称(Group name)
              o 对象名称(Object name)

显示(Display)/渲染属性(render attributes):
           usemtl 材质名称(Material name)
           mtllib 材质库(Material library)





obj文件的一个实例

 

# The units used in this file are centimeters.  
g default  
v -0.500000 -0.500000 0.500000  
v 0.500000 -0.500000 0.500000  
v -0.500000 0.500000 0.500000  
v 0.500000 0.500000 0.500000  
v -0.500000 0.500000 -0.500000  
v 0.500000 0.500000 -0.500000  
v -0.500000 -0.500000 -0.500000  
v 0.500000 -0.500000 -0.500000  
vt 0.000000 0.000000  
vt 1.000000 0.000000  
vt 0.000000 1.000000  
vt 1.000000 1.000000  
vt 0.000000 2.000000  
vt 1.000000 2.000000  
vt 0.000000 3.000000  
vt 1.000000 3.000000  
vt 0.000000 4.000000  
vt 1.000000 4.000000  
vt 2.000000 0.000000  
vt 2.000000 1.000000  
vt -1.000000 0.000000  
vt -1.000000 1.000000  
vn 0.000000 0.000000 1.000000  
vn 0.000000 0.000000 1.000000  
vn 0.000000 0.000000 1.000000  
vn 0.000000 0.000000 1.000000  
vn 0.000000 1.000000 0.000000  
vn 0.000000 1.000000 0.000000  
vn 0.000000 1.000000 0.000000  
vn 0.000000 1.000000 0.000000  
vn 0.000000 0.000000 -1.000000  
vn 0.000000 0.000000 -1.000000  
vn 0.000000 0.000000 -1.000000  
vn 0.000000 0.000000 -1.000000  
vn 0.000000 -1.000000 0.000000  
vn 0.000000 -1.000000 0.000000  
vn 0.000000 -1.000000 0.000000  
vn 0.000000 -1.000000 0.000000  
vn 1.000000 0.000000 0.000000  
vn 1.000000 0.000000 0.000000  
vn 1.000000 0.000000 0.000000  
vn 1.000000 0.000000 0.000000  
vn -1.000000 0.000000 0.000000  
vn -1.000000 0.000000 0.000000  
vn -1.000000 0.000000 0.000000  
vn -1.000000 0.000000 0.000000  
s off  
g pCube1  
usemtl initialShadingGroup  
f 1/1/1 2/2/2 4/4/3 3/3/4  
f 3/3/5 4/4/6 6/6/7 5/5/8  
f 5/5/9 6/6/10 8/8/11 7/7/12  
f 7/7/13 8/8/14 2/10/15 1/9/16  
f 2/2/17 8/11/18 6/12/19 4/4/20  
f 7/13/21 1/1/22 3/3/23 5/14/24 


这个文件看起来稍复杂一些,可以对照前面的列表查看一下每个keyword的意思:
   "vt 1.000000 0.000000"这句"vt"代表点的纹理贴图坐标。
   "vn 0.000000 0.000000 -1.000000"这句"vn"代表点的法线向量。
   "s off"表示关闭光滑组。
   "usemtl initialShadingGroup"表示使用的材质。
   "f 7/13/21"这时在面的数据中多了顶点点和纹理坐标和法线的索引号。这里f包含三组顶点,意味一个三角面,当然有时候会是n角面。
   格式:"f 顶点索引v/纹理uv点索引vt/法线索引vn"。






 

   "g pCube1"表示组。

 

   

   了解了这一些之后,我们便能够设计专门的数据结构来存储obj文件中的数据,并采用索引数组的方式渲染出模型,这里不多赘述,诸位可以参考一下代码。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!