Irrlicht引擎例子说明及中文链接
虽然Irr本身还有一些缺陷和功能上的不足,例如3D部分功能并不强大,编辑器比较缺乏,部分封装也比较死板,灵活性缺乏。以致于其适用性总受到一定制约,然而这并不能掩饰它的长处:使用起来绝对简单。
虽然Irr本身还有一些缺陷和功能上的不足,例如3D部分功能并不强大,编辑器比较缺乏,部分封装也比较死板,灵活性缺乏。以致于其适用性总受到一定制约,然而这并不能掩饰它的长处:使用起来绝对简单。
这些例子却相当的显示出Irr引擎的特点,简洁,明了,针对性强。非常适合Irr新手学习。
本套例子适用范围不是3D菜鸟,例子内部对很多的3D名词和概念并没有做出充分的解释。 它适用于本身已经对3D有一定了解的游戏程序员学习。
学习这套引擎,你还需要一个Irr引擎库以及例子中的素材,这些在Irr官方都有,而且是随源代码一同提供的,无需下载。 另外你还需要自己去微软官方下载一份DXSDK(或者用OpenGL也可, 若使BurningVideo则极其影响速度了)。
学习Irr引擎的话,最好是从这些例子入手,比起直接看源代码或API文档有效的多,学习的时候,不妨多尝试更改里面一些函数的参数并查看结果,会使你对函数的理解更加深刻。 (例子中并没有详细解释API参数,但是因为很简单,应当3D程序员可以做到一目了然)
现在我已翻译完毕Irr引擎自带的16个例子,接下来我对其进行简单的统计分析。
01.HelloWorld http://hi.baidu.com/freedomknightduzhi/blog/item/317de73dec7992c49e3d624a.html
这个例子简单的告诉我们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库文件。
在以上预处理步骤完成后,我们在main中需要做的步骤如下: 1)创建设备 2)获取场景管理器,GUI环境,视频设备的指针,使用他们进行渲染控制。 3)之后在beginScene和endScene中进行DrawAll 4)释放设备
就这样,一个最基本的完整的基于Irr引擎的程序就完成了。
02.Quake3Map http://hi.baidu.com/freedomknightduzhi/blog/item/34a4d90398200bef09fa9343.html
这个例子仅简单的介绍了下如何Load一个Quake3的场景,其中没有什么特殊的概念。 只需注意一下Irr的思想就可以,将场景和摄象机都做为场景节点来处理。 最后,提供了用户选择设备类型的功能,并显示了FPS。
03.CustomSceneNode http://hi.baidu.com/freedomknightduzhi/blog/item/8316ab3586254c1291ef3914.html
这个例子实用性更低了,感觉是为了3D编程入门用户使用的,它告诉了我们如何自己定义创建一个场景节点。 之前的Quake3Map是从文件中读取的各种模型信息,而这里,我们自己手工定义顶点,颜色等信息,并将其 做为一个场景节点加载到Irr程序中去。由于实际开发中几乎不会手工定义这些东西,所以实用性相当低, 仅值得简单了解。
04.Movement http://hi.baidu.com/freedomknightduzhi/blog/item/38723395f10cae0b7bf48094.html
这个例子相当重要,它增加了一个用户输入处理的功能。这个功能的实现实际上很简单,如下步骤: 1)自定义一个类,继承于IEventReceiver类,并实现其中的函数OnEvent(sEvent) 2)根据sEvent参数值进行不同的逻辑处理 3)生成这个事件处理类的对象,在创建设备的时候将其做为参数传给设备就OK了。
本例中另外一个要点就是,为场景节点设置一个Animator,很遗憾,一直到现在,我依旧无法正确的对 Animator这个单词进行翻译,它可以实现旋转,移动等多种令模型生动起来的功能,使用起来也很简单,如下: 1)使用场景管理器创建一个Animator,注意它有不同的类型,可以实现不同的功能。 2)将它和一个场景节点捆绑起来,之后场景节点就实现了该Animator所具有的功能。 3)值得注意的是,当Animator被绑定之后,它就可以立即释放了,所以个人猜测在绑定的时候,场景管理器 对Animator创建了一个副本,将副本给了目标场景节点,而非这个Animator本身。
05.UserInterface http://hi.baidu.com/freedomknightduzhi/blog/item/c17e1e4eb48439c9d0c86a77.html
这个例子也比较重要,它演示了GUI的使用方法。 这个使用方法是相当容易的,甚至到了一种太简单的地步,就是你简单的使用GUI环境指针add就OK了。 具体的请见代码,很容易理解。值得注意的是,GUI在创建的时候,需要提供一个ID编号,这样的话,在 消息接收器中,就可以根据GUI的ID编号来获知是哪个GUI应当处理的事件了,很简单,很高效!
06.2DGraphics http://hi.baidu.com/freedomknightduzhi/blog/item/6faf98fde6817e1508244d3b.html
这个例子中演示了如何使用Irr引擎实现2D图形渲染,并不大重要。 代码中没有什么难理解之处,不过Irr支持的图片格式可真不少,某志不再在此列举了,有兴趣的可以看看Irr文档。 2D部分Irr引擎明显没有做为重点来做,都是比较底层的功能,真正拿它来做2D游戏的话,还需要用户进一步封装。
07.Collision http://hi.baidu.com/freedomknightduzhi/blog/item/ea4a9f354c4b3488a71e124d.html
这是一个相当重要的例子,它告诉了我们如何使用Irr引擎进行碰撞检测和鼠标拣选。 Irr引擎中的碰撞检测是依靠碰撞Animator的,方法如下: 使用场景管理器创建两个碰撞Animator,将他们分别绑定到要进行碰撞的两个目标对象上,就OK了。注意的是, 碰撞Animator(检测器)参数设置会比较麻烦,需要好好看下SDK。
这个例子的第二要点就是鼠标拣选,虽然作者演示了两种鼠标拣选模式,一种基于三角面的拣选,一种基于碰撞盒的拣选, 实际上区别不大,都是通过场景管理器getSceneCollisionManager获取碰撞管理器来进行处理,由于封装的很好, 所以不会太难。(若无法理解这两中拣选的区别,请运行例子测试)
08.SpecialFx http://hi.baidu.com/freedomknightduzhi/blog/item/003abc58b79776dd9d820472.html
这也是个比较重要的例子,主要演示了几种常用特效的使用,包括水面,移动光源,粒子系统,动态阴影。 实际上这些特效在Irr中有很方便的封装,你只要使用场景管理器创建一个相应的SceneNode,再设置其参数就可以了。 在这里,你会更加明确的感受到Irr作者对场景节点的喜好了,一切都是场景节点!包括阴影也照样。- - 具体的实现还请看例子,例如水面的双层纹理效果,粒子发射器的参数分别什么作用,还需要用户简单的更改调试查看。
09.MeshViewer http://hi.baidu.com/freedomknightduzhi/blog/item/8f47e69578756548d1135eca.html
实际上,这个例子是一个让用户休息一下的例子,其中没有新的知识点,只是将GUI和图形渲染之间进行了一些衔接罢了, 对GUI的使用还有问题的朋友可以进去看看。想这么点代码就做一个MeshViewer还是艰难了点吧,虽然我承认Irr封装的够强悍。
10.Shaders http://hi.baidu.com/freedomknightduzhi/blog/item/d67e37d8df84613632fa1c56.html
这个例子告诉了我们如何使用Irr引擎实现Shader. Irr引擎既支持高级Shader语言,也支持asm,也允许从文件中进行Shader的读取。但是操作难度不大,步骤如下: 1)创建一个Shader回调类继承IShaderConstantSetCallBack实现其中的OnSetConstanes函数, 每桢材质渲染前,Irr设备都会调用这个函数。 2)通过设备指针获取GPU服务对象指针 3)通过GPU服务对象指针去创建Shader材质,并将Shader回调类的对象做为参数传入。 例:MyShaderCallBack* mc = new MyShaderCallBack(); newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(vsFileName, psFileName, mc,…); 这样就OK了,真的,没见过比这更简单的设置Shader了。
11.PerPixelLighting http://hi.baidu.com/freedomknightduzhi/blog/item/80fcfa3f023c75c17c1e7144.html
所谓的PerPixelLighting逐象素光照,个人感觉就是凹凸贴图的另一个名词而已。 这个例子中实现凹凸贴图,使用了两种方式,法线映射和视差映射。这两种映射依旧是两个函数的调用而已, 当然,这需要硬件支持Shader,也需要我们明白一点凹凸帖图的原理:模型上贴两层纹理,一层颜色纹理用来普通的显示, 一层高度纹理,我们通过高度纹理图来生成一个切线图,进行渲染就可以实现有立体感的凹凸贴图了。 这里需要注意的是createMeshWithTangents是将一个高度图转换为切线图的函数,它的内部对纹理图进行的复制,所以, 最后记得要drop掉。 另外,在本例中增加了雾特效,这个实现本身相当容易,不过请记住打开每个场景的雾效开关,默认它是关闭着的。
12.TerrainRendering http://hi.baidu.com/freedomknightduzhi/blog/item/70e377eedb7c81f8b2fb95ee.html
此例子实现地形渲染,没有什么要点在其中的,只是作者在告诉用户,Irr引擎使用了地形Lod和纹理混合的功能罢了。
13.RenderToTexture http://hi.baidu.com/freedomknightduzhi/blog/item/fb3fff13d35156015baf537d.html
本例子实现动态纹理渲染,如果用户了解镜面渲染原理的话,本例子也没有什么要点可言,只是进行两次渲染实现个动态渲染纹理而已, 而且,这里Irr引擎封装不足,完全可以进一步改进。
14.Win32Window http://hi.baidu.com/freedomknightduzhi/blog/item/da20baeeb7acee2a2cf5344f.html
这是个很有趣的例子,在一个Win32窗口内运行Irr程序,请注意例子中提示的两种消息接收方式,在特殊条件下该例子比较有用。 Irr支持用户使用Win32自身的消息分发系统,也允许继承自身的OnEvent进行消息处理,这两种方法都有效,注意,后一种方式必须 Device->Run(),详细情况请见例子。
15.LoadIrrFile http://hi.baidu.com/freedomknightduzhi/blog/item/c1a98f44b2f18d81b3b7dc59.html
这是一个脑残的例子,不知道作者在想些什么,一个loadScene(XX.irr) 把我们打发了,可能主要目的是向我们推荐他的irrEdit吧, 我们拿记事本打开.irr文件,会发现,那不过是xml格式的一套信息而已,类似于Direct的.x对模型的格式定义一样,.irr是对场景的 一个格式定义。
16.Quake3MapShader http://hi.baidu.com/freedomknightduzhi/blog/item/077bf7f9282fb65a252df21a.html
这个例子和02.Quake3Map基本上一致,不同之处在于两点:1:本例加了个截屏功能。2:在02例子的场景之上,本例添加了一些Shader。 阅读本例需要我们对quake3的地图文件格式有一定的了解,即使你想去了解也没有关系,你只需要明白,Quake3地图是将地图上的物件 (如桌子,灯座,甚至灯光)都寄存在相关材质中就OK了。本例中大量使用irr::scene::quake中的函数,对quake格式没兴趣的朋友可以 不看。
简单的Irr例子介绍就这样了,之后我会继续翻译Irr相关文档说明以及API文档,并将其发布在我的博客之中,欢迎来访指教。 http://hi.baidu.com/freedomknightduzhi 或E-mail for me.