将 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,
¶ms );
//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 应用程序中
刚刚在linux下编译好了ogre 3D渲染引擎,怎样将它移植到Android中啊。