ogre学习小结

来源:互联网 发布:淘宝网泳装 编辑:程序博客网 时间:2024/06/05 21:49
    本来呢,我对动画那块没啥感觉。而且做过那个什么方向测试,测试结果是我不适合做图形学。不过呢,说是为了比赛也好,说是为了提高个人水平也好。管他是怎么回事,反正现在是跟游戏引擎较上劲了。话说到现在已经有半个多月了吧,应该离入门也不远了。多多少少会了点东西,现在就扯一下我的菜鸟级学习经验。(欢迎高手批斗)
     学这个,首先要配置好开发环境,最起码要有SDK吧,我用的是OgreSDK_vc10_v1-8-0,用VS2010集成开发环境.在项目——属性中设置好头文件目录,库文件目录。连接器输入中添加好lib依赖。如果不是很确定需要哪些,不需要哪些,那就把example的配置复制到自己程序的配置中。OgreSDK_vc10_v1-8-0版本还是很好编译的,基本不需要额外配置,直接打开项目编译运行就好。
      网上资料也不少,像 Ogre+3d+1.7+beginner+Guide ,OGRE基础教程1-7这都算比较经典的了吧。本来想找个好师傅,结果师傅给介绍了一个师傅“网络”。在群里问问题很多情况下都会吃闭门羹,或者一堆人瞎扯,当然,运气好会有人回答,就这么个环境,没办法,也没必要纠结与这个。始终还是要相信自己的能力,再说,自己其实再群里也没有回答别人多少有意义问题。。。。额,扯远了那些比较经典的教程都是牛人整理的,像那个那位师傅,他就整理了不少,而且他还愿意给新手指路,就是很少在线。。。额,还是扯得太远,说技术,说技术!
    基本的东西自己看看就好,说我遇到的问题和解决方法。不过话说其实很多资料上那些事都提过了,只不过看的时候没再意,或者说没看懂,或者自以为不这样也行。比如说,所有必要的dll都复制到了最终可执行文件目录下,可调试的时候还有问题,说文件未找到,但是直接运行exe程序是可以的。遇到这种情况,只要把必要的动态链接库复制一份到那个源代码目录就好。不要忘了配置资源文件,这是很重要的一步,FileSystem=../../media/fonts,../代表上一层目录,相信学习计算机的人都明白。注意资源文件的路径,它是相对于exe所在的目录,注意目录层次级别。
   如果代码没问题,但是程序运行不了,那好好看一下log。那里有具体的提示,感觉ogre这一点做的特别好,这样程序中断就不需要额外调试了,直接看log基本就能解决。刚开始不太明白,还傻乎乎就上去就单步执行,中断后查看变量各种属性,然后。。。很多问题看log一眼就能看出来。像什么文件缺失,初始化错误等等。
  程序运行的时候每次都有个初始化的界面,烦人。可以重载configure函数(这里说的是继承自ExampleApplication的程序,其实这些东西嵌入到MFC里都很简单,搞懂了win32或者控制台程序,很容易过渡过去。)
来点比较土的,贴代码了哈(高手别骂我,我写注释了!)(网上还没有这么基本而又这么全的代码吧,不过有一个BUG,不知道那个对象到最后没有销毁,关闭程序后还有进程。。。需要手动结束进程。。。没加事件监听的时候还没这个问题.没事,咱不怕BUG。)
// OGRE.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "ExampleApplication.h"
#pragma once
#include"ExampleFrameListener.h"
#include "OgrePrerequisites.h"
#include "OgreFrameListener.h"
class CFrameListener :
public FrameListener   //事件监听器

public:
CFrameListener(RenderWindow* win,
       Camera* cam,
       AnimationState* animation)
{
  this->cam=cam;//摄像机
  this->win=win;//窗口
  this->manimation=animation;//动画
  manimation->setEnabled(true);//启用动画
manimation->setTimePosition(10);//先改变一下状态看看
manimation->setLoop(true);//循环播放
}
public:
bool frameStarted(const Ogre::FrameEvent  &evt);
AnimationState* manimation;
RenderWindow* win;
Camera* cam;
};
bool CFrameListener::frameStarted( const FrameEvent& evt )
{
//更新动画状态

if(manimation->hasEnded())
{
manimation->setEnabled(true);
manimation->setTimePosition(0);
manimation->setLoop(true);
manimation->addTime(evt.timeSinceLastFrame );
}//这里边似乎是一堆废话
manimation->addTime(evt.timeSinceLastFrame );
return true;
}
class ap : public ExampleApplication
{
AnimationState* mAnimState;//动画
CFrameListener *FrameListener;//监听实例
Entity *et;//实体
public:
ap()
{
}
~ap()
{
   if (FrameListener)
            delete FrameListener;
}
protected:
    bool configure(void)//初始化
    {
       RenderSystemList rl = Root::getSingleton().getAvailableRenderers(); 
        RenderSystem* rsys = NULL; 
        RenderSystemList::iterator it = rl.begin(); 
 
        while( it != rl.end() ) 
        {  
            if( -1 != ( *it )->getName().find( "OpenGL" )  ) 
            { 
                rsys = (RenderSystem*)( *it ); 
                break; 
            } 
            it++; 
        }
  //mRoot->showConfigDialog(); 
        ////rsys->initConfigOptions();  
        //rsys->setConfigOption("Colour Depth", "32" ); 
        ////rsys->setConfigOption("Anti aliasing", "None" ); 
        ////rsys->setConfigOption("Floating-point mode", "Fastest" ); 
        rsys->setConfigOption( "Full Screen", "No" ); 
        ////rsys->setConfigOption("Rendering Device","NVIDIA GeForce FX 5700VE"); 
        rsys->setConfigOption( "VSync", "No" ); 
        rsys->setConfigOption( "Video Mode", "1024 x 768 @ 32-bit colour" ); 
        //rsys->setConfigOption( "Video Mode", "640 x 480" ); 
        //rsys->setConfigOption( "Display Frequency", "60" ); 
        // 起用 
        mRoot->setRenderSystem( rsys );
   mWindow=mRoot->initialise( true ); 
  return true;
    }

void createScene(void)
{
  //  mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
  this->mSceneMgr->setAmbientLight(ColourValue(1,1,1));
  mSceneMgr->setSkyBox(true,"Examples/SpaceSkyBox");
  et=mSceneMgr->createEntity("robot","robot.mesh");
  SceneNode *node=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
  node->attachObject(et);
  Entity *et2=mSceneMgr->createEntity("robot2","robot.mesh");
     mAnimState =et->getAnimationState("Shoot");
  mAnimState->setEnabled(true);
  mAnimState->setLoop(true);
  SceneNode *node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode2",Vector3(50,0,0));
  node2->attachObject(et2);
}
void createFrameListener(void)
{
   FrameListener= new CFrameListener(mWindow, mCamera ,mAnimState );//实例了我自定义的监听,把mAnimState传递给监听。
mRoot->addFrameListener( FrameListener );//添加监听
}
};
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
ap app;
try
{
  app.go();
}catch(Exception &E)
{
  MessageBoxA(NULL,E.getFullDescription().c_str(),"error",MB_OK);
}
}
原创粉丝点击