Irrlicht引擎

2024-01-12 14:58
文章标签 引擎 irrlicht

本文主要是介绍Irrlicht引擎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Irrlicht引擎简介

Irrlicht引擎是一个用C++编写的高性能实时3D引擎。该引擎支持底层图形接口Direct3DOpenGL,并且自带了软件渲染的实现。Irrlicht引擎还提供了诸如动态阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等功能特性。

Irrlicht是一个德国神话故事中的一种动物的名字,它能够发光和飞翔,可以在大部分的沼泽地附近发现它。单词"Irrlicht"是两个德国单词("irr"意思是疯狂的;而"Licht"意思是光)的组合。在英语中,它被译为"鬼火"。 

二、Irrlicht引擎的组成结构

Irrlicht引擎共分为五部分:

1)Core

该部分由一些容器类及数学库组成,如stringvector等。

对应的名字空间为:namespace irr::core

2)Scene

该部分主要负责三维场景的绘制及管理,包括场景节点,摄像机,粒子系统、mesh 资源,公告板,灯光,动画器,天空体,地形等。

Irrlicht的场景中的所有的东西都是场景节点,统一由场景管理器来管理。

对应的名字空间为:namespace irr::scene

3)Video

该部分主要负责图片纹理的载入及管理,包括纹理,材质,灯光,图片,顶点等渲 染属性的控制。

对应的名字空间为:namespace irr::video

4)GUI

该部分包括了一些二维GUI控件

对应的名字空间为:namespace irr::gui

5)FileSystem

该部分负责文件系统的读写。

对应的名字空间为:namespace irr::io

三、Irrlicht编程步骤

1、获取设备指针

在编写任何一个Irrlicht程序时,首选需要做的就是获取设备指针 

IrrlichtDevice  *device :

 video::E_DRIVER_TYPE driver_type = irr::video::EDT_OPENGL;   

 core::dimension2d<s32> screen_resolution = core::dimension2d<s32>(1280, 800);   

 u32 color_depth = 32;   

 bool is_full_screen = true;   

   

 IrrlichtDevice* device = irr::createDevice(driver_type, screen_resolution, color_depth, is_full_screen); 

driver_type为驱动类型,可以选择OPENGLDX8 或 DX9。其余几个参数分别为分辨率,颜色 深度,是否全屏。

获得 device 指针以后,就可以得到属于该 device 的四大块功能:

video::IVideoDriver* driver = device->getVideoDriver();   

scene::ISceneManager* scene_mgr = device->getSceneManager();   

gui::IGUIEnvironment* gui_env = device->getGUIEnvironment();   

io::IFileSystem* file_system = device->getFileSystem();  

2、创建3D场景

创建3D场景有三个步骤:

(1) 通过场景管理器scene_mgr添加3D物体

 // 为场景添加一个立方体,边长100  

 scene::ISceneNode* cube = scene_mgr->addCubeSceneNode(100.0f);   

(2) 为3D物体贴上纹理:

 // 载入纹理  

 video::ITexture* tex = driver->getTexture("box.jpg");   

   

 // 将纹理附加到立方体上  

 cube->setMaterialTexture(0, tex);   

   

 // 将纹理EMF_LIGHTING属性设为false  

 // 表示该纹理现实与光源无关,即为图片自身颜色  

 cube->setMaterialFlag(video::EMF_LIGHTING, false);   

   

 // 使纹理支持半透明,半透明效果与图片相同  

 cube->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL);   

(3) 添加Camera,使物体可见

 // 添加一个相机,在(700,700,-700)位置,往(0,0,0)位置拍摄。  

 scene::ICameraSceneNode* camera = scene_mgr->addCameraSceneNode(0,    

     core::vector3df(700,700,-700), core::vector3df(0,0,0));  

3、进入主循环

通过 driver 载入图片和 texture,通过 scene_mgr 3d场景添加 irrlicht 内置支持的3D对象等工作后,即可进入主循环,主循环结束时,释放 device,程序结束。其中 beginScene 的参数 SColor(alpha, r, g, b) 为背景色

1 while (device->run())   

2 {   

3     if (device->isWindowActive())   

4     {   

5         driver->beginScene(true, true, video::SColor(0, 0, 0, 0));   

6         scene_mgr->drawAll();   

7         gui_env->drawAll();   

8         driver->endScene();   

9     }   

10 }   

11 device->drop();  

值得一提的是 drop() 函数。Irrlicht中大部分类都继承自一个 IReferenceCounted 的接口,类似智能指针。Irrlicht 中的惯例是不使用 delete 删除对象,而调用该接口的 drop() 函数。在添加对象的引用时,调用 grap() 函数。

四、Irrlicht引擎之场景中的对象结构

3D对象在场景中被组织成一个树形结构,在该树中,仅有一个根节点。当在程序的主循环中调用scene_mgr->drawAll()时,系统会从场景的树形结构的根节点开始递归绘制所有的节点对象。

每一个节点对象都维护了一个“动画效果”ISceneNodeAnimator列表:

core::list<ISceneNodeAnimator*> Animators;

在绘制每一个节点对象之前,都会将其所维护的所有动画效果应用到该节点上。

“动画效果”的原理是,当节点每次被绘制之前,均先根据其维护的动画对象Animators来计算出该节点的位置、大小、纹理。这样,当一个节点不断被绘制时,就产生了动画效果。

五、Irrlicht引擎之3D对象运动原理

所谓运动,实际上是计算机在不停地绘制场景,每绘制一次称之为一帧。 当各帧中物体的位置或外观有所变化,那么它就动起来了。 在irrlicht中,绘制一帧是在run循环中完成的:

1 while (device->run())   

2 {   

3     if (device->isWindowActive())   

4     {   

5         driver->beginScene(true, true, video::SColor(0, 0, 0, 0));   

6         scene_mgr->drawAll();  // 绘制一帧  

7         driver->endScene();   

8     }   

9 }   

10 device->drop();  

我们所要做的,就是在 drawAll() 函数中,更新物体的位置及大小等属性,那么场景就动起来了。

在Irrlicht中,所有与运动相关的一切,都与 scene::ISecenNodeAnimator 这个接口相关。凡是实现这个接口的类实例,都可以通过 addAnimator() 函数加入到 ISceneNode 所维护的animators列表中。 

SceneManager drawAll() 函数在渲染(render)场景前,会调用其OnAnimate() 函数。这个函数是递归的,以保证加入场景中的每个 SceneNode 会被调用。 在OnAnimate() 函数中, SceneNode 的每一个 ISecenNodeAnimator 的 animateNode() 函数都会被调用,以更新 SceneNode 的位置、大小或纹理等属性。 

其具体的调用顺序如下: 

1. SceneManager           --> drawAll()                 绘制一帧画面

2. ISceneNode             --> OnAnimate()              SceneNode运动  

3. ISceneNodeAnimator --> animateNode(ISceneNode)      实现运动的具体函数

4. SceneManager           --> render()                  渲染

 

可见,只要实现 ISecenNodeAnimator 接口,并加入到 SceneNode 中,就能够让该SceneNode 运动起来。而至于具体如何运动,完全可由自己来定义。

六、Irrlicht引擎之消息传递原理

Irrlicht引擎中消息的传递是从device->run()开始的,首先由具体平台的操作系统接口将接收到的用户消息打包成IrrlichtSEvent结构(这一步打包过程是在device->run()中完成的),再由postEventFromUser()该消息依次传递给UserReceiver, GUI 和 3D Scene

Irrlicht 中所有处理消息的类都必须实现 IEventReciever 接口。UserReceiver 就是在CreateDevice函数中指定的一个 IEventReceiver。 也就是说,消息处理的优先级为 UserReceiver > GUI > 3D Scene

如果在程序中,没有指定UserReceiver和GUI,消息就会直接交给SceneManager

SceneManager 的消息,也由 ISceneManager 的 postEventFromUser() 传递。 这个函数的实现如下:

1 bool CSceneManager::postEventFromUser(const SEvent& event)   

2 {   

3     bool ret = false;   

4     ICameraSceneNode* cam = getActiveCamera();   

5     if (cam)   

6         ret = cam->OnEvent(event);   

7   

8     _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;   

9     return ret;   

10 }  

也就是说,只有当前Active(有效)的 ICameraSceneNode 才会接收到消息。ICameraSceneNode 会检测ISceneNodeAnimator isEventReceiverEnabled(), 如果为真则调用其OnEvent 函数。 

整理消息传递的机制如下:

 

1. IrrlichtDevice           --> run()                      搜集消息并打包

2. IrrlichtDevice           --> postEventFromUser()    传递消息到userReceiver     GUI 和 Scene

3. ISceneManager         --> postEventFromUser()       传递消息到CameraNode

4. ICameraSceneNode     --> onEvent()                  调用 Animator onEvent

5. ISceneNodeAnimator    --> onEvent()  // if enabled      响应消息。

 

可见,实现 ISceneNodeAnimator 虽然可以 SceneNode 动起来,但只有在 ICameraSceneNode 上,才能够接收和处理消息。

 

这篇关于Irrlicht引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598236

相关文章

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

Smarty模板引擎工作机制(一)

深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。 在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码: <?php$title="深处浅出之Smarty模板引擎工作机制";$content=

MySQL技术内幕_innodb存储引擎

MySQL技术内幕_innodb存储引擎 INNODB innodb中如果表没有主键 表是否由 非空唯一键,有则该字段为主键没有,则自动创建一个6字节大小的指针 innodb存储引擎的所有数据都存储在表空间中,表空间由段,区,页(块)组成。 如果启用了 innodb_file_per_table, 则每张表内的数据可以单独放在一个表空间中即使启用了上面参数,共享表空间也会因为 系统事务信息

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

认识鬼火引擎

一、Irrlicht简介 (1)概念Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台)、OpenGL 或它自己的软件着色程序,可以实现该引的完​全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(

一个图形引擎的画面风格是由那些因素(技术)决定的?

可能很多人第一直覺會認為shader決定了視覺風格,但我認為可以從多個方面去考慮。 1. 幾何模型 一個畫面由多個成分組成,最基本的應該是其結構,在圖形學中通常稱為幾何模型。 一些引擎,如Quake/UE,有比較強的Brush建模功能(或應稱作CSG),製作建築比較方便。而CE則有較強的大型地表、植被、水體等功能,做室外自然環境十分出色。而另一些遊戲類型專用的引擎,例

气膜场馆:乡村振兴中的健康与经济新引擎—轻空间

随着乡村振兴战略的深入推进,气膜场馆作为新兴建筑形式,正在为农村地区带来全新的发展机遇。它不仅是乡村百姓锻炼身体的好去处,更是带动当地经济发展的强劲动力。 首先,气膜场馆为农村地区的居民提供了更多运动健身的机会。与传统体育设施相比,气膜场馆建设周期短、成本低,非常适合在乡村快速推广。通过提供羽毛球、篮球、排球等多种运动项目,村民可以在空闲时间增强体质,改善生活方式。这对于长期从事农业劳动的村

基于 RocketMQ 的云原生 MQTT 消息引擎设计

作者:沁君 概述 随着智能家居、工业互联网和车联网的迅猛发展,面向 IoT(物联网)设备类的消息通讯需求正在经历前所未有的增长。在这样的背景下,高效和可靠的消息传输标准成为了枢纽。MQTT 协议作为新一代物联网场景中得到广泛认可的协议,正逐渐成为行业标准。 本次我们将介绍搭建在 RocketMQ 基础上实现的 MQTT 核心设计,本文重点分析 RocketMQ 如何适应这些变化,通过优化存储

【mysql 存储引擎】MySQL常用存储引擎及特点

SHOW ENGINES;SHOW VARIABLES LIKE 'have%';SHOW VARIABLES LIKE 'storage_engine' 1.InnoDB存储引擎特点: 1)给MySQL数据库提供事物,包括回滚,包括修复能力,多版本并发控制事物安全。 2)支持外界元素。 3)创建表结构是存储在“.fim”文件中,数据和索引,数据分别存储在innodb表空间中。 4)缺点

UE引擎工具链

当我们提到“引擎工具链的开发”时,通常指的是为游戏开发或其他类型的软件开发创建一系列工具和技术栈的过程。这包括但不限于游戏引擎本身(如Unity或Unreal Engine),以及围绕这些引擎构建的各种工具和服务,比如用于构建关卡编辑器、物理模拟工具、动画系统、脚本环境、调试工具、性能分析工具等等。 对于游戏引擎工具链的开发,开发者们通常需要掌握以下技能和知识: 1. **编程语言**:大多数