在最开始先贴出源码的下载路径:数组
最第一版本: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)。
this
【下载前请读】spa
1. 这两份资源,是我在大一时作的代码。若须要了解进一步优化,请邮箱联系我。.net
2. 为何分红了两部分上传?由于CSDN的缘由,我至今没法删除已上传过的资源,因此干脆单独上传了以前漏掉的头文件。我上传过的大多数文件积分最初设置是0-5分,可是CSDN换成新版以后,个人全部资源都设成了须要积分下载,且原有积分都被提升了(我估计是CSDN须要各位充钱)。若是没有积分的朋友,能够邮箱联系我,我有时间给您单独发~~~设计
可是!居然有人举报我????我滴个天鸭,分享资源还要被骂的,何况这分数还不是我本身设置的,搞不明白!!!!! 生气!!但愿各路大仙们,有问题好好交流。说实话,我本没有分享代码的义务的,可是由于我本身在初学计算机图形学时遇到太多困难,因此分享出这些入门级代码也写了一些小教程来帮助初学者。我也知道喷子是少数,可是国内为啥分享的氛围很差,我以为很大程度上拖了这帮自私者的福。3d
不少涉及科研的工做天然不能分享,可是我仍是很乐意帮助初学者去入门这个领域,和讨论学术性问题。我也开发了不少建模辅助性工具,免费分享出来。但愿各位能经过个人代码,对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文件中的数据,并采用索引数组的方式渲染出模型,这里很少赘述,诸位能够参考一下代码。