QtOgre 开发(入门日记)( 一 )
来源:互联网 发布:懒人之家幻灯js代码 编辑:程序博客网 时间:2024/05/20 12:47
参考:
http://blog.csdn.net/zhuzhao/article/details/4272052
http://www.ogre3d.org/tikiwiki/qtogre
http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Setting+Up+An+Application+-+QtCreator
还没工作的时候,就一直想学习一下ogre,但总找不到时间,工作之后更忙,最近难得有几天休息,就把Qt + Ogre 的开发些下来,做个笔记吧
准备工具:
Qt : 5.2.1 vc10 编译
编译器 : vc10
Ogre : SDK 1.8.1 (越新的版本,教程资料什么的都不容易找,所以还是用不要太新的,Qt我个人比较熟悉,所以就用最新的)
本来想用mingw的,但好像很不容易,尤其是之后还打算使用python作为脚本,就不折腾编译器了,默认使用vc10
IDE : QtCreator //之所以使用这个是因为Qt代码补全很好用(其实我不会用vc)。
第一步:
当然是先准备好上面的工具,Qt,Ogre直接下载现成的,对于我这个初学者,能减少无谓的劳动才是最好的,否则无端端陷入一个麻烦的BUG,大大打击兴趣
Ogre SDK 下载好后,不需要编译,直接解压到某个地方,设置系统变量(你也可以不设置,就是多敲点字就行)
例如:
OGRE_HOME = "D:\GameDev\OgreSDK_vc10_v1-8-1"
Qt设置运行环境的path
path = path + "D:\Qt\Qt5.2.1-vs\5.2.1\msvc2010_opengl\bin"
方便运行的时候找到Qt的库( Ogre也可以这样,- _ - ! 我个人不想设置就是了)
第二步:
配置QtCreator
选择创建一个QWidget Application.
不要ui文件,保留mainwindow.h mainwindow.cpp main.cpp
删掉mainwindow.h的代码,以下面的代码替换
mainwindow.h 代码
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <OGRE/Ogre.h>#include <QWidget>#include <QKeyEvent>#include <QMouseEvent>class OgreView : public QWidget{ Q_OBJECTpublic: OgreView(QWidget* parent ); ~OgreView(); //QSize minimumSizeHint() const; //QSize sizeHint() const;protected: void setupView();//创建Ogre使用的内容,场景内容; void update();//通过它,手动更新场景内容 void setupResources();// void createScene(); void createLight(); void resizeEvent(QResizeEvent* evt);//窗口可能缩放 void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口 void paintEvent(QPaintEvent* evt);//呵,当然得处理了 //消息响应 void keyPressEvent(QKeyEvent* evt); void mousePressEvent(QMouseEvent* evt); void mouseReleaseEvent(QMouseEvent* evt); void wheelEvent(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::Real angleX; Ogre::Real angleY; Ogre::Real rotX; Ogre::Real rotY; Ogre::Vector3 mDirection; Ogre::Real mRotate; Ogre::Vector2 mousePos; bool mouseLeftPressed; bool mouseRightPressed; bool mouseMiddleBtn;};#endif // MAINWINDOW_H
删掉mainwindow.cpp代码,以下面的替换
#include "mainwindow.h"OgreView::OgreView(QWidget* parent) : QWidget(parent,Qt::WindowFlags(Qt::MSWindowsOwnDC)){ mRenderWindow = NULL; mSceneMgr = NULL; mVp = NULL; mainEnt = NULL; mainNode = NULL; angleX = 1; angleY = 1; rotX = 1; rotY = 1; mDirection = NULL; mRotate = 1; mousePos = NULL; mouseLeftPressed = false; mouseRightPressed = false; mouseMiddleBtn = false; setupResources();}OgreView::~OgreView(){ // destroy Viewport and RenderWindow if( mVp ) { mRenderWindow->removeViewport(mVp->getZOrder()); mVp = 0; } Ogre::Root::getSingleton().detachRenderTarget(mRenderWindow); mRenderWindow = 0; if(mRoot != NULL) { delete mRoot; mRoot = 0; }}void OgreView::setupResources(){ mRoot = new Ogre::Root("plugins_d.cfg"); Ogre::ConfigFile cf; cf.load("resources_d.cfg"); 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); } } mRoot->restoreConfig(); mRoot->initialise(false);}//一般都在这里写上场景初始化的一些信息void OgreView::createScene(){ qDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); mainEnt = mSceneMgr->createEntity("Head", "Sinbad.mesh"); mainNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); mainNode->attachObject(mainEnt);}//创建灯光,没啥好说的void OgreView::createLight(){ mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5)); mainLight = mSceneMgr->createLight("MainLight"); mainLight->setPosition(20,80,50);}//设置视角,创建摄像机void OgreView::setupView(){ if(mRenderWindow) return; //createRenderWindow,当然必须得自己手工建窗口了,把窗口句柄扒出来.... Ogre::NameValuePairList params; params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId()); mRenderWindow = mRoot->createRenderWindow("View", width(), height(), false, ¶ms); //SceneManager mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC); //setup camera & 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);}void OgreView::paintEvent(QPaintEvent *evt){ Q_UNUSED(evt); if(mRenderWindow == NULL) setupView(); update();}void OgreView::timerEvent(QTimerEvent* evt){ Q_UNUSED(evt); update();}void OgreView::update(){ //手工更新场景内容,而不是进入到连续的循环中 if(mRenderWindow != NULL) { mRoot->renderOneFrame(); //顾名思义,渲染一帧就好了 }}void OgreView::resizeEvent(QResizeEvent *evt){ Q_UNUSED(evt); if (mRenderWindow != NULL) { mRenderWindow->windowMovedOrResized(); mCamera->setAspectRatio(Ogre::Real(mVp->getActualWidth()) / Ogre::Real(mVp->getActualHeight())); }}void OgreView::keyPressEvent(QKeyEvent* evt){ qDebug("keypressevent"); if(mainEnt != NULL && mainNode != NULL) { switch(evt->key()) { case Qt::Key_W: case Qt::Key_Up: { rotX = -0.1; mainNode->pitch(Ogre::Radian(rotX)); break; } case Qt::Key_S: case Qt::Key_Down: { rotX = 0.1; mainNode->pitch(Ogre::Radian(rotX)); break; } case Qt::Key_A: case Qt::Key_Left: { rotY = -0.1; mainNode->yaw(Ogre::Radian(rotY)); break; } case Qt::Key_D: case Qt::Key_Right: { rotY = 0.1; mainNode->yaw(Ogre::Radian(rotY)); break; } } }}void OgreView::mousePressEvent(QMouseEvent* evt){ qDebug("mousePressEvent"); 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; }}void OgreView::mouseReleaseEvent(QMouseEvent *evt){ qDebug("mouseReleaseEvent"); if(evt->button() == Qt::LeftButton) { mouseLeftPressed = false; } if(evt->button() == Qt::RightButton) { mouseRightPressed = false; mousePos = Ogre::Vector2(evt->x(), evt->y()); } if(evt->button() == Qt::MidButton) { mouseMiddleBtn = false; }}void OgreView::wheelEvent(QWheelEvent* evt){ mDirection.z = -evt->delta()/12; update(); mDirection.z = 0;}
#include <QApplication>#include <QWidget>#include "mainwindow.h"#include <QVBoxLayout>int main(int argc, char *argv[]){ QApplication app(argc, argv); QWidget window; window.resize(800, 600); window.setWindowTitle("Simple example"); OgreView* ogreWidget = new OgreView(&window); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ogreWidget); window.setLayout(layout); window.show(); return app.exec();}
第三步:
配置工程
先写*.pro文件
由于输入输出使用了Qt,不需要OIS了,这里就没包括进来
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsDEFINES -= UNICODETARGET = qtclientTEMPLATE = appLIBS *= user32.libLIBS += -L$(OGRE_HOME)\\boost\\librelease:LIBS += -L$(OGRE_HOME)\\lib\\releasedebug:LIBS += -L$(OGRE_HOME)\\lib\\debugINCLUDEPATH += $(OGRE_HOME)\\includeINCLUDEPATH += $(OGRE_HOME)\\include\\OGREINCLUDEPATH += $(OGRE_HOME)\\boostTARGET = $$join(TARGET,,,d)LIBS *= -lOgreMain_dSOURCES += main.cpp\ mainwindow.cppHEADERS += mainwindow.h
第四步(非必须):
配置生成与运行
然后再点击项目属性页
选择自定义处理步骤
添加 “C:\Windows\System32\cmd.exe” 到 命令
添加“/c copy debug\qtclientd.exe %OGRE_HOME%\bin\debug” 到参数
意思是编译生成的 *.exe 直接copy到ogre 的debug运行库目录中,你就可以不用手动复制了。
然后设置运行时的配置
设置working directory 的意思是,运行时,从这里找。
第四步不是必须的,但是设置之后,能省下你很多事情,尤其是调试信息方面。
来看下运行效果图:
- QtOgre 开发(入门日记)( 一 )
- 开发日记(一)
- android开发日记(一)
- 饕餮元年开发日记(一)
- android wifi驱动开发日记(一)
- android wifi驱动开发日记(一)
- android wifi驱动开发日记(一)
- android wifi驱动开发日记(一)
- android wifi驱动开发日记(一)
- app inventor开发日记(一)
- QT开发日记一
- 游戏开发日记一
- deviceOne 开发日记(一)
- avr开发板开发项目日记(一)
- NodeJS前端开发日记(2)AngularJS+Jade入门实战
- Activiti-工作流开发日记(一)
- Android开发入门(一)
- android 开发入门(一)
- BCB使用TImage做探地雷达图形动态显示
- Java 单例模式详解
- 黑马程序员--基础--第二篇--网络编程自定义浏览器和服务器
- DSP程序开发与优化经验之二:程序运行时间测量方法总结
- poj 2823 二分法+单调队列
- QtOgre 开发(入门日记)( 一 )
- ext下的grid
- vb
- 【D3DX9日记】关于顶点颜色D3DFVF_DIFFUSE对应Vertex的颜色类型
- Android应用的源代码
- Visual Basic 6.0安装教程
- 九度OJ 1351 数组中只出现一次的数字
- 一台电脑同时运行多个tomcat配置方法
- 窗体项目。所以Visual Basic中的控件大多和窗体项目有关。