最近一直在研究如何将3D模型导入OpenGL,略微有些进展,在附录部分把它记录下,希望能起到抛砖引玉的作用,有不足的地方,请大家指出。

1. 简述

如果想把做场景做的复杂,导入3D模型是一个必不可少的过程,网络上有很多方法,但是笔者找了很久,也许能力欠缺,找到的方法都不尽如人意,现在在此进行总结,希望对后来的同学有所帮助。

2. 模型转换

关于选取读取模型的格式,笔者使用的是3DS,至于为什么选这种格式,一个是因为网络上有读取3DS文件的类;二是因为3DS文件可以由3DSMAX转换而来,资源丰富,便于使用。

2.1 3DSMAX

相信这款软件大家都耳熟能详,笔者使用的是3ds Max 2014,至于有人问为什么使用如此高的版本,我在这里做出的解释是有些网络上的资源使用的是高版本,对于3DSMAX来说,低版本打开高版本有些困难,为了方便就使用了高版本(机器配置不好的同学建议还是使用低版本)。

下面介绍下如何使用:

网络上下下来的有很多是.max文件,在这里我们要把它转换成3DS文件,首先我们打开.max文件,如图1:

图1 打开.max文件

这里使用的模型是刺客信条的主角,很帅吧。打开模型后,我们需要进行很重要的优化,非常重要,否则你导入OpenGL后会非常卡。

在3DSMAX中按数字“7”键(注意,不是小键盘7),然后会显示模型文件的面数和顶点数,如图2:

图2 显示出点面数

为了保证导入时候的速度,减少点面数是十分有必要的,但是记住不能使图像变得太粗糙,这里我们开始优化操作。笔者使用的是最基本的优化操作ProOptimizer。先全选所有对象,然后再选择右边的按钮,之后选择修改器列表,在下拉列表中找到ProOptimizer。

如图3所示:

图3 ProOptimizer

之后我们要进行点面优化。很傻瓜话的一个插件,具体操作可以百度,在这里笔者只说下简单的过程。优化级别里,100%就是需要保留的顶点数,点击计算,就可以看到计算前后的点面数。接下来说最好勾选的几个选项,如图4所示:

     

图4 推荐勾选的几个选项

另外需要说明的是,ProOptimizer操作可进行多次叠加。笔者建议的是最好进行多次微调,而不是一次性进行大幅度调整。读者自己慢慢体会。

在进行优化之后,我们需要把模型另存为3DS格式。选择文件->导出->导出。

如图5(1)所示:

图5(1) 导出3DS

之后我们选择需要导出到的文件夹,这里我们最好选择之前.max文件所在的目录。下拉列表中选择*.3ds格式。

如图5(2)所示:

图5(2) 保存3ds格式

然后勾选保持MAX的纹理坐标,点确定(很重要)。这样,我们成功的转换了个3DS文件。

2.2 3DS文件的加工处理

接下来,我们用Deep Exploration 6.3打开3ds文件。如果你刚刚把3ds文件保存在.max文件的目录下,恭喜你,你不用再贴纹理了,否则,你还需要自己一个一个贴纹理。下面是有无纹理的对比。

如图6所示:

   

图6 有无纹理比较

网络上有很多人卡在这一步,如果没有纹理应该怎么贴呢?总的来说,出现纹理缺失有很多原因,有些是因为作者没有把纹理全部打包,有些则是因为导出过程出错,需要自己手动加载。对于前一种情况,自求多福吧,对于后一种情况,我们需要自己手动把纹理加上。

假设我们现在缺少头部纹理,我们需要到下载的文件里头找纹理。现在我们直接双击头部,在弹出对话框中选择属性,然后选择漫反射,再选择浏览,找到纹理后点确定。

如图7所示:

图7 选择纹理

添加纹理之后的图像如图8所示:

图8 添加纹理之后的图像

然后点确定,纹理就添加完毕了。

这里我们需要注意一个问题,网络上有非常非常多人卡在这一步,就是为什么纹理全部添加完毕之后,导入过程还一直出错。原因就是,在3ds文件中,每个纹理槽都必须对应一个纹理(请容许我称呼它为纹理槽),否则导入过程中就会提示找不到文件,因为读入过程中OpenGL会读入3ds文件的材质(就是纹理槽),但是找不到纹理文件,指针就会为NULL,这时候自然而然就会报错了。

此时,我们有两种解决方案。第一种,从代码入手,自动忽略为NULL的纹理。第二种,我们从文件入手。这里我将会详细说明如何从文件入手,至于代码方面,网络上各种3ds导入类,质量参差不齐,不太好做统一说明。

我们点开场景标签,再打开材料文件夹,这里你会发现一些有趣的东西。

如图9所示:

图9 材料文件夹

这里就是纹理和纹理槽相对应的地方(请再次容许我称呼它为纹理槽),有些文件名左侧的小球上有感叹号,有些那个小球是灰色的。如果我们想成功导入3ds文件的话,这两种情况是不允许出现的,我们只容许一个小球上出现灰色,那就是,其他的坚决不容许。先说明下,有感叹号的小球是因为纹理槽指定了纹理,但是系统找不到纹理文件,灰色小球是因为纹理槽根本没有纹理。再次强调,这两种情况千万不能出现!!对于前者,能找到纹理最好,否则就直接删掉它,至于灰色小球,直接删掉吧,除非你能找到合适的纹理给他贴上(这里删除纹理推荐使用3D Exploration)。

还需注意一定的是,如果读者发现有个别文件无法读入纹理,但是也不报错,请注意,max文件中是否包含了一种叫做多维子材质的纹理,如果有这样的纹理,需要进行材质分解,所需要的工具笔者会打包给大家。

假设以上的步骤大家都处理好了,下面我们可以进行保存了。保存纹理和新的3ds到同一个目录下(最好新建一个目录)。

具体设置如图10所示:

图10 推荐设置

这样,我们就成功保存了可以导入OpenGL的3ds文件。

3.导入OpenGL

终于到了激动人心的一环,小伙伴。做到这一步,如果人品没问题的话,都可以成功的导入3ds。但是,比较遗憾的是,由于不同的人用的导入代码不同,我这里只能介绍我所使用和修改的3DS导入类,因为进行了封装,使用起来还是很方便的,有兴趣的同学可以联系我。

3.1 放置文件

3ds文件和纹理文件分别放在data\models和data\textures目录下。

3.2 修改代码

首先,我们需要修改GLBase.h文件,添加进新的3DS文件所在的路径。

如图11所示:

图11 写入文件名

然后在静态模型类的头文件Static3DS.h中用模型类定义个g_CKXT对象。

如图12所示:

图12 定义“刺客信条”对象

接下来在Static3DS.cpp中初始化g_CKXT对象,写入坐标和缩放比例与文件名。缩放比例与坐标需要进行多次调整。

具体代码如图13所示:

图13 初始化3DS模型

接着根据3DS文件进行数据初始化。

如图14所示:

图14 初始化3DS模型中的数据

接着进行渲染3DS模型。

如图15所示:

图15 渲染

至此,3DS文件已经成功导入。效果如图16所示:

图16 导入后的模型

后记

经历了半个月左右的周折,计算机图形学作业基本完成。首先,感谢读者能够耐心读完,附录部分算是笔者收获最多的地方,网络上目前没有一个比较完整关于3DS文件导入OpenGL的解决方案,所以才写了这篇附录,希望能为后来者提供方便;其次,笔者深知毫无技术含量,但是还是写了好多,算是无知无畏吧。以后需要学习的东西还有好多,笔者也需知耻而后勇。

最后要说的是,请原谅我的排版。

OpenGL导入3DS专题相关推荐

  1. blender 导出 obj 格式,3dsmax 导入3ds max obj 格式数据

    blender 导出 obj 格式,3dsmax 导入3ds max obj 格式数据 blender 导出 3dsmax 导入

  2. png在ai转为路径_AI路径导入3ds Max并导出图像

    在使用3ds Max的过程中有时会用到比较复杂的路径,虽然它本身的路径功能很齐全,但对于我来说,它操作起来很别扭,不顺手. 相比之下,AI 的路径功能比较强大,且操作起来很方便.所以我一般是在AI画好 ...

  3. SketchUp导入3ds文件单位错位的问题

    在导入3ds文件时,选择文件对话框右侧点击选项,将比例选择与原三维场景中单位一致.

  4. 仙剑模型的截取以及导入3ds max中

    仙剑模型的截取以及导入3ds max中. 我前几天截取了 仙剑三, 外传, 仙剑四的游戏模型. 许多人问我是怎么截取的.还有些同学不知道怎样导入贴图. 而且以前做的那个教程没有几个人能看懂. 特地制作 ...

  5. Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)

    参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...

  6. QT+OpenGL导入STL文件(二进制/ascll码格式),鼠标交互实现缩放旋转

    碎碎念 由于课设和大创涉及到了模型的旋转,因此专门去学习了模型的导入,也是废了不少心思,现在总结一下两种格式的简单导入,以及对stl模型两种格式的简单介绍.网上有很多大佬都有详细的解答,结尾附上链接: ...

  7. stp格式文件导入3ds Max MaxScript批处理工具

    〇.说明 0.除自定义脚本,其余示例摘自3DS MAX 2017 Help 1.将乱码部分统一命名,调整规则如下: a.mesh节点:如果mesh乱码,其父物体命名正确,则将其命名为与父物体同名: b ...

  8. opengl基础学习专题 (二) 点直线和多边形

    题外话 随着学习的增长,越来越觉得自己很水.关于上一篇博文中推荐用一个 学习opengl的 基于VS2015的 simplec框架.存在 一些问题. 1.这个框架基于VS 的Debug 模式下,没有考 ...

  9. [OpenGL]导入obj文件

    通常来说我们构建一个模型是比较复杂的工作,那么我们还有什么途径获得模型呢.其中一种方法就是导入obj模型,不要被这个名词给吓到了,其实就是把一个制作好的模型保存到一个文件中,我们称为obj文件. 先上 ...

最新文章

  1. 【网络安全】Windows恶意软件BazarLoader分析
  2. STM32开发 -- IAP详解
  3. 如何隐藏SAP Spartacus home页面标准的header区域
  4. ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
  5. uwp连接mysql数据库_在 UWP 应用中使用 SQLite 数据库
  6. DOM概述 选取文档元素 1
  7. WCF 部署在IIS上
  8. Atitit.木马病毒的免杀原理---sikuli 的使用
  9. 一个网站的诞生- MagicDict开发总结1 [首页]
  10. c语言程序游戏例子,C语言编程——取石子游戏实例解答
  11. 信息系统项目管理师(2022年)—— 重点内容:项目风险管理(11)
  12. 云服务器安装Linux桌面,centos 云服务器有桌面吗 如何进行安装
  13. python爬取歌词_利用Python网络爬虫抓取网易云歌词
  14. Linux下四款Web服务器压力测试工具…
  15. 物理学专业英语(词汇整理)--------03
  16. 小程序拼团营销怎么做
  17. C++的time_t 和 struct tm 类型【s
  18. P2294 [HNOI2005]狡猾的商人(带权并查集+前缀和)
  19. 计算机和计算机思维理论考试试题科目一,2020税务师考试答题方式、输入法要求及考试题型!...
  20. 单目标跟踪算法:Siamese RPN论文解读和代码解析

热门文章

  1. 计算机系统基础实验 pa1
  2. (二)xlwt模块详解--设置列宽、行高
  3. Word中下划线自动换行版式不…
  4. 教你识别思科交换机型号
  5. 电脑win10系统如何开定位服务器,Win10系统定位功能如何打开 Win10系统定位打开方法...
  6. 虹科教您|实现OPC UA C/S快速部署及数据采集
  7. c语言程序负数,C程序,检查数字是正数还是负数
  8. Linux 2.6内核的设备模型
  9. 快递电子运单上,电话应隐藏6位以上,禁止显示这些信息
  10. Qt开发之QLineEdit简单介绍