Irrlicht引擎主要是由一个名叫Nikolaus Gebhardt奥地利人所设计,是sourceforge上的一个开源项目。 Irrlicht是一个德国神话故事中的一种动物的名字,它能够发光和飞翔,可以在大部分的沼泽地附近发现它。单词"Irrlicht"是两个德国单词("irr"意思是疯狂的;而"Licht"意思是光)的组合。在英语中,它被译为"鬼火"。

Irrlicht采用C++封装该,是一款轻量级的、跨平台的、支持多种图形库的3D引擎,引擎本身精简强悍。irrlicht的设计很好的体现了接口和实现分离的原则,整个框架设计精巧清晰,是学习3d引擎设计的不错的教材。由于我研究这个引擎的目的主要是想分析其源代码,对3D引擎的结构及实现产生一个较直观深刻的认识,因此选择了该引擎的最早版本irrlicht0.1进行分析。本文中部分内容从Irrlicht文档或其它英文资料中翻译过来,由于并不是什么很严谨的科技文献,所以大部分地方采用意译的方法。

在这个网站上你能够找到它所有版本的源代码、文档以及更多的信息:http://irrlicht.sourceforge.net。项目从2004开始一直至今,后期发展了许多相关工具,如irrklang(音效引擎),irrEdit(3D编辑器)等。

主要技术特性

Irrlicht是一款由c++编写的3D引擎,由于底层的代码封装良好,所以该引擎可以在多个平台上使用,如WINDOWS、LINUX等。

整个引擎使用了类COM的中间件封装技术,这确保了引擎的跨平台使用和可扩展性,也就是当引擎内部被修改,原游戏逻辑代码不用改一行代码也可正常使用,而当需要向引擎添加新的技术特性,只需要符合它的规范和接口就可以很轻易的加入新的特性。

3D引擎的常见问题在于速度,而irr引擎速度非常快。

引擎概览

先看下名字空间的划分,Irr总命名空间下有5个子命名空间,可以看到irr具有非常清晰的结构:

irr Irrlicht引擎中的一切都在此命名空间下实现。除了它的5个子命名空间的内容之外,irr空间中提供了引擎的一些底层构架的支持,如事件处理系统,操作系统抽象,引用计数,设备抽象等。

irr::core 提供了基础的数学和数据结构构件,如向量,矩阵,列表,数组等等。

irr::gui 此命名空间包含了一些 创建一个简单的GUI所需的类

irr::io 此命名空间提供输入/输出的接口:读/写文件,访问zip文件等等

irr::scene 所有与场景管理相关的都可以在此命名空间中找到:camera, Mesh加载,像八叉树和广告牌之类特殊的场景结点,等等

irr::video 此命名空间包含访问图形驱动器的一些类,所有的2D和3D渲染都在此完成。它将d3d,Opengl等绘图的部分进行封装,与外部隔离起来。

我想重点剖析的是irr::video和irr::scene,这是3d引擎的核心部分,目的是分析irrlicht是如何将不同的图形API进行抽象的,以及如何进行引擎的运转,并将各种3d技术融入到这个体系中的。另外irr如何做到跨平台支持的也会进行剖析。

Irrlicht的窗口管理

Irrlicht窗口封装(仅分析Windows部分)

首先看下文档中的Hello World 例子:

IrrlichtDevice *device =

createDevice(DT_SOFTWARE, dimension2d(512, 384), 16, false, 0);

IVideoDriver* driver = device->getVideoDriver();

ISceneManager* smgr = device->getSceneManager();

上述代码显示了irrlicht最基本的几个对象-设备、图形驱动、场景管理器。简单看来,通过全局函数createDevice根据指定的驱动类型创建一个设备,之后可通过设备对象得到驱动对象以及场景管理器对象。

device->setWindowCaption(L"Hello World!" );

//设备对象具有一些设备相关的能力,比如这儿可以设置窗口标题。

//加载md2模型

IAnimatedMesh* mesh = smgr->getMesh("..//media//sydney.md2");

IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );

//设置材质和纹理

if (node)

{

node->setMaterialFlag(EMF_LIGHTING, false);

node->setFrameLoop(0, 310);

node->setMaterialTexture( 0, driver->getTexture("..//media//sydney.bmp") );

}

// 添加一个像机

smgr->addCameraSceneNode(0, vector3df(0,20,-60), vector3df(0,0,0));

这几行代码显示了scene graph体系,ISceneNode是irrlicht场景中基础组成部分节点的抽象,这儿添加了一个动画mesh节点,和一个camera节点。节点具有材质属性(当然camera并不需要材质,但是ISceneNode作为一个抽象要尽量兼顾各种节点,为了让接口的层次简单些,这样做也是一个实用的方法)

// 主循环,渲染

while(device->run())

{

driver->beginScene(true, true, Color(0,100,100,100));

smgr->drawAll();

driver->endScene();

}

这几行是引擎运转的过程,首先引擎运转的条件是设备仍然在运转:device->run(),可通过closeDevice关闭设备。 smgr ->drawAll()执行了所有节点的渲染,节点的渲染不仅仅是draw,节点的transform计算,动画计算(包括骨骼动画),camera这种特殊节点的操作(特殊的节点还有光源等),都包含在渲染的范畴中,在drawAll中统一调用,各种节点实现各自的渲染,最终由 smgr统一管理(如排序)绘制,这正是基于scene graph架构的引擎的特点之一。

device->drop();

这一句体现了irrlicht的引用计数机制,通过grab,drop管理对象引用次数。这儿如果一切正常应该是引用drop为0,device销毁自己,退出程序。

从这个很短的例子可以看到irrlicht的基本构件和运行过程。irrlicht提供了scene的管理机制,并提供了大量预定义好的scene nodes,实现了很多的功能,这样你就可以很方便的使用引擎。并且这种机制的好处是,节点可以不断的扩展,并可以在以后的项目中复用。

整理参考:

hellphenix的专栏:http://blog.csdn.net/hellphenix/archive/2008/03/19/2198226.aspx

小时候可靓了:http://blog.csdn.net/wqjqepr/archive/2010/04/26/5528528.aspx

游戏的行者:http://blog.csdn.net/n5/archive/2009/07/08/4329603.aspx

游戏的行者:http://blog.csdn.net/n5/archive/2008/12/15/3516219.aspx

游戏的行者:http://blog.csdn.net/n5/archive/2009/07/05/4323332.aspx

游戏的行者:http://blog.csdn.net/n5/archive/2009/07/12/4342758.aspx

Flyflyking:http://blog.csdn.net/flyflyking/archive/2011/03/30/6289698.aspx

转:Irrlicht 0.1引擎源码分析与研究(一)的更多相关文章

  1. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  2. Android7.0 Phone应用源码分析(一) phone拨号流程分析

    1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...

  3. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

  4. Android7.0 Phone应用源码分析(四) phone挂断流程分析

    电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...

  5. Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程

    前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...

  6. Backbone.js 0.9.2 源码分析收藏

    Backbone 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富A ...

  7. wukong引擎源码分析之索引——part 1 倒排列表本质是有序数组存储

    searcher.IndexDocument(0, types.DocumentIndexData{Content: "此次百度收购将成中国互联网最大并购"}) engine.go ...

  8. Android 7.0 Gallery图库源码分析1 - 初识Gallery源码

    分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity. <activity ...

  9. Java SPI、servlet3.0与@HandlesTypes源码分析

    关于Java SPI与servlet3.0的应用,这里说的很精炼,链接地址如下. https://blog.csdn.net/pingnanlee/article/details/80940993 以 ...

随机推荐

  1. window.open不被拦截的实现代码

    $("#last").click(function(){ var w=window.open(); setTimeout(function(){ w.location=" ...

  2. 使用Java语言开发微信公众平台(八)——自定义菜单功能

    随着上一篇文章的结束,我们已经实现了所有消息的类型的回复功能.今天,我们来学习更加高大上,也更加重要的自定义菜单功能. 一.了解自定义菜单 自定义菜单是微信公众平台最常用也是最重要的功能之一.根据微信 ...

  3. 以相声之名说android四大对象

    当里个当,当里个当,Android此系统,易用有好用.谁为其奉献,只靠四巨头. 当里个当,当里个当,老大唤activity,界面缔造者.清水出芙蓉,天然来雕饰. 当里个当,当里个当,你若明白他,周期咋 ...

  4. 转:无监督特征学习——Unsupervised feature learning and deep learning

    http://blog.csdn.net/abcjennifer/article/details/7804962 无监督学习近年来很热,先后应用于computer vision, audio clas ...

  5. Spring(九):Spring配置Bean(二)自动装配的模式、Bean之间的关系

    XML配置里的Bean自动装配 Spring IOC容器可以自动装配Bean,需要做的仅仅是在<bean>的autowire属性里指定自动装配的模式,模式包含:byType,byName, ...

  6. Git创建分支/GIT提交分支

    git clone xxx.git cd fwspp-react git init touch README.md git add README.md git commit -m "add ...

  7. 命令行下从bak文件恢复sqlserver数据库方法

    命令行下从bak文件恢复sqlserver数据库方法 注:本文所示访问从SqlServer 2000 - 2014版都是通用的 参考:http://blog.sina.com.cn/s/blog_5c ...

  8. IncrediBuild 2.40 过期时间

    IncrediBuild 2.40的License有2个文件CoordLicense.dat和AgentLicense.dat,分别位于Coordinator和Agent安装目录下,这两个文件都是RS ...

  9. slf4j、jcl、jul、log4j1、log4j2、logback大总结

    1 系列目录 jdk-logging.log4j.logback日志介绍及原理 commons-logging与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j ...

  10. 通过项目逐步深入了解Mybatis<二>

    Mybatis 解决 jdbc 编程的问题 1. 数据库链接创建.释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题. 解决:在SqlMapConfig.xml中配置数据链接池 ...