Irrlicht简介

Irrlicht在国内也被叫做“鬼火”引擎,是一款用C++编写的开放源代码的高性能游戏引擎。而且是跨平台的,具有很好的移植性,Irrlicht支持OpenGl、Direcx3D渲染,引擎本身也实现了一套自己的渲染系统。在商业引擎中能够找到的艺术特性,Irrlicht基本都支持。目前有很多项目中都使用到它,Irrlicht社区也比较活跃,可以在互联网上找到不少Irrlicht增强工具,例如irrEdit、irrKlang等。在众多开源游戏引擎中,Irrlicht也是比较受笔者青睐的一款。

Irrlicht官方网站:http://irrlicht.sourceforge.net/

Irrlicht下载与使用

Irrlicht目前最新稳定版本为1.8.1,项目发布在sourceforge平台上,用户可以通过sourceforge网站首页面搜索功能找到Irrlicht项目下载地址,或者从Irrlicht官网获取下载链接。

下载地址:http://irrlicht.sourceforge.net/downloads/

1.目录结构

解压后目录结构如下:

bin:不同平台编译Irrlicht生成的可执行文件和动态库文件放在该目录中。

doc : 该目录中为Irrlicht API文档。

examples : Irrlicht官方提供的案例程序存放在该目录中。

include : 存放引擎所有头文件。

lib : 该目录存放Irrlicht引擎编译过后生成的静态库。

media : 官方案例所需资源文件存放在此目录中。

source : 存放引擎源码。

tools : 该目录下为Irrlicht引擎相关工具。如irrEdit、GUIEditor等。

2.官方案例

Irrlicht使用起来是非常方便的,这也是笔者比较喜欢它的原因之一。为了方便用户学习和使用引擎,Irrlicht官方提供了大量的例子程序,而且都比较具有代表性。

打开examples目录,Irrlicht已经为目前主流开发工具Windows平台下Visual Studio、MacOS下的Xcode以及Linux平台下的GNU MAKE做好了项目配置。

笔者是在Windows操作系统下使用VS2012进行演示,双击BuildAllExamples_vc11.sln打开解决方案,无需做任何配置即可编译运行程序。

编译运行Collision案例程序:

看起来效果是不是很炫呢?Irrlicht为我们做了大量的封装,即便看似如此复杂的程序,实际代码不超过200行。

  1. #include <irrlicht.h>
  2. #include "driverChoice.h"
  3. using namespace irr;
  4. #ifdef _MSC_VER
  5. #pragma comment(lib, "Irrlicht.lib")
  6. #endif
  7. enum
  8. {
  9. ID_IsNotPickable = 0,
  10. IDFlag_IsPickable = 1 << 0,
  11. IDFlag_IsHighlightable = 1 << 1
  12. };
  13. int main()
  14. {
  15. video::E_DRIVER_TYPE driverType=video::EDT_OPENGL;//driverChoiceConsole();
  16. if (driverType==video::EDT_COUNT)
  17. return 1;
  18. IrrlichtDevice *device =
  19. createDevice(driverType, core::dimension2d<u32>(1024, 768), 16, false);
  20. if (device == 0)
  21. return 1; // could not create selected driver.
  22. video::IVideoDriver* driver = device->getVideoDriver();
  23. scene::ISceneManager* smgr = device->getSceneManager();
  24. device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3");
  25. scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp");
  26. scene::IMeshSceneNode* q3node = 0;
  27. if (q3levelmesh)
  28. q3node = smgr->addOctreeSceneNode(q3levelmesh->getMesh(0), 0, IDFlag_IsPickable);
  29. scene::ITriangleSelector* selector = 0;
  30. if (q3node)
  31. {
  32. q3node->setPosition(core::vector3df(-1350,-130,-1400));
  33. selector = smgr->createOctreeTriangleSelector(
  34. q3node->getMesh(), q3node, 128);
  35. q3node->setTriangleSelector(selector);
  36. }
  37. scene::ICameraSceneNode* camera =
  38. smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, 0, 0, true, 3.f);
  39. camera->setPosition(core::vector3df(50,50,-60));
  40. camera->setTarget(core::vector3df(-70,30,-60));
  41. if (selector)
  42. {
  43. scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
  44. selector, camera, core::vector3df(30,50,30),
  45. core::vector3df(0,-10,0), core::vector3df(0,30,0));
  46. selector->drop(); // As soon as we're done with the selector, drop it.
  47. camera->addAnimator(anim);
  48. anim->drop();
  49. }
  50. device->getCursorControl()->setVisible(false);
  51. scene::IBillboardSceneNode * bill = smgr->addBillboardSceneNode();
  52. bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );
  53. bill->setMaterialTexture(0, driver->getTexture("../../media/particle.bmp"));
  54. bill->setMaterialFlag(video::EMF_LIGHTING, false);
  55. bill->setMaterialFlag(video::EMF_ZBUFFER, false);
  56. bill->setSize(core::dimension2d<f32>(20.0f, 20.0f));
  57. bill->setID(ID_IsNotPickable); // This ensures that we don't accidentally ray-pick it
  58. scene::IAnimatedMeshSceneNode* node = 0;
  59. video::SMaterial material;
  60. node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/faerie.md2"),
  61. 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
  62. node->setPosition(core::vector3df(-90,-15,-140)); // Put its feet on the floor.
  63. node->setScale(core::vector3df(1.6f)); // Make it appear realistically scaled
  64. node->setMD2Animation(scene::EMAT_POINT);
  65. node->setAnimationSpeed(20.f);
  66. material.setTexture(0, driver->getTexture("../../media/faerie2.bmp"));
  67. material.Lighting = true;
  68. material.NormalizeNormals = true;
  69. node->getMaterial(0) = material;
  70. selector = smgr->createTriangleSelector(node);
  71. node->setTriangleSelector(selector);
  72. selector->drop(); // We're done with this selector, so drop it now.
  73. node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/ninja.b3d"),
  74. 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
  75. node->setScale(core::vector3df(10));
  76. node->setPosition(core::vector3df(-75,-66,-80));
  77. node->setRotation(core::vector3df(0,90,0));
  78. node->setAnimationSpeed(8.f);
  79. node->getMaterial(0).NormalizeNormals = true;
  80. node->getMaterial(0).Lighting = true;
  81. selector = smgr->createTriangleSelector(node);
  82. node->setTriangleSelector(selector);
  83. selector->drop();
  84. node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/dwarf.x"),
  85. 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
  86. node->setPosition(core::vector3df(-70,-66,-30)); // Put its feet on the floor.
  87. node->setRotation(core::vector3df(0,-90,0)); // And turn it towards the camera.
  88. node->setAnimationSpeed(20.f);
  89. node->getMaterial(0).Lighting = true;
  90. selector = smgr->createTriangleSelector(node);
  91. node->setTriangleSelector(selector);
  92. selector->drop();
  93. node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/yodan.mdl"),
  94. 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
  95. node->setPosition(core::vector3df(-90,-25,20));
  96. node->setScale(core::vector3df(0.8f));
  97. node->getMaterial(0).Lighting = true;
  98. node->setAnimationSpeed(20.f);
  99. // Just do the same as we did above.
  100. selector = smgr->createTriangleSelector(node);
  101. node->setTriangleSelector(selector);
  102. selector->drop();
  103. material.setTexture(0, 0);
  104. material.Lighting = false;
  105. scene::ILightSceneNode * light = smgr->addLightSceneNode(0, core::vector3df(-60,100,400),
  106. video::SColorf(1.0f,1.0f,1.0f,1.0f), 600.0f);
  107. light->setID(ID_IsNotPickable); // Make it an invalid target for selection.
  108. scene::ISceneNode* highlightedSceneNode = 0;
  109. scene::ISceneCollisionManager* collMan = smgr->getSceneCollisionManager();
  110. int lastFPS = -1;
  111. material.Wireframe=true;
  112. while(device->run())
  113. if (device->isWindowActive())
  114. {
  115. driver->beginScene(true, true, 0);
  116. smgr->drawAll();
  117. if (highlightedSceneNode)
  118. {
  119. highlightedSceneNode->setMaterialFlag(video::EMF_LIGHTING, true);
  120. highlightedSceneNode = 0;
  121. }
  122. core::line3d<f32> ray;
  123. ray.start = camera->getPosition();
  124. ray.end = ray.start + (camera->getTarget() - ray.start).normalize() * 1000.0f;
  125. core::vector3df intersection;
  126. core::triangle3df hitTriangle;
  127. scene::ISceneNode * selectedSceneNode =
  128. collMan->getSceneNodeAndCollisionPointFromRay(
  129. ray,
  130. intersection,
  131. hitTriangle,
  132. IDFlag_IsPickable,
  133. 0);
  134. if(selectedSceneNode)
  135. {
  136. bill->setPosition(intersection);
  137. driver->setTransform(video::ETS_WORLD, core::matrix4());
  138. driver->setMaterial(material);
  139. driver->draw3DTriangle(hitTriangle, video::SColor(0,255,0,0));
  140. if((selectedSceneNode->getID() & IDFlag_IsHighlightable) == IDFlag_IsHighlightable)
  141. {
  142. highlightedSceneNode = selectedSceneNode;
  143. highlightedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
  144. }
  145. }
  146. driver->endScene();
  147. int fps = driver->getFPS();
  148. if (lastFPS != fps)
  149. {
  150. core::stringw str = L"Collision detection example - Irrlicht Engine [";
  151. str += driver->getName();
  152. str += "] FPS:";
  153. str += fps;
  154. device->setWindowCaption(str.c_str());
  155. lastFPS = fps;
  156. }
  157. }
  158. device->drop();
  159. return 0;
  160. }

开源3D游戏引擎Irrlicht简介的更多相关文章

  1. 基于Java的开源3D游戏引擎jMonkeyEngine

    jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就 ...

  2. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

  3. 记录一下八款开源 Android 游戏引擎

    记录一下八款开源 Android 游戏引擎 虽然android学了点点,然后现在又没学了(我为啥这么没有恒心呢大哭).以后有时间还是要继续学android的,一定要啊!虽然现在没学android游戏编 ...

  4. 排名前10的H5、Js 3D游戏引擎和框架

    由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...

  5. 棒!使用.NET Core构建3D游戏引擎

    原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...

  6. Android 八款开源 Android 游戏引擎

    原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...

  7. 八款开源 Android 游戏引擎[转]

    记录一下,以备不时之需~~~~~ 虽然android学了点点,然后现在又没学了(我为啥这么没有恒心呢大哭).以后有时间还是要继续学android的,一定要啊!虽然现在没学android游戏编程,不过还 ...

  8. [转]八款开源Android游戏引擎

    八款开源Android游戏引擎 1.Angle Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发.该引擎全部用Java代码编写,并且可以根 ...

  9. 国内开源html5游戏引擎全收录

    本文引自<国内开源html5游戏引擎全收录> 游戏开发这潭水太深,英文水平太差,不敢看国外的, 而且这几年国内技术水平也挺高了不少,特别是JS方面.(我个人感觉) 最近看了几个国产的js游 ...

随机推荐

  1. HTTP 文件共享服务器工具 - chfs

    CuteHttpFileServer/chfs是一个免费的.HTTP协议的文件共享服务器,使用浏览器可以快速访问.它具有以下特点: 单个文件,整个软件只有一个可执行程序,无配置文件等其他文件 跨平台运 ...

  2. jquery及相关兼容插件的版本搭配

    1.jquery1.11.0 + jquery.validate.1.9.0.js + jquery.ui.1.10.4.js

  3. Bootstrap组件之输入框组

    .input-group--设置div为输入框组: .input-group-lg..input-group-sm..input-group-xs--改变输入框组的尺寸: .input-group-a ...

  4. OpenCASCADE直线与平面求交

    OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...

  5. CodeForces 550B Preparing Olympiad(DFS回溯+暴力枚举)

    [题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每一个题目有对应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x, ...

  6. 拥抱PBO(基于项目的组织)聚焦核心价值创造

    近年来.PBO(Project-Based Organizations)作为一种新兴的整合各类专业智力资源和专业知识的组织结构,受到越来越多的关注,第五版PMBOK出现的新词汇.三种组织(职能型.矩阵 ...

  7. 存储过程的调用和Parameters数组的调用

    记录一些杂记吧 declare @d datetime set @d=GETDATE() select * from [ACC_B2B].[dbo].ORDER_Head --where 1=1 se ...

  8. 14个优秀 JS 前端框架、库、工具及其使用时机

    这篇文章主要描述现今流行的一些 Javascript web 前端框架,库以及它们的适用场景. 新的 Javascript 库层出不穷,从而Web 社区愈发活跃.多样.在多方面快速发展.详细去描述每一 ...

  9. appium使用教程(二)-------------连接手机

    1. 安装驱动 说明:如果驱动装不上,可以使用第三方的工具去安装.(一般来说还是用第三方) 大概就是这个样子索. 2. 开启usb调试 1)开发者选项打开(不知道怎么打开的问度娘) 2)开启USB调试 ...

  10. 记intel杯比赛中各种bug与debug【其三】:intel chainer的安装与使用

    现在在训练模型,闲着来写一篇 顺着这篇文章,顺利安装上intel chainer 再次感谢 大黄老鼠 intel chainer 使用 头一次使用chainer,本以为又入了一个大坑,实际尝试感觉非常 ...