将ogre 嵌入到 Qt中

 

 

我用的环境是VS2008+Qt

1,新建一个Qt Application,除了main.cpp文件以外,将其它东西全部删除。

2,添加几个文件如下:

FOgreWidget.h:

#include <QWidget>


// 如果为假就返回
#ifndef FALSE_RETURN
#define FALSE_RETURN(h, r) if(!h) return r;
#endif

#ifndef _DEGUG
#define _DEGUG
#endif

#include <QEvent>
#include "Ogre.h"
#include "OgreConfigFile.h"


class FOgreWidget : public QWidget
{
Q_OBJECT
public:
FOgreWidget(QWidget* parent ,QString strInsName);
~FOgreWidget();

//QSize minimumSizeHint() const;
//QSize sizeHint() const;

protected:


// 事件处理函数

void resizeEvent(QResizeEvent* evt);//窗口可能缩放


void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口


void paintEvent(QPaintEvent* evt);//呵,当然得处理了


void keyPressEvent(QKeyEvent* evt);
//void keyReleaseEvent(QKeyEvent* evt);


void mousePressEvent(QMouseEvent* evt) ;


//void mouseReleaseEvent(QMouseEvent* evt);
//void mouseMoveEvent(QMouseEvent* evt);


void wheelEvent(QWheelEvent* evt);


bool LoadPlugin() ;

bool LoadResource() ;

bool CreateSceneManager() ;

bool CreateRenderWindow() ;

bool CreateDefaultCamera() ;
bool SelectRenderSystem() ;

bool CreateScene()  ;


void updateDraw() ;

void CreateLight() ;

Ogre::SceneManager* m_pSceneManager ;
Ogre::RenderWindow* m_pRenderWindow;

Ogre::Camera* m_pDefCamera;   
Ogre::Viewport* m_pDefViewport;  

Ogre::Root* m_pRoot ;     

Ogre::Entity *  m_pMainEnt;  
Ogre::SceneNode*   m_pMainNode;  

Ogre::Light* m_pMainLight;   
public :
bool Initialize() ;
private:
QString  m_strInsName_ ;
};

FOgreWidget.cpp:

#include "FOgreWidget.h"
#include <QKeyEvent>
#include <string>
using namespace std ;

FOgreWidget::FOgreWidget(QWidget* parent,QString strInsName) : QWidget(parent,Qt::WFlags(Qt::MSWindowsOwnDC)),m_strInsName_(strInsName)
{
m_pSceneManager = NULL ;
m_pRenderWindow= NULL ;
m_pDefCamera= NULL ;
m_pDefViewport= NULL ;
m_pRoot = NULL ;
m_pMainEnt= NULL ;
m_pMainNode= NULL ;
m_pMainLight = NULL ;

}


FOgreWidget::~FOgreWidget()
{
// destroy Viewport and RenderWindow
if( m_pDefViewport )
{
  m_pRenderWindow->removeViewport(m_pDefViewport->getZOrder());
  m_pDefViewport = NULL ;
}

Ogre::Root::getSingleton().detachRenderTarget(m_pRenderWindow);
m_pRenderWindow = NULL ;

}


void FOgreWidget::paintEvent(QPaintEvent *evt)
{
Q_UNUSED(evt);  
updateDraw() ;
}

void FOgreWidget::timerEvent(QTimerEvent* evt)
{
Q_UNUSED(evt);
updateDraw() ;

}

void FOgreWidget::resizeEvent(QResizeEvent *evt)
{

QWidget::resizeEvent(evt) ;
}

void FOgreWidget::keyPressEvent(QKeyEvent* evt)
{


QWidget::keyPressEvent(evt) ;


}


void FOgreWidget::mousePressEvent(QMouseEvent* evt)
{

QWidget::mousePressEvent(evt) ;

}


void FOgreWidget::wheelEvent(QWheelEvent* evt)
{

QWidget::wheelEvent(evt) ;
}


bool FOgreWidget::LoadPlugin()
{  
assert(m_pRoot!=NULL) ;

#if defined(_DEGUG) || defined(DEBUG)
// Load D3D9 Render System(debug)
m_pRoot->loadPlugin("RenderSystem_Direct3D9_d");

// Load OpenGL Render System(debug)
m_pRoot->loadPlugin("RenderSystem_GL_d");

// Load partical system(debug)
m_pRoot->loadPlugin("Plugin_ParticleFX_d");

// Load octree
m_pRoot->loadPlugin("Plugin_OctreeSceneManager_d");
#else
// Load D3D9 Render System
m_pRoot->loadPlugin("RenderSystem_Direct3D9");

// Load OpenGL Render System
m_pRoot->loadPlugin("RenderSystem_GL");

// Load partical system
m_pRoot->loadPlugin("Plugin_ParticleFX");

// Load octree
m_pRoot->loadPlugin("Plugin_OctreeSceneManager");
#endif  
return true;
}


bool FOgreWidget::LoadResource()
{
// Load resource paths from config file
Ogre::ConfigFile cf;
cf.load("resources.cfg");

// Go through all sections & settings in the file
Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();

Ogre::String secName, typeName, archName;
while (seci.hasMoreElements())
{
  secName = seci.peekNextKey();
  Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
  Ogre::ConfigFile::SettingsMultiMap::iterator i;
  for(i = settings->begin(); i != settings->end(); ++i)
  {
   typeName = i->first;
   archName = i->second;

   Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    archName, typeName, secName);
  }
}

return true;
}

bool FOgreWidget::CreateSceneManager()
{
assert(m_pRoot);

m_pSceneManager = m_pRoot->createSceneManager(Ogre::ST_GENERIC);

return true;
}
bool FOgreWidget::CreateDefaultCamera()
{

assert(m_pRoot);
assert(m_pSceneManager);
assert(m_pRenderWindow);

//m_pDefCamera = m_pSceneManager->createCamera(strName);
m_pDefCamera = m_pSceneManager->createCamera("MyCamera");
m_pDefCamera->setPosition(Ogre::Vector3(0,0,80));
m_pDefCamera->lookAt(Ogre::Vector3(0,0,-300));
m_pDefCamera->setNearClipDistance(5);
m_pDefViewport = m_pRenderWindow->addViewport(m_pDefCamera);
m_pDefViewport->setBackgroundColour(Ogre::ColourValue(0, 0.0, 0.0, 1));
m_pDefCamera->setAspectRatio(Ogre::Real(m_pDefViewport->getActualWidth()) / Ogre::Real(m_pDefViewport->getActualHeight()));


// Make window active and post an update
m_pRenderWindow->setActive(true);
m_pRenderWindow->update();

return true;
}
// Create Render Window
bool FOgreWidget::CreateRenderWindow()
{

assert(m_pRoot);

Ogre::NameValuePairList params;
params["left"]                 = "0";
params["top"]                  = "0";
params["border"]               = "none";

//params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
params["parentWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());

string strName  ;
strName = m_strInsName_.toStdString() ;
strName += "_Window" ;

m_pRenderWindow = m_pRoot->createRenderWindow(strName, width(), height(), false, &params) ;

if(m_pRenderWindow == NULL) return false;

return true;
}


bool FOgreWidget::Initialize( )
{
// already inited
if(m_pRoot!= NULL) return true ;


if(Ogre::Root::getSingletonPtr() == NULL)
{
  // create scene root with no config file and plugin
  //m_pRoot = new Root("");
  m_pRoot = new Ogre::Root();

  // Load plugin
  //FALSE_RETURN( LoadPlugin(), false );

  // Select Render System
  FALSE_RETURN( SelectRenderSystem(), false );

  m_pRoot->initialise(false);

  // Load Resource
  FALSE_RETURN( LoadResource(), false );
}      
else
{
  m_pRoot = Ogre::Root::getSingletonPtr();
}  

// Create Render Window
FALSE_RETURN( CreateRenderWindow(), false );

// Create Scene Manager
FALSE_RETURN( CreateSceneManager(), false );

// Create Default Camera and Viewport
FALSE_RETURN( CreateDefaultCamera(), false );

Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

// Create Scene
FALSE_RETURN( CreateScene(), false );

CreateLight() ;

startTimer(2);
return false ;
}  


// Select Render System
bool FOgreWidget::SelectRenderSystem()
{

m_pRoot->restoreConfig() ;

if(m_pRoot->showConfigDialog())
{
  // If returned true, user clicked OK so initialise
  // Here we choose to let the system create a default rendering window by passing 'true'

  return true;
}
else
  exit(0);

return false ;

}


bool FOgreWidget::CreateScene()
{

string strName  ;
strName = m_strInsName_.toStdString() ;
strName += ".mesh" ;
m_pMainEnt = m_pSceneManager->createEntity("root_mesh", strName);
m_pMainNode = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
m_pMainNode->attachObject(m_pMainEnt);
return true ;
}

void FOgreWidget::updateDraw()
{

if(m_pRenderWindow != NULL)
{
  //printf("I'm %s/n",m_strInsName_.toStdString().c_str()) ;
  m_pRoot->_fireFrameStarted();
  m_pRenderWindow->update();
  //m_pDefCamera->moveRelative(mDirection);
  //m_pDefCamera->yaw(Ogre::Radian(angleX));
  //m_pDefCamera->pitch(Ogre::Radian(angleY));

  m_pRoot->_fireFrameEnded();
}

}

void FOgreWidget::CreateLight()
{

m_pSceneManager->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
m_pMainLight = m_pSceneManager->createLight("mainLight");
m_pMainLight->setPosition(20,80,50);
}

main.cpp

#include <QtGui/QApplication>
#include "FOgreWidget.h"
#include <QVBoxLayout>
#pragma comment( lib, "OgreMain_d.lib")
#pragma comment( lib, "OIS_d.lib")

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget widget ;
widget.setGeometry (10,10,640,480) ;

FOgreWidget ogreWidget(&widget,QString("ogrehead")) ;
ogreWidget.setGeometry (10,10,340,280) ;
ogreWidget.Initialize() ;
widget.show() ;

a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}


3,这样就可以了。运行效果如下:

查看评论
7楼 aq_1000 2012-07-18 15:52发表[回复] [引用] [举报]
//FALSE_RETURN( LoadPlugin(), false );
你把这句注释掉了,结果显示不了下拉框
6楼 QQ10816253 2012-03-07 11:50发表[回复] [引用] [举报]
可以运行,但要配置OGRE的运行环境:
ogre.cfg
resources.cfg
plugins.cfg
另外还需要ogre的media目录
5楼 kalso4212h2o 2012-01-06 17:04发表[回复] [引用] [举报]
我用你这个例子,FALSE_RETURN( LoadResource(), false );这句要报错呢,请问是什么原因呢,报错信息是:

First-chance exception at 0x75c49673 in MyOGRE.exe: Microsoft C++ exception: Ogre::FileNotFoundException at memory location 0x002bf3f4..
Unhandled exception at 0x75c49673 in MyOGRE.exe: Microsoft C++ exception: Ogre::FileNotFoundException at memory location 0x002bf3f4..
4楼 kalso4212h2o 2011-12-31 11:29发表[回复] [引用] [举报]
请问下,我按照你这样写,但是运行不起来呢?是不是环境还需要怎么配置下呢?
Re: tulun 2012-01-01 11:25发表[回复] [引用] [举报]
回复kalso4212h2o:这个当然呀,网上配置好多。先把例子程序能跑起来才行
Re: kalso4212h2o 2012-01-04 17:06发表[回复] [引用] [举报]
回复tulun:就是按照你的例子写,运行不起来呀,一运行就弹出启动OGRE例子前的那个窗口,本来是可以有个下拉,然后有选择点OK然后就可以的,但现在用你的例子,弹出的那个窗口是没下拉的...就运行不起了,方便的话加QQ:276165775,帮我看看是什么原因可以否?
Re: tulun 2012-01-06 20:59发表[回复] [引用] [举报]
回复kalso4212h2o:我在自己电脑上找了一下,没有找到这个程序了
不好意思呀
3楼 zcc_9527 2011-11-23 21:57发表[回复] [引用] [举报]
楼主 问个为什么鼠标事件键盘事件都没用啊
只有滚轮行的,这是为什么????

急求急求
Re: tulun 2012-01-01 11:27发表[回复] [引用] [举报]
回复zcc_9527:可以呀,要不把程序给你?
2楼 xiaozhang1289 2011-10-03 18:42发表[回复] [引用] [举报]
我用你这个代码,编译能通过,但是调试运行时,出了点问题,,它提示:无法启动此程序,因为计算机丢OgreMain_d.dll.
然后我将工程的工作目录设置为ogre sdk的debug目录,运行后,出现ogre对话框,但渲染系统下拉列表框没有选项,请问这是什么原因啊?
Re: zcc_9527 2011-10-23 15:43发表[回复] [引用] [举报]
回复xiaozhang1289:没有选项怎么解决
Re: tulun 2011-10-03 21:45发表[回复] [引用] [举报]
回复xiaozhang1289:你确定ogre能正常运行吗?
换个其它程序试一试
或者重新编译一下你的ogre
1楼 Blackwalker 2011-03-09 17:26发表[回复] [引用] [举报]
你确定你这个程序能运行?
Re: tulun 2011-07-27 20:16发表[回复] [引用] [举报]
回复Blackwalker:肯定的

转载自:http://blog.youkuaiyun.com/tulun/article/details/5638469

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值