资源描述
2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 1 Irrlicht Engine 中文学习指南中文学习指南 收集整理:By ISclub 翻译:FK_Duzhi(感谢他)日期:2009 年 6 月 11 日星期四 前言:为了学习3D网络游戏开发,尝试过几种经典免费开源的引擎:TV3D,Irrlicht(简称Irr),Ogre等等;TV3D 目前最新的版本 V6.5 已经可以很好的支持 VB6,VC+,Delphi,.NET 等语言,特点是新手学习速度快,门槛低;缺陷是基于 ActiveX 控件,需要在运行前注册 RunTime DLL。Irrlicht 采用 C+封装的 3D 引擎,是一款轻量级的 3D 引擎,引擎本身精简强悍,功能也齐全,并且有自己专用的场景编辑器;但扩充功能不易,对于新手来说,也是难得的入门快,学习快的引擎。Ogre 是一款开源的 3D 渲染引擎,它非常强大,并且支持插件等形式来完成新的功能,这点优于 Irrlicht,但入门不易。本文翻译,以及来源载录信息来自:FK_Duzhi 大侠。2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 2 欢迎您从欢迎您从 下载最新版的下载最新版的 Irrlicht 引擎引擎 1:SDK 目录结构总述 当您下载 Irr 引擎 SDK 解压缩之后,你会看到以下文件夹:bin 完全编译好的 Irrlicht,DLL 以及一些编译好的 Demo,你可以通过这些例子来获取 Irr 的运行状态。(Windows Only)doc Irr 引擎的一些文档。examples 使用 C+编写的例子,告诉用户如何使用 Irr 引擎。使用.NET 语言编写的例子,告诉用户如何使用 Irr 引擎。exporters 一些 Irr 引擎用到的辅助库和工具。(注:部分版本没有此文件夹,该文件夹内容在 source 中,包括 Jpeglib,libpng,MacOSX,zlib 等)include 引擎包含的头文件。lib 当你使用 Irr 引擎时需要链接的库文件。media Demo 程序需要的一些图形图象和声音素材。source Irr 引擎的源代码,必要的话,你可以对其进行编译和Debug 以获得新的 lib。tools 引擎的一些有用的工具。(包含源文件)2:如何启用引擎 在 Windows 环境下启动引擎的话,你需要去binWin32-VisualStudio 目录下运行程序。或者你也可以运行一个叫 Demo.exe 的程序,它会显示一些 Irr 引擎有意思的功能。在开始我们自己的程序编写之前,你最好看看examples 目录下的例子,那里也有一个.html格式的文件对例子进行说明,以方便你的理解。(编者注:您也可以到这里获取一些例子相关的帮助)在 Linix 环境下,Irr 引擎是一个静态库。你可以使用 source/Irrlicht 中的 Makefile 文件来生成一个编译好的引擎。之后,你应当可以生成/examples 中的例子程序了吧。之后你可以立刻运行这些例子了。3:SDK 编译需求 你可以使用下列编译器之一来运行 Irr 应用程序。不过,其他编译器可能也能完美运行,但是我没有做过测试。l gcc3.3 l gcc 3.4 l gcc 4.0.3 l Visual Studio 6.0 l Visual Studio.NET 2003(7.1)l Visual Studio 2005(8.0)l Code:Blocks 1.0+gcc 或 Visio Studio Toolkit l DevC+5.0+gcc 如果你不想使用编译好的引擎库,你可以自行使用源代码进行编译,你需要以下支持:l Windows 环境下:Windows 平台 SDK(一般 IDE 里已经包含)DirectX 9 SDK(可选,进行 D3D9 支持)2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 3 DirectX 8 SDK(可选,进行 D3D8 支持)l Linux 环境下:Xserver 以及其包含文件 OpenGL 支持库(可选,包括 libGL 和 libGLU)GLX+XF86 视频扩展库(可选)4:版本注意 1:您可以在 changes.txt 中查看引擎版本的更改信息。2:请注意,那些材质纹理 3D 模型等素材的版权依旧属于其原作者,而不受本引擎版权声明影响。5:声明 这个声明是基于 Zlib/libpng 的。假若您在项目中使用了 Irr 引擎,您有权不提及它,但是还是希望您能来封感谢信。(笃志注:外国人这点就是好)请注意,Irr 引擎是基于 JPEG 库,Zlib,libpng 这些库之上的,那就意味着,如果您在自己项目中使用了 Irr 引擎,您必须在项目文件中提到你使用了这些库,并且声明感谢。当然,若您愿意声明感谢 Irr 引擎的话自然更好。更详细的声明信息建议您看 jpeglib 和 zlib 中的ReadMe 文件。Irr 引擎许可声明引擎许可声明 禁止使用本引擎进行任何不法行为,违反者后果自负。在基于下列三项要求前提下,本引擎允许任何人进行随意使用,包括制作商业软件,同样也允许你随意修改源代码。1:若您在项目中使用了本引擎,您可以在项目说明中声明感谢,不过,您也可以不做感谢声明,但是,本引擎文件来源说明绝对不允许修改删除。2:若您进行源代码修改,请务必做出明显标注。3:本份声明不允许被修改或删除。6:联系方式 如果你有问题或者建议,欢迎来访 Irr 官方网页:在官方网页您将会看到 Irr 主题的论坛,补丁,例子和其他一些帮助。如果您想加入引擎开发组,请发一封邮件至 Nikolaus Gebhardt:irrlicht 一部分朋友协助进行了部分引擎的编写和修改工作,请在这里查看完整的作者名表。2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 4 7:相关工具 为了使您在项目或游戏中使用 Irr 引擎更加方便简单,我们提供了一些外部工具。这些工具和库是完全独立于 Irr 引擎的,但是这些工具是完全针对 Irr 引擎兼容的。1:irrKlang 一个 2D 和 3D 音效引擎 irrKlang 引擎是一个免费的 2D 和 3D 音效引擎库,它提供 WAV,MP3,OGG,MOD,XM,IT,S3M 等一些音频格式的播放支持。它是由 C+编写的,下面是它的一些特性:它能够与 Irr 引擎的完美结合,因为它使用了一些Irr 简单的 API,但是又可以完全独立于 Irr 引擎使用。跨平台。支持 2D 和 3D 的流音频播放。支持回声,失真,多普勒等多种 2D3D 音频特效。支持多种音频格式:wav,mp3,ogg,mod,xm,it,s3m 等等。高级资源管理和资源探测。提供了具有可扩展型的音频解码器和 plugin 系统。免费。更详细的信息,您可以从这里获得 2:irrEdit 一个 3D 地图编辑器 irrEdit 是一个免费的 3D 地图编辑器。它能够进行场景曲线编辑,世界场景编辑,粒子系统设计,Mesh 查看等功能。它的文件保存格式为.irr 格式,Irr 引擎能够支持。它的特征包括:它包括一个高质量的地图产生器 它包括一个粒子系统编辑器 编辑器中还包括有一个自由完善的脚本系统 它包括动画器和数据编辑器 免费 因为它是使用 Irr 引擎编写的,所以它能够读取所有Irr 引擎所支持的格式。另外,它能够将一切文件保存输出为 COLLADA 文件格式。更详细的信息,您可以从这里获得 3:irrXML 一个 C+编写的最快的开源 xml 解析器 irrXML 是一个 C+编写的最快的开源 xml 解析器。它已经嵌入在 Irr 引擎中了,例如我们在读取一个.irr 或 COLLADA 格式文件时就是使用它。它非常快,又是轻量级代码,而且不浪费一点内存,是做游戏时很好的一个库。如果你的项目不使用 Irr 引擎,你又需要一个快速的 XML 解析器,建议你使用这个库。它的使用声明和 zlib 一样。更详细的信息,你可以从这里获得 2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 5 8:一些常见问题和解答 1:Irrlicht 引擎是什么?Irr 引擎是一个高性能,跨平台,开源的 3D 引擎。它能够帮助你进行实时 3D 程序的开发。它的主要目标是:方便使用,运行速度快,可扩展,线程安全。这个引擎是一个非常灵活的引擎,可以使用它编写许多不同的应用程序。例如:复杂的 3D仿真应用程序,第一和第三人称室内或室外射击游戏,策略游戏,2D 游戏等等。2:我能够在不开源的商业程序中使用这个引擎吗?你当然可以。Irr 引擎是免费的,而且完全自由的。您可以随意的编辑修改它,但是你必须标注出你的修改部分。这个引擎是基于 Zlib 的版权声明的,既非 GPL 也非 LGPL。更详细的情况,您可以查看内部的声明。3:我可以用 Irr 引擎做一款游戏吗?当然可以,而且这会很简单。但是,请注意:Irr 不是一款游戏引擎,它仅仅进行了图象处理。做为一款游戏,你需要更多的部分,例如声音输出,网络和物理系统,也需要一些游戏相关的编辑器。您当然可以选择自己制作这些编辑器,但是 Irr 引擎已经有一些现成的编辑器和库可以提供给您使用,例如 irrKlang,irrEdit。更详细的情况,您可以查看相关的说明。4:我可以为引擎做一些贡献吗?如果你编写了自己的场景节点,图片和 Mesh 读取器,或者对引擎做出了更多的扩展,请在 给我们来封论坛短信,我将会查阅您的代码,并会考虑将它发布到 Irr 主页,甚至加入到引擎 sdk 之中。在例子 这页将会告诉你如何对引擎进行扩展(笃志注:并未发现相关资料啊-难道所谓的扩展就是写几个 Demo?)如果你想加入我们的开发组,请先尝试习惯我们的代码规范。(笃志注:-并未给直接的联系方式)5:现在有很多其他的 3D 引擎可以使用,请问 Irr 引擎相对于其他 3D 引擎有什么优势?容易使用。Irr 引擎把所有常规的事情和绚丽的特效都已经做好了,您不需要花几天的时间去学习文档。例如:启动引擎,读取并显示一个 Quake3 的地图仅需要调用引擎 6 个函数,代码行数不超过 10 行,有兴趣的话,您可以查看 sdk 中的例子。灵活性强。虽然引擎很方便使用,但是你能够很容易的修改它。极其稳定。大部分实时程序在用户进行意外操作时会严重当机。但是 Irr 引擎不同,它会打印出一个警告信息,而应用程序大部分情况会继续运行。快如闪电。因为 3D 引擎的常见问题在于速度,而影响速度的主要原因在于大量的内置导入解析器,而 Irr 引擎可以直接的进行文件导入而没有使用任何转换器,节省了大量的编译时间。它支持下列格式(.3ds,.md2,.obj,.pk3,.ms3d,.bsp,.x,.bmp,.tga,.jpg,.psd,.pcx 等等)平台独立性。Irr 引擎可以在众多平台上使用。2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 6 独立 API。因为有很多种设备类型,Irr 引擎支持多种 API,当前来说是支持 OpenGL,D3D8 和D3D9 设备,一个空设备和两种软件模拟设备。甚至,在渲染的时候也允许进行设备类型的更换。不依赖其他库。Irr 引擎 sdk 不需要其他库的支持。例如,即使用户系统中没有 DirectX,引擎也能顺利运行。完善的文档。大量的例子和 Demo,并且提供了一些你在 3D 程序中常用的工具,于是你无需新建项目来做这些工作。它包括(GUI 系统工具,Font 生成工具.等)开源。这个引擎是完全免费并且开源的。你可以随意的修改它,但是你必须标注出你的修改部分。这个引擎是基于 Zlib 的版权声明的,既非 GPL 也非 LGPL。6:为什么这款引擎这么快?很多朋友给我写信说:他们使用了一些 3D 引擎,而 Irr 引擎是最快的,为什么这款引擎会这么快呢?实话说,我也不知道明确的原因,但是有以下这些可能:lrr 引擎没有象其他大部分引擎那样使用保守的拣选运算,而新式的数学拣选更加适合现代的 3D 硬件。它默认的是使用 16 位纹理图,引擎在解析和显示这些图片时候会比其他引擎快些。Irr 引擎没有使用其他比较慢的库,大部分事情都在引擎核心中实现的。7:这个引擎能够渲染多少个面?无限。OK,是接近无限。真正的限制在你的硬件。所以,根据你的需要尽管在程序中加入大量的模型面吧,只要你的游戏不卡。有些朋友问我,为什么教学例子中定义最大面数为10000,原因是我没有必要去做一个巨大的 Quake3 场景,弄的 SDK 下载包大的很。如果你想知道引擎能够支持渲染多少个面,那么你换个场景素材,自己看吧。8:我的代码里出了些问题,能帮我解决下吗?我在论坛中没有获得解答。抱歉,我没有时间为你的应用程序 Debug。很多朋友把他们的代码给我让我来解决,但是我没有时间去为每一个来信的朋友解决问题。大部分情况下都是他们自己的 C+代码原因而非引擎的错误。请打开你的Debugger用它去寻找你的程序中的错误。如果你不会使用Debugger,那么请在每一行代码前执行一句命令行打印代码,你就会找到是哪一行导致当机了。而你在论坛中获得不了帮助的大部分原因是你没有详细的描述你的问题情况。仅仅帖了 100行代码然后写句“我这里有错,请帮我解决”这样是不行的。嘿,你是个程序员,应该最少60%时间用在程序 Debug 上。这个是我 Debug 所花的时间,其他程序员或多或少,但我想都差不多。当你的程序出现错误后,请尽量自己去解决,你将会比问别人找到 bug 而获益更多。9:“Irrlicht”是什么意思?Irrlicht 是德语中的一种会发光,会飞行的神话动物。它通常生活在沼泽旁。我想,正确的英语翻译应该是”will-o-the-wisp”。同样,Irrlicht 也可以分割成两个德语单词,“irr”意思是“mad(疯狂的)”,”Licht”意思是”light(灯光)”。Irr 引擎发源于奥地利(德国南部),尽管2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 7 非德语用户可能不知道它的发音,我却认为“Irrlicht”是个好名字。因为很多用户问我这个词如何发音,我专门上传了一个声音文件,你可以听到一个女孩子说”Irrlicht Engine”的声音,请点 10:我能够加入 Irr 引擎开发团队吗?基本上不行。抱歉,我喜欢小型的 Irr 引擎开发团队,因为这样可以保证每个计划简单的得到执行。但是,这也有例外。如果你对 Irr 引擎提供了一个 强大/有用/突破性 的增强功能,而且愿意加入团队,我们也会欢迎。例如:你能够使 Irr 引擎在 Mac 平台上顺利运行(现在已经可以了,但仅仅是一个 Demo 可以)。部分朋友提供了 Irr 引擎一小部分的修改,但是他们没有通过版本控制器来获得引擎的同步,我们也不能让他加入。不过现在又改了:如果你创建了一个模块并且按照 Irr 引擎编写规范(下文有),并且愿意长期维护并分享它,你可以加入本小组,你只需要将你的代码发给 niko 就可以了。请注意,每月总有 4-5 个朋友希望加入 Irr 引擎开发团队,我实在难以选择,因为我们总希望团队尽可能的保持简单而工作快速起来。11:代码规范是什么?如果你制作了一个 Irr 引擎的补丁,而且希望它加入到引擎中,请遵循以下原则:除非特别特别特别必要,尽可能的不要依靠其他库 别用 STL,请使用 Irr 引擎中内置的容器类。别用平台相关函数,必要的话请使用 os:命名空间内的函数。请谨记,Irr 引擎是可以运行于其他平台和编译器下的。请不要使用特殊的编译器扩展,尽量使用标准 C+请使用 Irr 引擎中的类型定义,例如 f32,u32 请尽量不要修改现有的 Irr 接口。除非极其必要而且正确。另外,建议您应当下载最新版本的 Irr 引擎。若你依旧有这种修改需要,最好和 niko 先商谈一下。尽量使用现有的 Irr 代码风格。1:接口以 I 开头,实现以 C 开头,仅保存数据的结构体以 S 开头。2:函数尽量以小写字母开头,变量尽量以大写字母开头。3:接口的公共函数,其参数应当给默认值。4:增加一个函数或修改一个函数,应当按照 doxygen 规范给予注释。如果你对 Irr 引擎进行了大量的修改,请在 changes.txt 中说明。5:使用 C+风格的编码习惯,别使用 Java 代码习惯,例如 For(foo)2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 8 /TODO:For(foo)/TODO:前一种就比后一种好。6:上面的都是比较重要的规则,但是还有一些其他的小规则。例如,尽量使用命名空间,换行和 tab 键,使你的代码看起来好看一些。多检查代码可能出错的地方,预防当机。例如,对一些参数进行判断,检查指针是否为空。另外,发生错误时,输出一个错误 log,用其他方式使程序继续运行下去。这些工作除非在软件模拟格式下都是必须做好的。以上就是基本的代码规范了。12:没有 CVS 吗?Irrlicht 是由一个 subVersion 服务器做主机的,所有 CVS 服务器的数据都是老版本的。如果你依然希望获得最新版本的 CVS,请通过:pserver:anonymous:/cvsroot/irrlicht,模块名是”Irrlicht”,更详细的配置请看这里 13:我如何链接 SubVersion 服务器?你能够通过 进行访问。14:下一个版本引擎将有什么功能?请 查 看 开 发 主 页 和 我 的 博 客www.irrlicht3d.org。我会在上面时时更新最新的开发新闻。你或许能在其中发现下一版本引擎的的预告说明。15:下一个版本 Irr 引擎什么时候发布?等它被完成的时候。这个引擎仅仅是一个开源引擎,我从中没有获得一分钱,所以我不能做出最终期限。一般 1-2 个月我会发布一个新的小版本更动,可能是从 0.4 到 0.5。平时我会提前 1-2 星期发布公告并贴出一些截屏和新的特征说明。所以请不要再给我来信询问这个问题,实际上,大部分时候我自己也不知道这个问题的答案。2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 9 评价评价:虽然 Irr 本身还有一些缺陷和功能上的不足,例如 3D 部分功能并不强大,编辑器比较缺乏,部分封装也比较死板,灵活性缺乏。以致于其适用性总受到一定制约,然而这并不能掩饰它的长处:使用起来绝对简单。这些例子却相当的显示出 Irr 引擎的特点,简洁,明了,针对性强。非常适合 Irr 新手学习。本套例子适用范围不是 3D 菜鸟,例子内部对很多的 3D 名词和概念并没有做出充分的解释。它适用于本身已经对 3D 有一定了解的游戏程序员学习。学习这套引擎,你还需要一个 Irr 引擎库以及例子中的素材,这些在 Irr 官方都有,而且是随 源代码一同提供的,无需下载。另外你还需要自己去微软官方下载一份 DXSDK(或者用 OpenGL 也可,若使用 BurningVideo则极其影响速度了)。学习 Irr 引擎的话,最好是从这些例子入手,比起直接看源代码或 API 文档有效的多,学习的时候,不妨多尝试更改里面一些函数的参数并查看结果,会使你对函数的理解更加深刻。(例子中并没有详细解释 API 参数,但是因为很简单,应当 3D 程序员可以做到一目了然)现在我已翻译完毕 Irr 引擎自带的 16 个例子,接下来我对其进行简单的统计分析。01.HelloWorld 这个例子简单的告诉我们 Irr 引擎的一般使用步骤:1)包含一个 irrlicht.h 头文件,若需要控制台,则再包含 iostream,根据平台以及消息机制的 需求,你可以再包含 windows.h。2)设置命名空间,所有 Irr 引擎文件都在 irr 命名空间之下被定义,irr 命名空间之下又有五大模块,每个模块有自己独立的命名空间,分别为:Core -内部是一些引擎核心类,包括各种数据结构,自定义结构类型。Gui -内部是一些常用的图形用户接口类,实现了各种常用控件 Io -内部是一些输入输出,xml,zip,ini 文件读取写入等操作接口 Scene-内部主要负责场景管理,包括场景节点,摄象机,粒子系统,Mesh,公告版,灯光,动画器,天空盒,地形等绝大部分的 3D 功能。在 Irr 的思想中,这些东西都归属于一个一个的场景节点,统一由 sceneManager 管理。在其中又有一个特殊的命名空间 irr:scene:quake3,这个命名空间内的类和函数负责对 quake3 格式的文件进行特殊的完善处理。video-内部主要是负责对视频驱动的设置,2D 和 3D 渲染都在这里实现。包括了纹理,材质,灯光,图片,顶点等渲染属性的控制。3)通知编译器链接 irr 库文件。2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 10 在以上预处理步骤完成后,我们在 main 中需要做的步骤如下:1)创建设备 2)获取场景管理器,GUI 环境,视频设备的指针,使用他们进行渲染控制。3)之后在 beginScene 和 endScene 中进行 DrawAll 4)释放设备 就这样,一个最基本的完整的基于 Irr 引擎的程序就完成了。02.Quake3Map 这个例子仅简单的介绍了下如何 Load 一个 Quake3 的场景,其中没有什么特殊的概念。只需注意一下 Irr 的思想就可以,将场景和摄象机都做为场景节点来处理。最后,提供了用户选择设备类型的功能,并显示了 FPS。03.CustomSceneNode 这个例子实用性更低了,感觉是为了 3D 编程入门用户使用的,它告诉了我们如何自己定义创建一个场景节点。之前的 Quake3Map 是从文件中读取的各种模型信息,而这里,我们自己手工定义顶点,颜色等信息,并将其做为一个场景节点加载到 Irr 程序中去。由于实际开发中几乎不会手工定义这些东西,所以实用性相当低,仅值得简单了解。04.Movement 这个例子相当重要,它增加了一个用户输入处理的功能。这个功能的实现实际上很简单,如下步骤:1)自定义一个类,继承于 IEventReceiver 类,并实现其中的函数 OnEvent(sEvent)2)根据 sEvent 参数值进行不同的逻辑处理 3)生成这个事件处理类的对象,在创建设备的时候将其做为参数传给设备就 OK 了。本例中另外一个要点就是,为场景节点设置一个 Animator,很遗憾,一直到现在,我依旧无法正确的对 Animator 这个单词进行翻译,它可以实现旋转,移动等多种令模型生动起来的功能,使用起来也很简单,如下:1)使用场景管理器创建一个 Animator,注意它有不同的类型,可以实现不同的功能。2)将它和一个场景节点捆绑起来,之后场景节点就实现了该 Animator 所具有的功能。3)值得注意的是,当 Animator 被绑定之后,它就可以立即释放了,所以个人猜测在绑定的时候,场景管理器 对 Animator 创建了一个副本,将副本给了目标场景节点,而非这个 Animator 本身。05.UserInterface 这个例子也比较重要,它演示了 GUI 的使用方法。这个使用方法是相当容易的,甚至到了一种太简单的地步,就是你简单的使用 GUI 环境指针add 就 OK 了。具体的请见代码,很容易理解。值得注意的是,GUI 在创建的时候,需要提供一个 ID 编号,这样的话,在 消息接收器中,就可以根据 GUI 的 ID 编号来获知是哪个 GUI 应当处理的事件了,很简单,2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 11 很高效!06.2DGraphics 这个例子中演示了如何使用 Irr 引擎实现 2D 图形渲染,并不大重要。代码中没有什么难理解之处,不过 Irr 支持的图片格式可真不少,某志不再在此列举了,有兴趣的可以看看 Irr 文档。2D 部分 Irr 引擎明显没有做为重点来做,都是比较底层的功能,真正拿它来做 2D 游戏的话,还需要用户进一步封装。07.Collision 这是一个相当重要的例子,它告诉了我们如何使用 Irr 引擎进行碰撞检测和鼠标拣选。Irr 引擎中的碰撞检测是依靠碰撞 Animator 的,方法如下:使用场景管理器创建两个碰撞 Animator,将他们分别绑定到要进行碰撞的两个目标对象上,就 OK 了。注意的是,碰撞 Animator(检测器)参数设置会比较麻烦,需要好好看下 SDK。这个例子的第二要点就是鼠标拣选,虽然作者演示了两种鼠标拣选模式,一种基于三角面的拣选,一种基于碰撞盒的拣选,实际上区别不大,都是通过场景管理器 getSceneCollisionManager 获取碰撞管理器来进行处理,由于封装的很好,所以不会太难。(若无法理解这两中拣选的区别,请运行例子测试)08.SpecialFx 这也是个比较重要的例子,主要演示了几种常用特效的使用,包括水面,移动光源,粒子系统,动态阴影。实际上这些特效在Irr中有很方便的封装,你只要使用场景管理器创建一个相应的SceneNode,再设置其参数就可以了。在这里,你会更加明确的感受到 Irr 作者对场景节点的喜好了,一切都是场景节点!包括阴影也照样。具体的实现还请看例子,例如水面的双层纹理效果,粒子发射器的参数分别什么作用,还需要用户简单的更改调试查看。09.MeshViewer 实际上,这个例子是一个让用户休息一下的例子,其中没有新的知识点,只是将 GUI 和图形渲染之间进行了一些衔接罢了,对 GUI 的使用还有问题的朋友可以进去看看。想这么点代码就做一个 MeshViewer 还是艰难了点吧,虽然我承认 Irr 封装的够强悍。10.Shaders 这个例子告诉了我们如何使用 Irr 引擎实现 Shader.Irr 引擎既支持高级 Shader 语言,也支持asm,也允许从文件中进行 Shader 的读取。但是操作难度不大,步骤如下:1)创建一个Shader回调类继承IShaderConstantSetCallBack实现其中的OnSetConstanes函数,每桢材质渲染前,Irr 设备都会调用这个函数。2)通过设备指针获取 GPU 服务对象指针 3)通过 GPU 服务对象指针去创建 Shader 材质,并将 Shader 回调类的对象做为参数传入。2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 12 例:MyShaderCallBack*mc=new MyShaderCallBack();newMaterialType1=gpu-addHighLevelShaderMaterialFromFiles(vsFileName,psFileName,mc,.);这样就 OK 了,真的,没见过比这更简单的设置 Shader 了。11.PerPixelLighting 所谓的 PerPixelLighting 逐象素光照,个人感觉就是凹凸贴图的另一个名词而已。这个例子中实现凹凸贴图,使用了两种方式,法线映射和视差映射。这两种映射依旧是两个函数的调用而已,当然,这需要硬件支持 Shader,也需要我们明白一点凹凸帖图的原理:模型上贴两层纹理,一层颜色纹理用来普通的显示,一层高度纹理,我们通过高度纹理图来生成一个切线图,进行渲染就可以实现有立体感的凹凸贴图了。这里需要注意的是 createMeshWithTangents 是将一个高度图转换为切线图的函数,它的内部对纹理图进行的复制,所以,最后记得要 drop 掉。另外,在本例中增加了雾特效,这个实现本身相当容易,不过请记住打开每个场景的雾效开关,默认它是关闭着的。12.TerrainRendering 此例子实现地形渲染,没有什么要点在其中的,只是作者在告诉用户,Irr 引擎使用了地形Lod 和纹理混合的功能罢了。13.RenderToTexture 本例子实现动态纹理渲染,如果用户了解镜面渲染原理的话,本例子也没有什么要点可言,只是进行两次渲染实现个动态渲染纹理而已,而且,这里 Irr 引擎封装不足,完全可以进一步改进。14.Win32Window 这是个很有趣的例子,在一个 Win32 窗口内运行 Irr 程序,请注意例子中提示的两种消息接收方式,在特殊条件下该例子比较有用。Irr 支持用户使用 Win32 自身的消息分发系统,也允许继承自身的 OnEvent 进行消息处理,这两种方法都有效,注意,后一种方式必须 Device-Run(),详细情况请见例子。15.LoadIrrFile 这是一个脑残的例子,不知道作者在想些什么,一个 loadScene(XX.irr)把我们打发了,可能主要目的是向我们推荐他的 irrEdit 吧,我们拿记事本打开.irr 文件,会发现,那不过是 xml格式的一套信息而已,类似于 Direct 的.x 对模型的格式定义一样,.irr 是对场景的 一个格式定义。16.Quake3MapShader 这个例子和 02.Quake3Map 基本上一致,不同之处在于两点:1:本例加了个截屏功能。2:在 02 例子的场景之上,本例添加了一些 Shader。阅读本例需要我们对 quake3 的地图文件格式有一定的了解,即使你想去了解也没有关系,你只需要明白,Quake3 地图是将地图上的物件(如桌子,灯座,甚至灯光)都寄存在相关2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 13 材质中就 OK 了。本例中大量使用 irr:scene:quake 中的函数,对 quake 格式没兴趣的朋友可以不看。简单的 Irr 例子介绍就这样了,之后我会继续翻译 Irr 相关文档说明以及 API 文档,并将其发布在我的博客之中,欢迎来访指教。(欺骗群众,2007 的话,2009 年都没兑现!)Example 代码学习参考(注意:一些老代码在新的 SDK 下可能执行有问题,具体需要手工修正,请注意!)Irrlicht 之 01.HelloWorld /*这份指南告诉你如何配置 IDE 环境来使用鬼火引擎,以及如何使用它来写一份简单的HelloWorld。这个程序将告诉我们如何简单的使用 VideoDriver 视频驱动,GUIEnvironmentGUI 环境和SceneManager 场景管理器。使用这个引擎,我们首先需要包含 irrlicht.h 这个头文件,它包含在鬼火引擎 SDK 的include中。首先让编译器找到这个头文件,我们应当在项目中指定该文件夹路径。这个过程和你所使用的 IDE 环境不同而不同。我这里只介绍一下 VC6.0 和.NET 的设置方式。点工具-选项-设置,添加其头文件和库文件路径。这样的话你就可以顺利的在鬼火引擎上进行开发。*/#include#include /*在鬼火引擎中,所有的代码都被命名空间 irr 约束着。所以如果你想调用引擎中的任何一个类,你必须在类名前 这样写 irr:ClassName,例如,你要使用 IrrlichtDevice 类,你就这么写 irr:IrrlichtDevice。或者偷懒,告诉编译器使用命名空间.using namespace irr;*/using namespace irr;/*下面是五个子命名空间。你会在文档中的 NamespaceList 中找到他们。就象上面的命名空间一样,如果你想偷懒,直接告诉编译器好了。*/using namespace core;using namespace scene;using namespace video;using namespace io;using namespace gui;/*2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 14 我们应该包含一个 Irrlicht.Dll 文件,我们也可以在编译器设置,或者直接这里写一个声明。*/#ifdef _IRR_WINDOWS_#pragma comment(lib,Irrlicht.lib)#endif /*int main()是一个主函数,我们在所有平台中都可以这么写。在 Windows 平台下,我们也可以使用 WinMain 函数,但是那样的话,我们将失去一个控制台。*/int main()/*引擎函数中最重要的函数就是“CreateDevice”创建设备了。鬼火引擎做一切事情的根对象 就是这个鬼火设备了。CreateDevice 有七个参数。1:设备类型 deviceType:可以是空设备,软件模拟设备,第三方渲染设备,D3D8,D3D9,OpenGL。在例子里我们使用的是 EDT_SOFTWARE 的软件 模拟 方式,但 是你 可以 拿 EDT_BURNINGSVIDEO,EDT_NULL,EDT_DIRECT3D8,EDT_DIRECT3D9,或 EDT_OPENGL 进行测试。2:窗口宽高 3:窗口色深 4:是否全屏 5:我们绘制阴影时是否使用摸版缓冲区 6:是否开启同步,注意的是只有全屏时才有效 7:事件接收器的对象,也就是对鼠标消息,键盘消息,用户信息,GUI 消息等一系列消息的回调处理函数指针。我们这里不加处理的话,设置为 0。*/IrrlichtDevice*device=createDevice(video:EDT_DIRECT3D9,dimension2d(1024,768),32,false,false,false,0);/*设置窗口标题文字。注意,这里有个 L 在字符串之前,这代表鬼火引擎绘制文字时使用的是宽字节*/device-setWindowCaption(LHello World!-Irrlicht Engine Demo);/*获取视频设备,场景管理器和用户图形环境的指针并存储起来。*/IVideoDriver*driver=device-getVideoDriver();2009 年 6 月 11 日星期四 Irrlicht Engine 中文学习指南 ISClub Irrlicht Engine|未来公司 15 ISceneManager*smgr=device-getSceneManager();IGUIEnvironment*guienv=device-getGUIEnvironment();/*使用用户图形环境设备绘制一个 Label。*/guienv-addStaticText(LHello World!This is the Irrlicht Software renderer!,rect(10,10,260,22),true);/*我们读取一个模型文件并且显示它。步骤很简单,只需要使用场景管理器 getMesh()读取 mesh 信息.再创
展开阅读全文