Qt框架集成OGRE, 请给出实现代码
时间: 2024-03-09 13:45:22 浏览: 15
下面是一个简单的示例代码,演示了如何使用Qt框架集成OGRE游戏引擎:
```c++
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <Ogre.h>
#include <OgreRenderWindow.h>
#include <OgreFrameListener.h>
class OgreWidget : public QWidget, public Ogre::FrameListener
{
public:
OgreWidget(QWidget* parent = 0)
: QWidget(parent)
, mOgreRoot(NULL)
, mOgreRenderWindow(NULL)
{
setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_PaintOnScreen, true);
setAttribute(Qt::WA_DeleteOnClose, true);
}
virtual ~OgreWidget()
{
if(mOgreRoot)
{
delete mOgreRoot;
}
}
bool initialize()
{
try
{
// 初始化OGRE
mOgreRoot = new Ogre::Root();
mOgreRoot->loadPlugin("RenderSystem_GL");
Ogre::RenderSystemList list = mOgreRoot->getAvailableRenderers();
Ogre::RenderSystem* rs = NULL;
for(Ogre::RenderSystemList::iterator it = list.begin(); it != list.end(); ++it)
{
rs = *it;
if(rs->getName().find("OpenGL") != std::string::npos)
{
mOgreRoot->setRenderSystem(rs);
break;
}
}
mOgreRoot->initialise(false);
// 创建窗口
Ogre::NameValuePairList params;
params["parentWindowHandle"] = Ogre::StringConverter::toString((unsigned long)winId());
mOgreRenderWindow = mOgreRoot->createRenderWindow("OgreWidgetRenderWindow", width(), height(), false, ¶ms);
// 创建场景
Ogre::SceneManager* sm = mOgreRoot->createSceneManager(Ogre::ST_GENERIC);
Ogre::Camera* camera = sm->createCamera("OgreWidgetCamera");
camera->setPosition(Ogre::Vector3(0, 0, 500));
camera->lookAt(Ogre::Vector3(0, 0, -300));
Ogre::Viewport* viewport = mOgreRenderWindow->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0, 0, 0));
// 注册帧监听器
mOgreRoot->addFrameListener(this);
return true;
}
catch(const Ogre::Exception& e)
{
qDebug() << e.getDescription().c_str();
return false;
}
}
bool frameRenderingQueued(const Ogre::FrameEvent& evt)
{
// 更新场景
mOgreRoot->renderOneFrame();
// 通知Qt更新窗口
update();
return !isHidden();
}
void paintEvent(QPaintEvent* evt)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 将OGRE的渲染结果绘制到窗口上
Ogre::Box bounds(0, 0, width(), height());
Ogre::PixelBox pbounds(bounds, Ogre::PF_R8G8B8, (void*)painter.device()->painter()->device());
mOgreRenderWindow->copyContentsToMemory(pbounds);
}
private:
Ogre::Root* mOgreRoot;
Ogre::RenderWindow* mOgreRenderWindow;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
OgreWidget w;
w.resize(640, 480);
if(w.initialize())
{
w.show();
return a.exec();
}
else
{
return -1;
}
}
```
在这个示例代码中,我们创建了一个继承自QWidget的OgreWidget类,通过重载paintEvent()函数来绘制OGRE的渲染结果,并通过重载frameRenderingQueued()函数来更新OGRE的场景。在initialize()函数中,我们初始化了OGRE并创建了一个窗口和一个简单的场景。在main()函数中,我们创建了一个OgreWidget实例并调用initialize()来初始化OGRE并显示窗口。