Irrlicht(⿁⽕)⽰例详解
⼀、引⾔
  Irrlicht引擎是⼀个⽤C++书写的⾼性能实时的3D引擎,可以应⽤于C++ 程序或者.NET语⾔中。通过使⽤
Direct3D(Windows平台),OpenGL 1.2或它⾃⼰的软件着⾊程序,可以实现该引擎的完全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒⼦系统,⾓⾊动画,室内和室外技术以及碰撞检测等(见图1)。
图1.Irrlicht 3D引擎
  Irrlicht是⼀个德国神话故事中的⼀种动物的名字,它能够发光和翱翔,可以在⼤部分的沼泽地四周发现它。单词"Irrlicht"是两个德国单词("irr"意思是疯狂的;⽽"Licht"意思是光)的组合。在英语中,它被译为"⿁⽕"。
  Irrlicht⼗分幸运地为⼀个巨⼤的活跃的开发团队以⼤量的⼯程所⽀持。然⽽,因为Irrlicht主要由游戏名家Nikolaus Gebhardt所设计,所以该游戏在设计上⼗分连贯。你可以在⽹上到处发现有Irrlicht的增强程序,如可选⽤的地形⽣成器,⼊⼝⽣成器,输出器, world层⽣成器,相关教程和编辑器等。⽽且,它独⽴地创建了到
Java,Perl,Ruby,BASIC,Python,LUA甚⾄更多种语⾔的绑定。⽽最为重要的是,它是完全⾃由的。
  ⼆、 Irrlicht特性
  在深⼊分析API之前,请让我更具体地介绍⼀下Irrlicht提供给了3D游戏开发者哪些功能:
  ·⼀个可以运⾏于Linux以及Windows 98,ME,NT,2000和XP(MacOS在计划之中)等操作系统之上的引擎
  ·针对Direct3D 8⽣成器或Direct3D 9⽣成器(可选)提供了Anti-aliasing⽀持
  ·可换肤的GUI环境(包括⼀个很酷的具有⾦属质地的带阴影的⽪肤),给⼀些⽼式的对话框加上漂亮的外观
  ·场景治理系统,它答应⽆缝的室内/室外过渡
  ·⾓⾊动画系统,带有⾻骼和变形⽬标动画功能
  ·⼀个⾮凡的效果系统,包括粒⼦效果(⾬,烟,⽕,雪,等等),告⽰板,灯光贴图,环境,地图,模板缓冲区阴影,雾,纹理动画,视差贴图,凹凸贴图,还有更多
  ·内建的材质⽀持,包括⽀持Pixel and Vertex Shaders版本1.1到3.0,ARB Fragment and Vertex程序以及HLSL(GLSL 正在计划中)
  ·.NET语⾔绑定,这使得引擎可⽤于所有的.NET语⾔例如C#,Visual Basic.NET以及Delphi.NET
  ·⼀内建的平台独⽴的软件⽣成器,特性有:z-缓冲,Gouraud阴影,alpha混合和透明性,还有快速的2D绘图(见图2)
  ·你久已期待的2D绘图功能,例如alpha混合,基于要害⾊的位图复制,字体绘制,以及混合3D与2D图形
  ·能直接导⼊常见的建模⽂件格式:Maya,3DStudio Max,COLLADA,DeleD,Milkshape,Quake 3 levels,Quake2 models,DirectX,Pulsar,My3DTools,FSRad以及Cartography Shop
  ·能直接从BMP,PNG,Photoshop,JPEG,Targa和PCX导⼊纹理
  ·快速⽽易⽤的碰撞检测与响应
  ·为快速的3D运算和容器模板库进⾏了优化处理
  ·直接读取档案(可能是压缩的,如.zip⽂件)
  ·集成了快速的XML分析器
  ·为实现轻易的本地化开发提供Unicode⽀持
图2:基于Irrlicht的游戏Yet Another Space Shooter(YASS),这⾥显⽰的是⼀个静态游戏帧中的令⼈吃惊的着⾊效果
更多内容请看C/C++相关⽂章程序设计⽹络游戏开发专题,或  三、在Irrlicht中的⾮凡效果
  在本⽂的例⼦中,我将向你展⽰怎样使⽤模板缓冲区影⼦技术,还有粒⼦系统,告⽰板,动态光以及⽔表⾯场景结点等技术。参见图3。
图3.结合动态的光和⽔进⾏的场景着⾊
  Irrlicht引擎⾃动地检查是否你的硬件⽀持模板缓冲;⽽假如不⽀持,则不启动阴影。在这个演⽰程序中,在⽅法createDevice()中的 ’shadows’标志被置位,以产⽣从⼀个动画⾓⾊投下的动态影⼦。假如这个实例程序在你的PC上运⾏太慢,可以把这个标志设置为false或者⼲脆再买⼀块更好些的图形加速卡。
  为能够使⽤Irrlicht.DLL⽂件,你需要链接到Irrlicht.lib库⽂件。你可以在⼯程设置对话框中设置这个选项;
但是为了轻易实现,你可以使⽤⼀个pragma预编译注释命令。⽅法createDevice()负责实例化根对象-它使⽤引擎完成⼀切事情。参数如下:
  ·deviceType:设备类型。当前你可选取Null设备以及软设备,如DirectX8,DirectX9或OpenGL。
  ·windowSize:要创建的窗⼝的⼤⼩或全屏幕模式。这个例⼦中使⽤512x384。
  ·bits:每像素位数(当在全屏幕情况时)。仅答应值为16或者32。
  ·fullscreen:指定是否你想使设备运⾏于全屏幕⽅式。
  ·stencilbuffer:指定是否你想使⽤模板缓冲区以⽤于绘制阴影。
  ·vsync:指定是否你想启动vsync(仅在全屏幕情况),可选。
  ·eventReceiver:⼀个接收事件的对象,可选。
  为适合于本实例环境,你将装载⼀个3D Studio Max⽂件(⼀幢房⼦)。该房⼦看起来并没有什么⾮凡的,但是Irrlicht引擎能为你创建⼀个相当酷的纹理贴图。只需使⽤造型操纵器并为之创建⼀个planar纹理贴图即可:
#include <irrlicht.h>
#include <iostream>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
int main()
{
 //让我们假定⽤户在本例中使⽤OpenGL
 //当然,也可以指定DirectX 8, 9, 等等.
 video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
 //创建设备,假如创建失败⽴即退出。
 IrrlichtDevice *device = createDevice(driverType,
 core::dimension2d(640, 480), 16, false, true);
 if (device == 0)
  return 1;
 video::IVideoDriver* driver = device->getVideoDriver();
 scene::ISceneManager* smgr = device->getSceneManager();
  我对从这个导⼊⽂件产⽣的发射光线颜⾊的效果并不满⾜。下列代码显⽰怎样实现这些步骤:
scene::IAnimatedMesh* mesh = smgr->getMesh("room.3ds");
smgr->getMeshManipulator()->makePlanarTextureMapping(
mesh->getMesh(0), 0.008f);
scene::ISceneNode* node = 0;
node = smgr->addAnimatedMeshSceneNode(mesh);
node->setMaterialTexture(0, driver->getTexture("wall.jpg"));
node->getMaterial(0).EmissiveColor.set(0,0,0,0);
  四、⽔动画
  你将添加的第⼀个⾮凡的效果是⽔动画。为此,WaterSurfaceSceneNode导⼊⼀个造型⽂件并使之象⽔表⾯⼀样地波动。假如你让这个场景结点使⽤⼀种相当好的材质如MT_REFLECTION_2_LAYER,那么它看起来相当酷:
mesh = smgr->addHillPlaneMesh("myHill",
core::dimension2d(20,20),
core::dimension2d(40,40), 0, 0,
core::dimension2d(0,0),
core::dimension2d(10,10));
node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0),3,300,30);
node->setPosition(core::vector3df(0,7,0));
node->setMaterialTexture(0,driver->getTexture("water.jpg"));
node->setMaterialTexture(1,driver->getTexture("stones.jpg"));
node->setMaterialType(video::EMT_REFLECTION_2_LAYER);
  作为输⼊造型,你可以创建⼀个陡峭的平⾯造型,但是你也可以为此使⽤任何其它的造型。你甚⾄能重⽤room.3ds输⼊⽂件(它看上去确实很希奇)。该实例还⽤⼀个普通的⽯头纹理模型来绘制所有另外的表⾯。
  五、透明的告⽰板和灯光
  第⼆个⾮凡的效果是很基本的但是⾮常有⽤:⼀个透明的告⽰板,伴之有⼀个动态的灯光。为产⽣这种效果,你只需要产⽣⼀个灯光场景结点,并让它四处飞⾏;⽽且,为了让它看起来更酷⼀些,可以把⼀个告⽰板场景结点依附到它上⾯:
//创建灯光
node = smgr->addLightSceneNode(0, core::vector3df(0,0,0),
video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 600.0f);
scene::ISceneNodeAnimator* anim = 0;
anim = smgr->createFlyCircleAnimator(core::vector3df(0,150,0),250.0f);
node->addAnimator(anim);
anim->drop();
// 把告⽰板依附到灯光
node = smgr->addBillboardSceneNode(node, core::dimension2d(50, 50));
node->setMaterialFlag(video::EMF_LIGHTING, false);
node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
node->setMaterialTexture(0,driver->getTexture("particlewhite.bmp"));
更多内容请看C/C++相关⽂章程序设计⽹络游戏开发专题,或  六、粒⼦系统
  下⾯介绍的这个⾮凡效果更有趣:⼀个粒⼦系统。在Irrlicht引擎中,粒⼦系统既是组件化的,也是可扩展的,但是仍然易于使⽤。你只需要简单地把粒⼦发射器放到⼀个粒⼦系统场景结点,这样以来粒⼦看上去没有产⽣源。这些发射器可以据需要进⾏灵活配置,并经常带有许多参数,如粒⼦⽅向,粒⼦数量,以及粒⼦颜⾊等。
  当然,发射器类型有区别(例如,⼀个点发射器能够使粒⼦从⼀个固定的点上发出粒⼦)。假如该引擎提供的粒⼦发射器还不能满⾜你的要求,你可以轻易地创建你⾃⼰的发射器。这只需简单地从IParticleEmitter接⼝派⽣⼀个新类并使⽤setEmitter()⽅法把它依附到粒⼦系统上去即可。
  下⼀个实例将创建⼀个盒⼦粒⼦发射器。你可能已经猜出,它从⼀个跳跃的盒中随机⽣成粒⼦。由参数来定义盒⼦,粒⼦的⽅向,每秒产⽣粒⼦的最⼩和最⼤数⽬,颜⾊以及粒⼦的最⼩和最⼤⽣命周期。
  ⼀个完全由发射器组成的粒⼦系统将是令⼈⽣厌的,因为缺乏真实感。因此,Irrlicht⽀持粒⼦影响器-它负责在粒⼦到处飞扬时予以修整。⼀旦添加到粒⼦系统上,它们就能模拟另外的更真实的效果,象重⼒或风。在本例中的粒⼦影响器只是简单地修改粒⼦的颜⾊来产⽣⼀种淡出效果。
  可能你已经猜出,粒⼦影响器是通过派⽣IParticleAffector接⼝实现的,然后通过使⽤addAffector()⽅法把它添加到粒⼦系统上去。在你为该粒⼦系统设置了⼀种好看的材质后,你就有了⼀个看上去相当酷的野外宿营⽕的效果。通过调整材质,纹理,粒⼦发射器,还有影响器参数,你能轻易地创建烟雾,下⾬,
爆炸,下雪等效果:
scene::IParticleSystemSceneNode* ps = 0;
ps = smgr->addParticleSystemSceneNode(false);
ps->setPosition(core::vector3df(-70,60,40));
ps->setScale(core::vector3df(2,2,2));
ps->setParticleSize(core::dimension2d(20.0f, 10.0f));
scene::IParticleEmitter* em = ps->createBoxEmitter(
core::aabbox3d(-7,0,-7,7,1,7),
core::vector3df(0.0f,0.03f,0.0f),
80,100,
video::SColor(0,255,255,255), video::SColor(0,255,255,255),
800,2000);
ps->setEmitter(em);
em->drop();
scene::IParticleAffector* paf =ps->createFadeOutParticleAffector();
ps->addAffector(paf);
paf->drop();
ps->setMaterialFlag(video::EMF_LIGHTING, false);
ps->setMaterialTexture(0, driver->getTexture,"particle.bmp"));
ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
  七、影⼦投射
  最后但也不容忽视⼀个问题是,你需要为⼀个动画⾓⾊产⽣⼀个动态的影⼦。为此,你装载⼀个Quak
e2.md2模型⽂件并把它放到你的world上去。为了创建影⼦,你只需要调⽤⽅法addShadowVolumeSceneNode()。你可能通过调⽤ISceneManager:: setShadowColor()来控制影⼦的颜⾊;注重,这仅是全局可调整的,并影响所有的影⼦。好,下⾯就是你的产⽣动态影⼦效果的代码:
mesh = smgr->getMesh("../../media/faerie.md2");
scene::IAnimatedMeshSceneNode* anode = 0;
anode = smgr->addAnimatedMeshSceneNode(mesh);
anode->setPosition(core::vector3df(-50,45,-60));
anode->setMD2Animation(scene::EMAT_STAND);
anode->setMaterialTexture(0, driver->getTexture("../../media/Faerie5.BMP"));
anode->addShadowVolumeSceneNode();
smgr->setShadowColor(video::SColor(220,0,0,0));
  ⼋、游戏循环
  最后,你能进⼊由device->run()⽅法控制的游戏循环。该循环将不断运⾏,直到通过获取⼀个关闭窗⼝事件(例如在Windows操作系统下的ALT-F4击键)来退出设备。你必须在⼀个beginScene()和endScene()命令对之间绘制每样东西。beginScene()⽤指定的⼀种颜⾊清屏,假如需要的话,可以同时清除深度缓冲区。然后你就可以让场景治理器和GUI环境来绘制它们的内容。随着调⽤endScene(),每⼀样东西都被绘制到屏幕上去。在本例中,你还可以动态地在标题栏上显⽰帧每秒(FPS)数,这对于严厉的游戏开发者是⼗分重要的事情:
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
camera->setPosition(core::vector3df(-50,50,-150));
int lastFPS = -1;
while(device->run())
{
 driver->beginScene(true, true, 0);
 smgr->drawAll();
 driver->endScene();
 int fps = driver->getFPS();
 if (lastFPS != fps)
 {
  core::stringw str = L"Campfire FX example [";
  str += driver->getName();
  str += "] FPS:";
  str += fps;
  device->setWindowCaption(str.c_str());
  lastFPS = fps;
 }
}
device->drop();
游戏xml文件修改  结束循环后,你必须删除先前⽤createDevice()⽅法创建的Irrlicht设备。通过使⽤Irrlicht引擎,你应该删除所有你⽤以
’create’开头的⽅法或函数创建的所有对象。你可以通过简单地调⽤device->drop()来删除该设备对象。
  九、你可能喜欢的Irrlicht插件
  正如在前⾯所介绍的,Irrlicht有⼀勤奋的独⽴开发⼈员并为之产⽣了⼤量的插件,也⽤之开发了相当多的游戏。这些开发者中提出的许多的改进被再次集成到Irrlicht的随后的发⾏版本中。下⾯我列举其中的⼏个例⼦,我想这会吸引许多颇有前程的开发者感爱好:
  ·OCTTools,是⼀套⽤于Irrlicht的⼯具,由Murphy McCauley所创建,⽤于操作OCT⽂件相关的:输出器,加载器,甚⾄更多。
  ·ICE(Irrlicht通⽤引擎)是⼀个开发框架,它提供了⼀个⼯程的轮廓实现,从⽽加快了新⼯程的开发。
  ·MIM,由Murphy McCauley所创建,是⼀个⾮常有⽤的基于XML的⽂件格式,可⽤于Irrlicht的加载器,转换器及其各种⼯具。
  ·My3D是⼀个开发⼯具包,它能够使你把来⾃于各种3D包(3DStudio MAX,Giles,等等)中的灯光贴图场景直接输出到Irrlicht中。
  ·Dusty引擎答应程序员创建"任务"-这些"任务"可以完成程序员想做的任何事情。之后,这些任务被添加到⼀棵普通的任务树上去,⽽每个任务可以有它们希望数⽬的孩⼦任务。任务"组"答应游戏设计者在⼀棵完整的树上执⾏普通的操作,例如暂停,继续或破坏等。
  ·Irrlicht RPG(Erring Light)是⼀个3D 绕⾏⾛游戏引擎,最初是针对RPG类游戏开发的。
  ·2D 图像和精灵类组成了⼀个很有⽤的库,它扩展了Irrlicht的2D能⼒。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。