`
arec
  • 浏览: 33205 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Irrlicht 游戏引擎开发 cooliris 界面(二)

阅读更多

经过昨天比较枯燥的准备工作后,今天我们的目标是实现本地图片载入 3D 场景,主要内容是熟悉irrlicht引擎,创建一个3D窗口,并绘制图片。

 

总共有两个示例,源代码下载:

example_1.zip

example_2.zip

 

一、irrlicht 简介

 

irrlicht 游戏引擎的分成五大块:

Core:              容器类和数学库       namespace irr::core

Scene:            三维场景绘制和管理      namespace irr::scene

Video:            图片纹理的载入和管理   namespace irr::video

GUI:                二维 GUI 控件                 namespace irr::gui

FileSystem:    文件系统读写                namespace irr::io

 

编写任何一个 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为驱动类型,可以选择OPENGL,DX8 或 DX9。其余几个参数分别为分辨率,颜色深度,是否全屏。

s32, u32 为 irrlicht 定义的类型,分别对应 int 和 unsigned int。

 

获得 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();

 

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

 

    while (device->run())
    {
        if (device->isWindowActive())
        {
            driver->beginScene(true, true, video::SColor(0, 0, 0, 0));
            scene_mgr->drawAll();
            gui_env->drawAll();
            driver->endScene();
        }
    }
    device->drop();

 

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

 

二、创建3D场景
创建3D场景有三个步骤:(1) 通过scene_mgr添加3D物体;(2)为物体贴上纹理;(3) 添加Camera,使物体可见。
在 device->run() 之前添加如下代码
// 为场景添加一个立方体,边长100
scene::ISceneNode* cube = scene_mgr->addCubeSceneNode(100.0f);

// 载入纹理
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);

// 添加一个相机,在(700,700,-700)位置,往(0,0,0)位置拍摄。
scene::ICameraSceneNode* camera = scene_mgr->addCameraSceneNode(0, 
    core::vector3df(700,700,-700), core::vector3df(0,0,0));
 至此,您应该可以看到一个立方体在场景中央。

以上源代码和所需文件在附件example_1.zip 中。

三、创建 3DWall

源代码参见example_2.zip ,源代码中的内容不再逐行解释了。
Device的驱动为OPENGL,需要修改请转到 util.h 的GetDevice()函数中。
例子二中3D场景的创建,移到了era::wall::CWallManager 的 UpdateScene() 函数中:
video::ITexture* tex = era::Util::Instance()->GetDriver()->addTexture("", img);
core::vector3df size(img->getDimension().Width, img->getDimension().Height, 0.01);
wallitem = smgr->addCubeSceneNode(1, smgr->getRootSceneNode(), -1, 
    core::vector3df(400*(i/3),300*(1-(i%3)), 0), core::vector3df(0,0,0), size);
图片被当成 例子一 中 cube 的纹理,填在上面。
你也许会很奇怪,怎么这些 cube 都是扁扁的? 这都是addCubeSceneNode 的最后一个参数 size 的作用。 size将长宽设为图片相同,厚度为0.01. 这样在3D环境中就是个扁扁的图片了。
第四个参数决定了cube在3d场景中的位置core::vector3df(400*(i/3),300*(1-(i%3)), 0)。这样,图片按照如下顺序排列:
1  4  7 ....   
2  5  8  ....
3  6  .......
还值得一提的是,为了节约内存,使用了缩略图。由于irrlicht自身的缩略图算法效率很低,因此程序运行起来,需要等待比较长的时间才能将图片全部载入。另外我在 util.h 编写了 FeatherEdge() 函数,为缩略图添加了阴影(效果并不是很好,但也还过得去了)。
编译运行后,您应该能看到如下画面:

 

 

今天就到这里,下一篇,我们让它动起来

  • 大小: 8.1 KB
  • 大小: 58.1 KB
12
0
分享到:
评论
6 楼 fr_han 2012-08-15  
baby66 写道
  运行不能 尴尬啊
第一个说 无法定位程序入口*****于动态链接库Irrlicht.dll上。好像是这个  IrrlichtDevice* device = createDevice(driver_type, screen_resolution, color_depth, is_full_screen); 的问题
第二个说  error C2039: 'createImage' : is not a member of 'irr::video::IVideoDriver' 找不到这个方法 同理 'copyTo' : is not a member of 'irr::video::IImage'

额 用的vs2005  Irrlicht-1.5.zip http://downloads.sourceforge.net/irrlicht/irrlicht-1.5.zip

Freetype-2.3.5-1-bin.zip http://gnuwin32.sourceforge.net/downlinks/freetype-bin-zip.php

Zlib123.zip http://www.zlib.net/zlib123-dll.zip

这三个都是按照您给的连接下的 头大了 怎么会这样呢 懊恼

这个问题的解决方法是:重新生成irrlicht.dll文件即可
5 楼 kira0001 2012-04-17  
白色featherEdge对边缘是深色的图使用,效果非常漂亮,可以感觉到一个很清晰锋利的边(比如蜗牛那张),但是对边缘是白色的图就显得有点软了。

我试着在图片四周加了一个黑框,看起来似乎挺不错的~

一起来这里学习Irrlicht的同学们,有兴趣可以试一试我的这个提议呀>_<
4 楼 kira0001 2012-04-17  
第二个例子里,游戏循环中的背景色太暗了(driver->beginScene(true, true, video::SColor(0, 20, 20, 20));),看不到FeatherEdge的效果

我把背景色调浅(0,200,200,200)或者让featherEdge加白边(把CLocalImageItem.cpp里的“video::IImage* thumb_with_border = Util::Instance()->FeatherEdge(thumb, 7, video::SColor(0, 0,0,0))”换成(0,200,200,200))才能看到效果。

我觉得保留背景的黑色调,给feather加白边比较美^_^
3 楼 baby66 2009-05-11  
  找到原因了 是因为include的路径没弄对 =。=#
运行出来了 (项目->属性->c/c++(附加包含目录)   然后 连接器/常规->附加库目录) 由于是中文的 所以就脑残了些 罪过……
2 楼 baby66 2009-05-11  
  运行不能 尴尬啊
第一个说 无法定位程序入口*****于动态链接库Irrlicht.dll上。好像是这个  IrrlichtDevice* device = createDevice(driver_type, screen_resolution, color_depth, is_full_screen); 的问题
第二个说  error C2039: 'createImage' : is not a member of 'irr::video::IVideoDriver' 找不到这个方法 同理 'copyTo' : is not a member of 'irr::video::IImage'

额 用的vs2005  Irrlicht-1.5.zip http://downloads.sourceforge.net/irrlicht/irrlicht-1.5.zip

Freetype-2.3.5-1-bin.zip http://gnuwin32.sourceforge.net/downlinks/freetype-bin-zip.php

Zlib123.zip http://www.zlib.net/zlib123-dll.zip

这三个都是按照您给的连接下的 头大了 怎么会这样呢 懊恼
1 楼 arec 2009-02-23  
如果有bug和错误,欢迎指正。

相关推荐

    Irrlicht 游戏引擎开发 cooliris 界面(三)

    在"Irrlicht游戏引擎开发 cooliris 界面(三)"这个主题中,我们可能涉及到的是如何使用Irrlicht引擎构建一个酷似Cooliris的界面体验。Cooliris是一种创新的多媒体浏览界面,它以前所未有的方式展示了图像和视频内容...

    3D游戏引擎irrlicht

    《Irrlicht 3D游戏引擎入门指南》 Irrlicht,中文译为“鬼火”,是一款备受赞誉的开源3D游戏引擎。以其简洁的结构、高效的执行性能和易上手的特点,它不仅适合初学者学习3D游戏引擎的基础知识,也是小型3D应用开发...

    irrlicht 3D 游戏引擎源码

    总的来说,irrlicht 3D游戏引擎是学习和开发3D游戏的理想选择,无论你是初学者还是经验丰富的程序员,都能从中受益。通过深入探索这个源码包,你可以提升你的3D图形编程技能,了解游戏引擎背后的复杂机制,并可能...

    Irrlicht创建游戏GUI界面(演示程序+源代码)

    Irrlicht游戏引擎自带了GUI模块,可以在三维的场景中创建二维的覆盖(Overlay),使得游戏中图标和文字的显示更为方便,配合游戏高效的三维渲染能力,相得益彰。 这一次我将尝试用代码对GUI进行显示,我们的目标是...

    DirectX 3D游戏引擎Irrlicht教程合集.zip

    DirectX 3D游戏引擎Irrlicht教程合集

    irrlicht 引擎

    irrlicht引擎是一款强大的开源3D游戏引擎,专为实时3D渲染设计,广泛应用于游戏开发、虚拟现实场景和图形演示。这款引擎最初由Nikolai Ostertag开发,并在GPL许可证下发布,允许开发者自由地使用、修改和分发其源...

    用IRRLICHT3D引擎写RPG游戏的框架

    irrlicht3d 引擎是开源的3D图形库,专为实时应用,尤其是游戏开发设计。本项目“用IRRLICHT3D引擎写RPG游戏的框架”提供了一个完整的RPG游戏开发基础,包括工程文件和源代码,旨在帮助开发者快速构建自己的角色扮演...

    irrlicht 1.6 游戏引擎下载

    irrlicht-1.6 是一个基于C++的开源游戏引擎,专为开发2D和3D游戏而设计。它的名称“irrlicht”在德语中意为“不真实的光”,暗示了它在渲染和光照方面的强大能力。该引擎最初由德国开发者Nikolaus Gebhardt在2003年...

    在Qt中使用Irrlicht3D引擎

    在Qt中集成Irrlicht3D引擎,可以创建出丰富的3D图形用户界面,为桌面应用和游戏开发带来强大的视觉效果。Irrlicht是一个开源的3D渲染引擎,以其易于使用和高性能而受到开发者欢迎。Qt则是一个跨平台的C++开发框架,...

    Irrlicht(鬼火)3D游戏引擎0.1版源代码

    示例项目可以用来快速上手,理解如何使用Irrlicht引擎开发游戏。文档部分可能包含API参考、教程和用户指南,帮助初学者理解引擎的用法。 Irrlicht引擎的另一大优点是其易于集成到其他项目中。它提供了多种编程语言...

    鬼火irrlicht开源3D游戏引擎1.7.2

    鬼火Irrlicht开源3D游戏引擎1.7.2 Irrlicht是一个开源的3D游戏引擎。它具有高效,实时等特点,是个完全跨平台的引擎,使用D3D、OpenGL和它的自己的渲染程序。支持动态的阴影,粒子系统,角色动画,室内和室外技术以及...

    Irrlicht引擎学习教程

    Irrlicht引擎是一款开源的3D游戏引擎,专为实时3D应用设计,如视频游戏、模拟软件等。这个教程集合提供了全面的学习资源,包括对Irrlicht Engine的深入理解和OpenGL开发环境的配置。 Irrlicht Engine的核心特性在于...

    Irrlicht引擎(鬼火游戏引擎 C++版)SVN版本

    然而,因为Irrlicht主要由游戏名家Nikolaus Gebhardt所设计,所以该游戏在设计上十分连贯。你可以在网上到处发现有Irrlicht的增强程序,如可选用的地形生成器,入口生成器,输出器,world层生成器,相关教程和编辑器...

    Irrlicht引擎(鬼火游戏引擎 C++版)v1.4

    Irrlicht引擎是一个用C++书写的高性能实时的3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台),OpenGL 1.2或它自己的软件着色程序,可以实现该引擎的完全跨平台。尽管是开源的,该...

    Irrlicht引擎_Android版

    1. **游戏开发**:Irrlicht引擎在Android上的应用最常见的是游戏开发,如简单的3D跑酷游戏、冒险游戏等,利用其强大的图形渲染能力,可以快速构建出富有视觉冲击力的游戏场景。 2. **3D模型展示**:在工业设计、建筑...

    Irrlicht 中文支持引擎

    Irrlicht 是一个开源的3D游戏引擎,专为实时3D图形渲染设计。这个引擎以其易用性、跨平台性和高效性能而受到开发者欢迎。在"Irrlicht 中文支持引擎"这个项目中,我们看到它已经集成了对中文输入和输出的支持,这意味...

    Irrlicht引擎例子说明及中文

    Irrlicht引擎是一款开源的3D图形引擎,专为游戏开发和实时三维可视化设计。这个引擎以其易用性、跨平台性和高效性能而受到开发者们的欢迎。"Irrlicht引擎例子说明及中文"压缩包文件提供了关于如何使用Irrlicht引擎的...

Global site tag (gtag.js) - Google Analytics