QT4和ogre结合代码(英文)
来源:互联网 发布:对越自卫反击战知乎 编辑:程序博客网 时间:2024/05/29 17:24
先贴出原文,随后翻译
Note: There is a recent QOgreWidget written by djbe that is tested on Mac and Linux:http://www.ogre3d.org/phpBB2/viewtopic.php?p=258064 Alanic?
However the links pointing to this version are not valid anymore. A code snippet working on Mac OSX 10.6 with Cocoa, Qt 4.7.4 and Ogre 1.7.3 was inserted below.
For a similar thread specific to Mac see http://www.ogre3d.org/forums/viewtopic.php?f=2&t=62967.
I found this documentation: Lakin's Ogre-Qt.
It is for Linux.. I prefer to do my development on my Windows machine (it has more ram / better video) and when I develop on Windows I use Visual Studio. As such,these instructions are priceless.
Once you have Qt built and you've set up your environment variables, you can run qmake on Ogre-Qt to get a vcproj. Open that up in visual studio and the first thing you'll have to do is add the OGRE include directory to the C++ Additional Include Directories. If you try to build now you will see some errors like this:
1>c:\qt-4.2.3-msvc2005\include\qtcore\../../src/corelib/tools/qhash.h(175) : error C2872: 'uint' : ambiguous symbol1> could be 'c:\qt-4.2.3-msvc2005\include\qtcore\../../src/corelib/global/qglobal.h(632) : unsigned int uint'1> or 'c:\ogresdk\include\OgrePrerequisites.h(134) : Ogre::uint'
There's a whole bunch of these, you need to add :: to the front of any reference to uint in the Qt code. You shouldn't need to recompile Qt after you do this.
Then you need to add the OGRE lib directory to the Linker Additional Library Directories and add OgreMain.lib to Linker Inputs.
For the debug configuration you will want to do the same but use OgreMain_d.lib.
Of course, so far my success rate hasn't been too high.
An Example using QT4 and Ogre Eihort
This is a standard QT Widget with an Ogre instance in it. You can create one on QT's designer by elevating a regular widget to an "OgreWidget" and including ogrewidget.h in your project. You'll probably want to do something about the chooseRenderer() function, since it doesn't really do much right now. I generally derive another class from this one and reimplement chooseRenderer(), and build my world in that class. Good Luck with it!
ogrewidget.h:
#ifndef __OGREWIDGET_H__#define __OGREWIDGET_H__ #include <OGRE/Ogre.h>#include <QGLWidget>#include <QX11Info> class OgreWidget : public QGLWidget{ //Q_OBJECT; public: OgreWidget( QWidget *parent=0 ): QGLWidget( parent ), mOgreWindow(NULL) { init( "../bin/plugins.cfg", "../bin/ogre.cfg", "../bin/ogre.log" ); } virtual ~OgreWidget() { mOgreRoot->shutdown(); delete mOgreRoot; destroy(); } protected: virtual void initializeGL(); virtual void resizeGL( int, int ); virtual void paintGL(); void init( std::string, std::string, std::string ); virtual Ogre::RenderSystem* chooseRenderer( Ogre::RenderSystemList* ); Ogre::Root *mOgreRoot; Ogre::RenderWindow *mOgreWindow; Ogre::Camera *mCamera; Ogre::Viewport *mViewport; Ogre::SceneManager *mSceneMgr;}; #endif
ogrewidget.cpp:
#include "ogrewidget.h" #define THIS OgreWidget /** * @brief init the object * @author kito berg-taylor */void THIS::init( std::string plugins_file, std::string ogre_cfg_file, std::string ogre_log ){ // create the main ogre object mOgreRoot = new Ogre::Root( plugins_file, ogre_cfg_file, ogre_log ); // setup a renderer Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers(); assert( !renderers->empty() ); // we need at least one renderer to do anything useful Ogre::RenderSystem *renderSystem; renderSystem = chooseRenderer( renderers ); assert( renderSystem ); // user might pass back a null renderer, which would be bad! mOgreRoot->setRenderSystem( renderSystem ); QString dimensions = QString( "%1x%2" ) .arg(this->width()) .arg(this->height()); renderSystem->setConfigOption( "Video Mode", dimensions.toStdString() ); // initialize without creating window mOgreRoot->getRenderSystem()->setConfigOption( "Full Screen", "No" ); mOgreRoot->saveConfig(); 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;#ifdef WIN32 // Windows code winHandle += Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId()));#elif MACOS // Mac code, tested on Mac OSX 10.6 using Qt 4.7.4 and Ogre 1.7.3 Ogre::String winHandle = Ogre::StringConverter::toString(winId());#else // Unix code QX11Info info = x11Info(); winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId()));#endif Ogre::NameValuePairList params;#ifndef MACOS // code for Windows and Linux 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 ); // bug fix, extract geometry QRect geo = this->frameGeometry ( ); // create new window this->create( ogreWinId ); // set geometrie infos to new window this->setGeometry (geo); #else // code for Mac params["externalWindowHandle"] = winHandle; params["macAPI"] = "cocoa"; params["macAPICocoaUseNSView"] = "true"; mOgreWindow = mOgreRoot->createRenderWindow("QOgreWidget_RenderWindow", width(), height(), false, ¶ms); mOgreWindow->setActive(true); makeCurrent();#endif 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( 0.8,0.8,1 ) );} /** * @brief render a frame * @author Kito Berg-Taylor */void THIS::paintGL(){ assert( mOgreWindow ); mOgreRoot->renderOneFrame();} /** * @brief resize the GL window * @author Kito Berg-Taylor */void THIS::resizeGL( int width, int height ){ assert( mOgreWindow ); mOgreWindow->windowMovedOrResized();} /** * @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();}
For OGRE Cthugha (v1.7.3)
In ogrewidget.cpp just replace....
// setup a renderer Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers(); assert( !renderers->empty() ); // we need at least one renderer to do anything useful Ogre::RenderSystem *renderSystem; renderSystem = chooseRenderer( renderers ); assert( renderSystem ); // user might pass back a null renderer, which would be bad!
with
// setup a renderer Ogre::RenderSystemList::const_iterator renderers = mOgreRoot->getAvailableRenderers().begin(); while(renderers != mOgreRoot->getAvailableRenderers().end()) { Ogre::String rName = (*renderers)->getName(); if (rName == "OpenGL Rendering Subsystem") break; renderers++; } Ogre::RenderSystem *renderSystem = *renderers;
To use...
#include <QApplication>#include <QWidget>#include "ogrewidget.h"#include <QVBoxLayout> int main(int argc, char *argv[]){ QApplication app(argc, argv); QWidget window; window.resize(800, 600); window.setWindowTitle("Simple example"); OgreWidget* ogreWidget = new OgreWidget; QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ogreWidget); window.setLayout(layout); window.show(); return app.exec();}
- QT4和ogre结合代码(英文)
- ogre中将PLSM2和Hydrax结合遇到的问题
- Ogre中将法线贴图和硬件蒙皮结合
- Ogre中将法线贴图和硬件蒙皮结合
- ogre与mfc结合
- ogre与CEGUI结合
- OGRE与Qt的结合(一)----使用OGRE渲染QWidget
- Ogre 1.9 英文文本显示
- OGRE Demo_BSP代码分析(2)
- OGRE 引擎官方基础教程 (七) OGRE 和 CEGUI
- 【Ogre开发】之一:Ogre sdk的安装以及示例代码的编译和运行
- 【Ogre编程入门与进阶】第十七章 Ogre3D 和CEGUI 的结合
- ogre代码学习——地形 手工和cfg创建
- android原生代码和html的结合
- qt4:英文字符的比较问题
- qt4:英文字符的比较问题
- QT4 简介代码
- VS2010和QT安装(qt4.8.4)
- 【MARK】解决APT-GET下载报错的方法
- Android2.2:'pthread_rwlock_t' does not name a type: android 2.3版本以下不支持读写锁的解决办法
- about apache wink
- jQuery的domReady
- V$PGA_TARGET_ADVICE的用法 转
- QT4和ogre结合代码(英文)
- 10个iPhone开发资源库
- Android Root方法原理解析及Hook(三) FrameworkListener漏洞
- 【MARK】Installing the JDK5 and JDK6 for android4.0.3
- uboot 编译过程
- js继承探讨
- Stream Minidriver 编写 blog记录
- 编译openwrt全过程(超详细)
- Eclipse+CDT+GDB调试Android NDK程序