- classOgreView:publicQWidget
- {
- Q_OBJECT
- public:
- OgreView(QWidget*parent);
- ~OgreView();
- //QSizeminimumSizeHint()const;
- //QSizesizeHint()const;
- protected:
- voidsetupView()//创建Ogre使用的内容,场景内容;
- voidupdate();//通过它,手动更新场景内容
- voidsetupResources();//
- voidcreateScene();
- voidcreateLight();
- voidresizeEvent(QResizeEvent*evt);//窗口可能缩放
- voidtimerEvent(QTimerEvent*evt);//可以设一时钟来更新窗口
- voidpaintEvent(QPaintEvent*evt);//呵,当然得处理了
- //消息响应
- voidkeyPressEvent(QKeyEvent*evt);
- voidkeyReleaseEvent(QKeyEvent*evt);
- voidmousePressEvent(QMouseEvent*evt);
- voidmouseReleaseEvent(QMouseEvent*evt);
- voidmouseMoveEvent(QMouseEvent*evt);
- voidwheelEvent(QWheelEvent*evt);
- //有关Ogre
- Ogre::RenderWindow*mRenderWindow;
- Ogre::SceneManager*mSceneMgr;
- Ogre::Camera*mCamera;
- Ogre::Viewport*mVp;
- Ogre::Root*mRoot;
- Ogre::Light*mainLight;
- Ogre::Entity*mainEnt;
- Ogre::SceneNode*mainNode;
- //一些控制变量,没有完全列出
- Ogre::Vector3mDirection;
- Ogre::RealmRotate;
- };
- //cpp文件中的内容(部分)
- OgreView::OgreView(QWidget*parent) : QWidget(parent,Qt::WFlags(Qt::MSWindowsOwnDC))
- {
- mRenderWindow=NULL;
- mSceneMgr=NULL;
- mVp=NULL;
- mainEnt=NULL;
- mainNode=NULL;
- //....还有一些控制变量的初始化
- setupResources();
- }
- OgreView::~OgreView()
- {
- //destroyViewportandRenderWindow
- if(mVp)
- {
- mRenderWindow->removeViewport(mVp->getZOrder());
- mVp=0;
- }
- Ogre::Root::getSingleton().detachRenderTarget(mRenderWindow);
- mRenderWindow=0;
- if(mRoot!=NULL){
- deletemRoot;
- mRoot=0;
- }
- }
- voidOgreView::setupResources()
- {
- mRoot=newOgre::Root();
- Ogre::ConfigFilecf;
- cf.load("resources.cfg");
- Ogre::ConfigFile::SectionIteratorseci=cf.getSectionIterator();
- Ogre::StringsecName,typeName,archName;
- while(seci.hasMoreElements())
- {
- secName=seci.peekNextKey();
- Ogre::ConfigFile::SettingsMultiMap*settings=seci.getNext();
- Ogre::ConfigFile::SettingsMultiMap::iteratori;
- for(i=settings->begin();i!=settings->end();++i){
- typeName=i->first;
- archName=i->second;
- Ogre::ResourceGroupManager::getSingleton().
- addResourceLocation(archName,typeName,secName);
- }
- }
- if(!mRoot->restoreConfig())
- {
- mRoot->showConfigDialog();
- }
- mRoot->initialise(false);
- //以上都是从Ogre普通程序照搬
- }
- //没啥说的,代码比注释更明白
- voidOgreView::createScene()
- {
- mainEnt=mSceneMgr->createEntity("Head","ogrehead.mesh");
- mainNode=mSceneMgr->getRootSceneNode()->createChildSceneNode();
- mainNode->attachObject(mainEnt);
- }
- voidOgreView::createLight()
- {
- mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5,0.5,0.5));
- mainLight=mSceneMgr->createLight("MainLight");
- mainLight->setPosition(20,80,50);
- }
- voidOgreView::setupView()
- {
- if(mRenderWindow)
- return;
- //createRenderWindow,当然必须得自己手工建窗口了,把窗口句柄扒出来....
- Ogre::NameValuePairListparams;
- params["externalWindowHandle"]=Ogre::StringConverter::toString((size_t)(HWND)winId());
- mRenderWindow=mRoot->createRenderWindow("View",width(),height(),false, params);
- //SceneManager
- mSceneMgr=mRoot->createSceneManager(Ogre::ST_GENERIC);
- //setupcamera&viewport
- mCamera=mSceneMgr->createCamera("PlayerCam");
- mCamera->setPosition(Ogre::Vector3(0,0,80));
- mCamera->lookAt(Ogre::Vector3(0,0,-300));
- mCamera->setNearClipDistance(5);
- mVp=mRenderWindow->addViewport(mCamera);
- mVp->setBackgroundColour(Ogre::ColourValue(0,0.0,0.0,1));
- mCamera->setAspectRatio(Ogre::Real(mVp->getActualWidth())/
- Ogre::Real(mVp->getActualHeight()));
- //resource
- Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
- createScene();
- createLight();
- startTimer(2);
- }
- voidOgreView::paintEvent(QPaintEvent*evt)
- {
- Q_UNUSED(evt);
- if(mRenderWindow==NULL)
- setupView();
- update();
- }
- voidOgreView::timerEvent(QTimerEvent*evt)
- {
- Q_UNUSED(evt);
- update();
- }
- voidOgreView::update()
- {
- //手工更新场景内容,而不是进入到连续的循环中
- if(mRenderWindow!=NULL){
- mRoot->_fireFrameStarted();
- mRenderWindow->update();
- mCamera->moveRelative(mDirection);
- mCamera->yaw(Ogre::Radian(angleX));
- mCamera->pitch(Ogre::Radian(angleY));
- mRoot->_fireFrameEnded();
- }
- }
- voidOgreView::resizeEvent(QResizeEvent*evt)
- {
- Q_UNUSED(evt);
- if(mRenderWindow!=NULL){
- mRenderWindow->windowMovedOrResized();
- mCamera->setAspectRatio(Ogre::Real(mVp->getActualWidth())/Ogre::Real(mVp->getActualHeight()));
- }
- }
- voidOgreView::keyPressEvent(QKeyEvent*evt)
- {
- if(mainEnt!=NULL&&mainNode!=NULL){
- switch(evt->key()){
- caseQt::Key_W:
- caseQt::Key_Up:
- rotX=-0.1;
- mainNode->pitch(Ogre::Radian(rotX));
- break;
- caseQt::Key_S:
- caseQt::Key_Down:
- rotX=0.1;
- mainNode->pitch(Ogre::Radian(rotX));
- break;
- caseQt::Key_A:
- caseQt::Key_Left:
- rotY=-0.1;
- mainNode->yaw(Ogre::Radian(rotY));
- break;
- caseQt::Key_D:
- caseQt::Key_Right:
- rotY=0.1;
- mainNode->yaw(Ogre::Radian(rotY));
- break;
- }
- }
- }
- voidOgreView::mousePressEvent(QMouseEvent*evt)
- {
- if(evt->button()==Qt::LeftButton)
- mouseLeftPressed=true;
- if(evt->button()==Qt::RightButton){
- mouseRightPressed=true;
- mousePos=Ogre::Vector2(evt->x(),evt->y());
- }
- if(evt->button()==Qt::MidButton)
- mouseMiddleBtn=true;
- }
- voidOgreView::wheelEvent(QWheelEvent*evt)
- {
- mDirection.z=-evt->delta()/12;
- update();
- mDirection.z=0;
- }
Ogre3D嵌入Qt框架
免责声明:文章转载自《Ogre3D嵌入Qt框架》仅用于学习参考。如对内容有疑问,请及时联系本站处理。
上篇js 实现数组数字奇偶归类LOG EXPLORER FOR SQL SERVER 使用下篇
宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=