Qt 使用irrlicht(鬼火)3D引擎

举报
DreamLife 发表于 2022/04/14 23:04:40 2022/04/14
【摘要】 项目中需要加载简单的3D场景。资深老前辈推荐使用开源小巧的引擎irrlicht。 关于irrlicht,来之百度百科 Irrlicht引擎是一个用C++书写的高性能实时的3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台),OpenGL 1.2或它自己的软件着色程序,可以实现该引擎的完全跨...

项目中需要加载简单的3D场景。资深老前辈推荐使用开源小巧的引擎irrlicht。

关于irrlicht,来之百度百科

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

 

具体信息 百度百科

如何使用,

首先使用Qt建立工程,略过。

在Qt pro工程文件总中加入引擎头文件路径,和库文件路径。

 


  
  1. #包含鬼火3D引擎需要的头文件路劲
  2. INCLUDEPATH +=D:\irrlicht-1.8.3\include
  3. #连接开发需要用到的库文件
  4. LIBS +=D:\irrlicht-1.8.3\lib\Win32-gcc\libIrrlicht.a


如图所示

 

剩下的就是一般的核心代码部分了,

包含头文件部分

 


  
  1. #include <QObject>
  2. #include <QWidget>
  3. #include <QApplication>
  4. #include <irrlicht.h>


使用命名空间部分

 

 


  
  1. using namespace irr;
  2. using namespace core;
  3. using namespace scene;
  4. using namespace video;
  5. using namespace io;
  6. using namespace gui;

 

 

 

 

 

 

引擎初始化

 


  
  1. void Irr_Device::init_Dev()
  2. {
  3. if(m_Device != NULL)
  4. {
  5. return;
  6. }
  7. SIrrlichtCreationParameters params;
  8. params.AntiAlias = 0;
  9. params.Bits = 32;
  10. params.DeviceType = EIDT_BEST;
  11. params.Doublebuffer = true;
  12. params.DriverType = EDT_OPENGL;
  13. params.EventReceiver = 0;
  14. params.Fullscreen = false;
  15. params.HighPrecisionFPU = false;
  16. params.IgnoreInput = false;
  17. params.LoggingLevel = ELL_INFORMATION;
  18. params.Stencilbuffer = true;
  19. params.Stereobuffer = false;
  20. params.Vsync = false;
  21. // Specify which window/widget to render to
  22. // 指定哪个窗口小部件呈现
  23. params.WindowId = reinterpret_cast<void*>(winId());
  24. params.WindowSize.Width = width();
  25. params.WindowSize.Height = height();
  26. params.WithAlphaChannel = true;
  27. params.ZBufferBits = 16;
  28. // Create the Irrlicht Device with the previously specified parameters
  29. // 创建Irrlicht设备的使用与前面指定的参数
  30. m_Device = createDeviceEx(params);
  31. /*
  32. 获取视频设备,场景管理器和用户图形环境的指针并存储起来。
  33. */
  34. video_Driver = m_Device->getVideoDriver();
  35. scene_Msnsger = m_Device->getSceneManager();
  36. guienv = m_Device->getGUIEnvironment();
  37. //smgr->loadScene
  38. qDebug()<< scene_Msnsger->loadScene("123.irr");
  39. /*
  40. Now we'll create a camera, and give it a collision response animator
  41. that's built from the mesh nodes in the scene we just loaded.
  42. */
  43. /*
  44. 现在我们将创建一个相机,给它一个碰撞响应动画师  由网格节点的现场加载。
  45. */
  46. m_Camera = scene_Msnsger->addCameraSceneNodeFPS(0,50.f,0.1f);
  47. /*
  48. Now we will find all the nodes in the scene and create triangle
  49. selectors for all suitable nodes. Typically, you would want to make a
  50. more informed decision about which nodes to performs collision checks
  51. on; you could capture that information in the node name or Id.
  52. */
  53. /*
  54. 现在我们将在现场找到的所有节点并创建三角形  选择合适的节点。通常,您会想要  更明智的决定哪些节点执行碰撞检查  ;你可以捕捉信息的节点名称或Id。
  55. */
  56. scene::IMetaTriangleSelector* meta = scene_Msnsger->createMetaTriangleSelector();
  57. // core::array<scene::ISceneNode*> nodes;
  58. // scene_Msnsger->getSceneNodeFromType(scene::ESNT_ANY, nodes);
  59. core::array<scene::ISceneNode *> nodes;
  60. scene_Msnsger->getSceneNodesFromType(scene::ESNT_ANY, nodes); // Find all nodes
  61. for(u32 i =0;i<nodes.size();++i)
  62. {
  63. scene::ISceneNode* node = nodes[i];
  64. scene::ITriangleSelector* selector =0;
  65. switch (node->getType())
  66. {
  67. case scene::ESNT_CUBE:
  68. case scene::ESNT_ANIMATED_MESH:
  69. // Because the selector won't animate with the mesh,
  70. // and is only being used for camera collision, we'll just use an approximate
  71. // bounding box instead of ((scene::IAnimatedMeshSceneNode*)node)->getMesh(0)
  72. // 因为选择器不会与网格动画,
  73. // 和仅用于相机碰撞,我们只使用一个近似
  74. // 边界框代替((场景::IAnimatedMeshSceneNode *)节点)- > getMesh(0)
  75. selector = scene_Msnsger->createTriangleSelectorFromBoundingBox(node);
  76. break;
  77. case scene::ESNT_MESH:
  78. case scene::ESNT_SPHERE:
  79. selector = scene_Msnsger->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(),node);
  80. break;
  81. case scene::ESNT_TERRAIN:
  82. selector = scene_Msnsger->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node);
  83. break;
  84. case scene::ESNT_OCTREE:
  85. selector = scene_Msnsger->createOctreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(),node);
  86. break;
  87. default:
  88. break;
  89. }
  90. if(selector)
  91. {
  92. meta->addTriangleSelector(selector);
  93. selector->drop();
  94. }
  95. }
  96. /*
  97. Now that the mesh scene nodes have had triangle selectors created and added
  98. to the meta selector, create a collision response animator from that meta selector.
  99. */
  100. /*
  101. 现在有三角形网格场景节点选择器创建和添加  元选择器,创建一个元的碰撞响应动画选择器。
  102. */
  103. scene::ISceneNodeAnimator* anim = scene_Msnsger->createCollisionResponseAnimator(
  104. meta,m_Camera,core::vector3df(5,5,5),core::vector3df(0,0,0));
  105. meta->drop();
  106. m_Camera->addAnimator(anim);
  107. anim->drop();
  108. m_Camera->setPosition(core::vector3df(0.f,20.f,0.f));
  109. scene::ISceneNode*cube = scene_Msnsger->getSceneNodeFromType(scene::ESNT_CUBE);
  110. if(cube)
  111. {
  112. m_Camera->setTarget(cube->getAbsolutePosition());
  113. }
  114. m_Device->getCursorControl()->setVisible(false);
  115. connect(this,SIGNAL(sigUpdateIrrlicht(irr::IrrlichtDevice*)),
  116. this,SLOT(slotUpdateIrrlicht(irr::IrrlichtDevice*)));
  117. startTimer(0);
  118. }

保证实时刷新界面部分

 

 

 
void Irr_Device::slotUpdateIrrlicht(IrrlichtDevice *device) { if(device != 0) { if (isVisible() && isEnabled()/*&&device->isWindowActive()*/) { device->getTimer()->tick();//在没有用IrrlichtDevice::run()的情况下,必须加上这句,否则键盘不响应 SColor color (255,100,100,140); device->getVideoDriver()->beginScene(true, true, color); device->getSceneManager()->drawAll(); device->getVideoDriver()->endScene(); } else { device->yield(); } } } void Irr_Device::timerEvent(QTimerEvent *event) { if (m_Device != NULL) { emit sigUpdateIrrlicht(m_Device); } event->accept(); }
 

 

 


这部分代码暂时还不是很理解,也欢迎大神指出里面存在的问题。

 

 

 

软件运行截图如图

 

 

Demo 链接:http://download.csdn.net/detail/z609932088/9504584

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/51263145

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。