在QT中使用Irrlicht引擎的方法与步骤
Ø 相关库,插件安装部分
本篇文档介绍在Qt5.2.0下面使用lrrlicht引擎在Qt窗口中输出(开发环境:vs2012)
1. 首先安装好Qt5.2.0,下载地址:
http://download.qt-project.org/archive/qt/5.2/5.2.0/qt-windows-opensource-5.2.0-msvc2012-x86-offline.exe
2. 接着安装qt中vs2012插件,下载地址:
http://download.qt-project.org/official_releases/vsaddin/qt-vs-addin-1.2.3-opensource.exe
3. Irrlicht鬼火引擎下载,我使用的是irrlicht1.81.zip,地址:
http://irrlicht.sourceforge.net/downloads/
Irrlicht下载后就可以直接使用,里面的lib,dll已经编译好了,若要自己编译则需要安装direct9x,当然如果不安装也可以,可以在Irrlicht编译开关文件中关闭direct9x支持,强制使用openGL。
注释以下高亮行即可:
(文件: irrlicht-1.8.1\include\IrrCompileConfig.h)
//! Only define _IRR_COMPILE_WITH_DIRECT3D_8_ if you have an appropriate DXSDK, e.g. Summer 2004
// #define _IRR_COMPILE_WITH_DIRECT3D_8_ // modify by TMLi,不使用direct9 2014.9
//#define _IRR_COMPILE_WITH_DIRECT3D_9_ #ifdef NO_IRR_COMPILE_WITH_DIRECT3D_8_
#undef _IRR_COMPILE_WITH_DIRECT3D_8_
#endif
#ifdef NO_IRR_COMPILE_WITH_DIRECT3D_9_
#undef _IRR_COMPILE_WITH_DIRECT3D_9_
#endif
4. 上述安装完成后,我们需要在VS2012中对Qt做相关配置,在VS2012中菜单-QT5-Qtoptions,打开Qt设置对话框,将我们安装的Qt5路径设置进去即可,如下图所示。

Ø 环境搭建部分
创建Qt工程,解决方案名称:IrrlichtSolution,工程名称:IrrlichtHelloWorld

qt会提示我们要使用的Qt部件,我们将OpenGL支持勾上

工程创建完毕后,我们来设置包含目录,库目录等。先看包含目录设置,如下图

库目录设置,如下图

链接器-输入-附加依赖项

完成上面步骤后,VC环境配置基本完成。
Ø 设计与编码部分
设计
我们接下要写的例子是基于IrrLicht中的Example中的第一个例子:
01.HelloWorld (路径:irrlicht-1.8.1\examples\01.HelloWorld)
原例的运行效果如下:
我们要在其基础上之上做出改进,改进需求如下:
l 在指定Qt窗口中显示Irrlicht引擎的输出画面
l 可以手动开启或关闭Irrlicht引擎
l 可以手动调节场景摄像机的位置
在正式看代码之前,我们先看下最后的效果,如下图所示,黑色屏幕即为输出Irrlicht的画面的窗口。
![]() |
![]() |
分析:仔细观看irrlicht的helloworld我们发现可以使用createDeviceEx函数,通过irr::SIrrlichtCreationParameters来构建IrrlichtDevice,SIrrlichtCreationParameters中有一个windowId字段,通过文档可以发现,只要将显示irrlicht输出窗口ID传给irrlicht即可将画面输出到指定窗口。所以我们只要将某个QWidget窗口的windowID传给irrlicht即可。
指定窗口输出irrlicht画面的代码片断:
irr::SIrrlichtCreationParameters param;
param.WindowId = (void*)m_winID;
IrrlichtDevice *device = createDeviceEx(param);
开启,关闭irrlicht引擎,我们只需要启动或关闭irrlicht渲染线程即可办到,而控制摄像机的位置则更简单,我们只需要在创建场景摄像机时保存摄像机句柄和当前位置,然后将改变的位置传递给摄像机句柄即可。
m_camer_pos = vector3df(0,30,-40); m_camer = smgr->addCameraSceneNode(0, m_camer_pos, vector3df(0,5,0));
下面为核心的irrlicht渲染线程,QIrrLichtTrhead继承至QThread。
void QIrrLichtThread::run()
{
irr::SIrrlichtCreationParameters param;
param.WindowId = (void*)m_winID;
IrrlichtDevice *device = createDeviceEx(param);
if (!device)
return ;
device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!",
irr::core::rect<s32>(10,10,260,22), true);
IAnimatedMesh* mesh = smgr->getMesh("sydney.md2");
if (!mesh)
{
device->drop();
return ;
}
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
if (node)
{
node->setMaterialFlag(EMF_LIGHTING, false);
node->setMD2Animation(scene::EMAT_STAND);
node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );
}
m_camer_pos = vector3df(0,30,-40);
m_camer = smgr->addCameraSceneNode(0, m_camer_pos, vector3df(0,5,0));
while(device->run() && m_bquit == false)
{
driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll();
guienv->drawAll();
driver->endScene();
}
device->drop();
}
至此,核心代码已经全部贴出。若需要完整工程,可从此处下载
在QT中使用Irrlicht引擎的方法与步骤的更多相关文章
- qt中执行 sql文件的方法
由于qt中没有原生的执行sql文件的方法.因此我们需要根据sql文件中的流的特点,将其分解成一个个语句单独执行. 1.首先通过Qfile读取sql文件 2.将sql文件中的内容通过“:”进行拆解 3. ...
- Qt中显示图像的两种方法
博客转载自:https://blog.csdn.net/lg1259156776/article/details/52325361 在Qt中处理图片一般都要用到QImage类,但是QImage的对象不 ...
- 【Qt开发】Qt中显示图像的两种方法对比
在Qt中处理图片一般都要用到QImage类,但是QImage的对象不能够直接显示出来,要想能看到图片,初步发现有两种方法. 一.QImage转QPixmap,然后用QLabel::setPixmap( ...
- Qt中添加背景图片的方法
工作似乎走上正轨了,上周五的工作是做一个界面,用到QFrame和QPushButton,QFrame做主面板,QPushButton为其子控件,需要在主面板上贴背景图片,还需要在QPushButton ...
- qt中使用dll库的方法
使用dll文件时首先通过dll文件导出符号表,如下面介绍 1. 制作def 直接调用 pexports mylib.dll > mylib.def 2. 生成a 需要mylib.dll和myli ...
- QT 中“ std::cerr ”的使用方法【转载】
std::cerr 标准错误输出流 std::cout 标准输出流 std::cerr 与 std::cout的最大不同是 cerr 是 不带输出缓冲 的,直接就可以输出到显示器上, 而 cout ...
- Qt中sleep()的实现(耳目一新的两种方法)
在Qt中并没有Sleep函数可以调用,在程序编写时往往需要休眠几秒,这里举出两个方法,不知道是否啥不良隐患没~~ 方法一: class SleeperThread : public QThread{p ...
- 解析Qt中QThread使用方法
本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...
- MySql中启用InnoDB数据引擎的方法
1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
随机推荐
- 初识Java反射机制
1.ClassLoader的类加载机制:并非一次性加载,而是需要的时候加载(运行期间动态加载)(Class文件加载到内存的代码段),static语句块在加载后执行一次.dynamic语句块(就是一个语 ...
- JAVA抽象类,接口,多态,抽象方法,一次列举
HEAD FIRST这系列的书,真的让人产生阅读的快感~~:) 和那套明日科技的一样,.. interface Nose { public int iMethod(); } abstract clas ...
- 调用系统API还是很高效的,不必担心性能
代码如下: void MainWindow::on_pushButton_2_clicked() { QTime total; total.start(); ; ; i<=*; i++) { Q ...
- Spring Data Elasticsearch
项目清单 elasticsearch服务下载包括其中插件和分词 http://download.csdn.net/detail/u014201191/8809619 项目源码 资源文件 ...
- BZOJ 1037 [ZJOI2008]生日聚会Party
1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1583 Solved: 936[Submit][ ...
- -_-#【Better JS Code】插入迭代值
+function() { var i = 0 var values = ['xiaoming', 'xiaohong'] var name = values[i] i++ console.log(n ...
- 【转】(DT系列一)DTS结构及其编译方法----不错
原文网址:http://www.cnblogs.com/biglucky/p/4057476.html DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 ...
- 利用C++11的function和bind简化类创建线程
问题引出 当在类中需要创建线程时,总是因为线程函数需要定义成静态成员函数,但是又需要访问非静态数据成员这种需求,来做若干重复性的繁琐工作.比如我以前就经常定义一个静态成员函数,然后定一个结构体,结构体 ...
- java创建XML及开源DOM4J的使用
java import java.io.File; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; imp ...
- ajax提交数据问题
加入traditional:true属性 traditional 类型:Boolean 如果你想要用传统的方式来序列化数据,那么就设置为 true.请参考工具分类下面的 jQuery.param 方法 ...

