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行。

#include <irrlicht.h>
#include "driverChoice.h"using namespace irr;#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif
enum
{   ID_IsNotPickable = 0,IDFlag_IsPickable = 1 << 0,IDFlag_IsHighlightable = 1 << 1
};
int main()
{video::E_DRIVER_TYPE driverType=video::EDT_OPENGL;//driverChoiceConsole();if (driverType==video::EDT_COUNT)return 1;IrrlichtDevice *device =createDevice(driverType, core::dimension2d<u32>(1024, 768), 16, false);if (device == 0)return 1; // could not create selected driver.video::IVideoDriver* driver = device->getVideoDriver();scene::ISceneManager* smgr = device->getSceneManager();device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3");scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp");scene::IMeshSceneNode* q3node = 0;if (q3levelmesh)q3node = smgr->addOctreeSceneNode(q3levelmesh->getMesh(0), 0, IDFlag_IsPickable);scene::ITriangleSelector* selector = 0;if (q3node){q3node->setPosition(core::vector3df(-1350,-130,-1400));selector = smgr->createOctreeTriangleSelector(q3node->getMesh(), q3node, 128);q3node->setTriangleSelector(selector);}scene::ICameraSceneNode* camera =smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, 0, 0, true, 3.f);camera->setPosition(core::vector3df(50,50,-60));camera->setTarget(core::vector3df(-70,30,-60));if (selector){scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(30,50,30),core::vector3df(0,-10,0), core::vector3df(0,30,0));selector->drop(); // As soon as we're done with the selector, drop it.camera->addAnimator(anim);anim->drop();  }device->getCursorControl()->setVisible(false);scene::IBillboardSceneNode * bill = smgr->addBillboardSceneNode();bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );bill->setMaterialTexture(0, driver->getTexture("../../media/particle.bmp"));bill->setMaterialFlag(video::EMF_LIGHTING, false);bill->setMaterialFlag(video::EMF_ZBUFFER, false);bill->setSize(core::dimension2d<f32>(20.0f, 20.0f));bill->setID(ID_IsNotPickable); // This ensures that we don't accidentally ray-pick itscene::IAnimatedMeshSceneNode* node = 0;video::SMaterial material;node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/faerie.md2"),0, IDFlag_IsPickable | IDFlag_IsHighlightable);node->setPosition(core::vector3df(-90,-15,-140)); // Put its feet on the floor.node->setScale(core::vector3df(1.6f)); // Make it appear realistically scalednode->setMD2Animation(scene::EMAT_POINT);node->setAnimationSpeed(20.f);material.setTexture(0, driver->getTexture("../../media/faerie2.bmp"));material.Lighting = true;material.NormalizeNormals = true;node->getMaterial(0) = material;selector = smgr->createTriangleSelector(node);node->setTriangleSelector(selector);selector->drop(); // We're done with this selector, so drop it now.node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/ninja.b3d"),0, IDFlag_IsPickable | IDFlag_IsHighlightable);node->setScale(core::vector3df(10));node->setPosition(core::vector3df(-75,-66,-80));node->setRotation(core::vector3df(0,90,0));node->setAnimationSpeed(8.f);node->getMaterial(0).NormalizeNormals = true;node->getMaterial(0).Lighting = true;selector = smgr->createTriangleSelector(node);node->setTriangleSelector(selector);selector->drop();node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/dwarf.x"),0, IDFlag_IsPickable | IDFlag_IsHighlightable);node->setPosition(core::vector3df(-70,-66,-30)); // Put its feet on the floor.node->setRotation(core::vector3df(0,-90,0)); // And turn it towards the camera.node->setAnimationSpeed(20.f);node->getMaterial(0).Lighting = true;selector = smgr->createTriangleSelector(node);node->setTriangleSelector(selector);selector->drop();node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/yodan.mdl"),0, IDFlag_IsPickable | IDFlag_IsHighlightable);node->setPosition(core::vector3df(-90,-25,20));node->setScale(core::vector3df(0.8f));node->getMaterial(0).Lighting = true;node->setAnimationSpeed(20.f);// Just do the same as we did above.selector = smgr->createTriangleSelector(node);node->setTriangleSelector(selector);selector->drop();material.setTexture(0, 0);material.Lighting = false;scene::ILightSceneNode * light = smgr->addLightSceneNode(0, core::vector3df(-60,100,400),video::SColorf(1.0f,1.0f,1.0f,1.0f), 600.0f);light->setID(ID_IsNotPickable); // Make it an invalid target for selection.scene::ISceneNode* highlightedSceneNode = 0;scene::ISceneCollisionManager* collMan = smgr->getSceneCollisionManager();int lastFPS = -1;material.Wireframe=true;while(device->run())if (device->isWindowActive()){driver->beginScene(true, true, 0);smgr->drawAll();if (highlightedSceneNode){highlightedSceneNode->setMaterialFlag(video::EMF_LIGHTING, true);highlightedSceneNode = 0;}core::line3d<f32> ray;ray.start = camera->getPosition();ray.end = ray.start + (camera->getTarget() - ray.start).normalize() * 1000.0f;core::vector3df intersection;core::triangle3df hitTriangle;scene::ISceneNode * selectedSceneNode =collMan->getSceneNodeAndCollisionPointFromRay(ray,intersection, hitTriangle, IDFlag_IsPickable, 0);     if(selectedSceneNode){bill->setPosition(intersection);driver->setTransform(video::ETS_WORLD, core::matrix4());driver->setMaterial(material);driver->draw3DTriangle(hitTriangle, video::SColor(0,255,0,0));if((selectedSceneNode->getID() & IDFlag_IsHighlightable) == IDFlag_IsHighlightable){highlightedSceneNode = selectedSceneNode;highlightedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);}}driver->endScene();int fps = driver->getFPS();if (lastFPS != fps){core::stringw str = L"Collision detection example - Irrlicht Engine [";str += driver->getName();str += "] FPS:";str += fps;device->setWindowCaption(str.c_str());lastFPS = fps;}}device->drop();return 0;
}

开源3D游戏引擎Irrlicht简介相关推荐

  1. [原创]四大开源3d游戏引擎探究(前言上)

    [声明] 本人水平有限,只对于长久以来研究的几个经典3d游戏引擎的设计思想.程序架构和应用行深入剖析的结果与游戏开发同行分享,文档有不妥之处请指出,期待我们的共同进步. 引擎名称: 1.       ...

  2. 3D游戏引擎原理简介

    作者:Luke Hodorowicz 翻译:乐晨光 (2001/9/28) 本人对3D也不甚了解,译文动机一则是内容所致兴致昂然,二则锻炼英译中技能.由本人水平及经验有限,文中绝对不乏大量误解与误译, ...

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

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

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

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

  5. 支持树莓派Raspberry Pi的Delphi开源3D游戏引擎CGE:Castle Game Engine

    最近我得到了我的Raspberry Pi 4设备,我对这些可能性感到兴奋(具有全功能Linux的小型便宜设备).我很高兴看到Castle Game Engine在它上面完美运行?以下是在Raspber ...

  6. 原创2D/3D游戏引擎源代码开源

    个人2D.3D游戏引擎开源 早期的作品代码结构较差,对大家造成的误导敬请谅解.我会不断的更新个人作品,请大家始终参考最新的源码.在此感谢热心网友给我提的宝贵意见. (2015.4.12修改:更新了2D ...

  7. 基于Volcano 3D游戏引擎开发一个类似魔兽世界的场景

    VOLCANO MMORPG 3D游戏引擎简介 1.基本介绍:http://volcano2014.cn/ VOLCANO是一款MMORPG(大型多人在线角色扮演)3D网络游戏的开发引擎,用作支持用户 ...

  8. 开源图形/游戏引擎的点评

    开源图形/游戏引擎的点评 什么是游戏引擎?举个简单例子,在某游戏中的一个场景中,玩家控制的角色躲藏在屋子里,敌人正在屋子外面搜索玩家.突然控制的角色碰倒了桌子上的一个杯子,杯子坠地发出破碎声,敌人在听 ...

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

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

  10. 开源Flash游戏引擎PushButton Engine

    介绍开源Flash游戏引擎PushButton Engine  最近,一个开源 的Flash游戏引擎PushButton引擎发布了,与以往的游戏引擎不同的是,这是一个模块化的游戏引擎,也就是说它提供了 ...

最新文章

  1. pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引
  2. 每瓶汽水一元,两个空瓶可以置换一瓶汽水,现有N元,最多能喝多少瓶?
  3. 几个让我印象深刻的面试题(二)
  4. PHP如何保存当前用户
  5. SQL Server中 sysobjects、syscolumns、systypes
  6. ajax存储表单数据,使用ajax json将表单数据存储到数据库php
  7. Linux系统下如何使用中文输入法
  8. iptv鉴权 php,[转]关于openwrt用于dhcp客户端协议突破iptv的dhcp+鉴权(ipoe)
  9. cam350怎么看顶层_CAM350常用快捷键
  10. 使用VBA清空数据记录
  11. 同心向前,Google Play 十周年啦!
  12. java实现word、pdf、excel文件下载功能
  13. PPT制作--这不是技巧,而是常识 然而好多人并不知道 (hsyl007转载整理)
  14. java max重载_浅谈Java方法的重载
  15. ASM 系列详细教程-02-ASM 整体概览
  16. STM32 + UCGUI+外扩NAND FLASH 中文字库支持方法
  17. win10 pip安装mmcv-full
  18. Citrix HDX 3D 优化建议
  19. 初级会计实务(2020年)——第一章 会计概述
  20. 【Introductory Biology】Lecture 13 - Genetics 2 - Rules of Inheritance 遗传学2 - 继承规则

热门文章

  1. webservice 框架比较
  2. JavaScript到底应该怎么用?
  3. element-ui 固定弹窗底部的按钮
  4. MATLAB视频与图片之间的相互转换
  5. [Matlab] norm函数用法(用于RMSE和R2)
  6. Adobe Creative Cloud没有管理应用程序的权限
  7. IMDB 2003.07.12 最新排名
  8. C语言实验报告排错分析,C语言实验报告模板剖析.doc
  9. 怎样彻底帮妹子解决weditor的安装的问题
  10. Java与完成端口IOCP