将 Ogre 嵌入到 windows 平台上的 qt 应用程序中

Posted

技术标签:

【中文标题】将 Ogre 嵌入到 windows 平台上的 qt 应用程序中【英文标题】:Embedding Ogre into a qt application on windows platform 【发布时间】:2011-02-17 02:00:18 【问题描述】:

将 Ogre 嵌入到 qt 应用程序中 Link:QtOgre

但是是mac和linux平台,我尝试迁移到windows平台,但是失败了。 我的应用程序运行如下:

enter code here
#ifndef OGREWIDGET_H
#define OGREWIDGET_H
#include "XVQCUGLLIB_Global.h"
#include <QGLWidget>
#include <Ogre/Ogre.h>


class XVQCUGLFXLIB_API OgreWidget : public QGLWidget

    //Q_OBJECT;

public:
    OgreWidget( QWidget *parent=0 );
    virtual ~OgreWidget();

protected:
     virtual void initializeGL();
    virtual void resizeGL( int, int );
    virtual void paintGL();

    void init();

    virtual Ogre::RenderSystem* chooseRenderer( Ogre::RenderSystemList* );

    Ogre::Root *mOgreRoot;
    Ogre::RenderWindow *mOgreWindow;
    Ogre::Camera *mCamera;
    Ogre::Viewport *mViewport;
    Ogre::SceneManager *mSceneMgr;
;
#endif // OGREWIDGET_H

////////////////////////////////

  #include "XVQCUGLLIB_Internal.h"

 #include "OgreWidget.h"
 #define THIS OgreWidget

 OgreWidget::OgreWidget(QWidget *parent)
     : QGLWidget( parent ),
     mOgreWindow(NULL)
 
     init();
 

 OgreWidget::~OgreWidget()
 
     mOgreRoot->shutdown();
     delete mOgreRoot;
     destroy();
 

 /**
  * @brief init the object
  * @author kito berg-taylor
  */
      void THIS::init()
      
   // create the main ogre object
   mOgreRoot = new Ogre::Root;

   mOgreRoot->loadPlugin("RenderSystem_GL_d");
   Ogre::String rName("OpenGL Rendering Subsystem");
   Ogre::RenderSystemList rList = mOgreRoot->getAvailableRenderers();
   Ogre::RenderSystemList::iterator it = rList.begin();
   Ogre::RenderSystem *rSys = 0;
   while(it != rList.end())
   
       rSys = * (it++);
       Ogre::String strx=rSys->getName();
       if(strx == rName)
       
           mOgreRoot->setRenderSystem(rSys);
           break;
       
   
   mOgreRoot->initialise(false); // don't create a window
 

 /**
  * @brief setup the rendering context
  * @author Kito Berg-Taylor
  */
 void THIS::initializeGL()
 

   //== Creating and Acquiring Ogre Window ==//

   // Get the parameters of the window QT created

   Ogre::String winHandle=Ogre::StringConverter::toString((size_t)(HWND)winId());

   Ogre::NameValuePairList params;
   params["parentWindowHandle"] = winHandle;

   mOgreWindow = mOgreRoot->createRenderWindow( "QOgreWidget_RenderWindow",
                            this->width(),
                            this->height(),
                            false,
                            &params );

   //mOgreWindow->setActive(true);
   //WId ogreWinId = 0x0;
   //mOgreWindow->getCustomAttribute( "WINDOW", &ogreWinId );

   //assert( ogreWinId );

   //this->create( ogreWinId );
   setAttribute( Qt::WA_PaintOnScreen, true );
   setAttribute( Qt::WA_NoBackground );

   //== Ogre Initialization ==//
   Ogre::SceneType scene_manager_type = Ogre::ST_EXTERIOR_CLOSE;

   mSceneMgr = mOgreRoot->createSceneManager( scene_manager_type );
   mSceneMgr->setAmbientLight( Ogre::ColourValue(1,1,1) );

   mCamera = mSceneMgr->createCamera( "QOgreWidget_Cam" );
   mCamera->setPosition( Ogre::Vector3(0,1,0) );
   mCamera->lookAt( Ogre::Vector3(0,0,0) );
   mCamera->setNearClipDistance( 1.0 );

   Ogre::Viewport *mViewport = mOgreWindow->addViewport( mCamera );
   mViewport->setBackgroundColour( Ogre::ColourValue( 1.0,1.0,1.0 ) );
 

 /**
  * @brief render a frame
  * @author Kito Berg-Taylor
  */
 void THIS::paintGL()
 
     //QGLWidget::paintGL();
   assert( mOgreWindow );


   mOgreRoot->_fireFrameStarted();

  mOgreWindow->update();

  // mOgreRoot->renderOneFrame();

   mOgreRoot->_fireFrameEnded();
 

 /**
  * @brief resize the GL window
  * @author Kito Berg-Taylor
  */
 void THIS::resizeGL( int width, int height )
 
//QGLWidget::resizeGL(width,height);
   assert( mOgreWindow );
   mOgreWindow->windowMovedOrResized();
   mCamera->setAspectRatio(Ogre::Real(width) / Ogre::Real(height));
 

 /**
  * @brief choose the right renderer
  * @author Kito Berg-Taylor
  */
 Ogre::RenderSystem* THIS::chooseRenderer( Ogre::RenderSystemList *renderers )
 
   // It would probably be wise to do something more friendly 
   // that just use the first available renderer
   return *renderers->begin();
 

【问题讨论】:

你找到解决办法了吗?这个问题也发生在我身上。 【参考方案1】:

你在任何地方调用 initializeGL() 吗?

IIRC 你必须明确地调用它——它不会自动发生

【讨论】:

initializeGL()继承自QGLWidget,QGLWidget会自动调用。 抱歉 - 我有一些代码可以将纹理直接绘制到 openGL 框架中,但没有使用 ogre【参考方案2】:

覆盖 QWidget::resizeEvent() 方法。在该方法中,您会收到有关窗口大小更改的通知。调整食人魔窗口的大小。

【讨论】:

以上是关于将 Ogre 嵌入到 windows 平台上的 qt 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

将 WireGuard 嵌入到 Windows 上的 Go 应用程序中

转载OGRE 2.1 Windows 编译

刚刚在linux下编译好了ogre 3D渲染引擎,怎样将它移植到Android中啊。

OSX 上的 ROS Groovy 安装失败 - rviz 和 OGRE

x86 平台代码移植到 嵌入式平台[交叉编译三方库]

如何通过 USB 将数据从 Windows 发送到嵌入式 Linux