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. REST构架风格介绍之二:CRUD

    转载自:Todd  Wei    http://www.cnblogs.com/weidagang2046/archive/2009/05/09/1453065.html 上一节我们通过两个例子初步体 ...

  2. K3 LEDE固件更改FRP客户端版本

    1.下载文件 /usr/bin/wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.23. ...

  3. 会动的文字Marquee应用(转)

    想要做个滚动公告,看了网上的教程,无一不是很恐怖的场频啊java语言编制的JS,或者就是各种复杂,无意中发现了Marquee这东西,用了一下,很简单,只需两行代码,即可以实现很好的效果,特此分享一下. ...

  4. [leetcode]Merge Intervals @ Python

    原题地址:https://oj.leetcode.com/problems/merge-intervals/ 题意: Given a collection of intervals, merge al ...

  5. 构建配置 defaultConfig signingConfigs buildTypes productFlavors dependencies

    测试项目位置:https://github.com/baiqiantao/FragmentTest.git 项目结构: project 目录的 build.gradle 文件 // Top-level ...

  6. 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

    http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...

  7. java 上传图片压缩图片

    package com.bitspace.flame.util; import java.io.File; import java.awt.Image;import java.awt.image.Bu ...

  8. [Node.js] process.nextTick for converting sync to async

    For example we have a function to check the filesize: const fs = require('fs'); function fileSize (f ...

  9. [Git] Undo my last commit and split it into two separate ones

    When you accidentally committed some changes to your branch you have various possibilities to “undo” ...

  10. tar 使用总结

    今天需要备份数据,使用tar命令,总结一下. 压缩命令: tar -zvvf ticket-data-intgration.tar.gz ticket-data-intgration 压缩但是不包含某 ...