ogre学习笔记-基础教程345

来源:互联网 发布:angular 1.0.7.min.js 编辑:程序博客网 时间:2024/06/05 10:02
这三个教程的源码在我的上传资源里面。放到一个解决方案中了。这里假设你能够自己建立一个app,即通过BasicTutorial1的练习。
----------------------

BasicTutorial3
一、地形
1、添加 OgreTerrain_d.lib
2、地形中没有添加 page功能模块
3、TerrainGroup、Terrain和TerrainGlobalOptions类。
3.1、
mTerrainGroup->setFilenameConvention(Ogre::String("BasicTutorial3Terrain"), Ogre::String("dat"));
用于设置保存地地形文件的前缀和扩展名。

3.2、 
    mTerrainGlobals->setLightMapDirection(light->getDerivedDirection());    mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());    mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());
用于计算生成纹理中的阴影,所以需要设置方向光的方向和颜色,用于模拟阴影,在渲染的时候不用计算了。

3.3、每层地层贴图需要两层纹理。
3.4、
    mTerrainGroup->saveAllTerrains(true);
保存所有的地形文件。前缀和扩展名如上设置。

二、天空盒
1、天空盒,是一个cube。各种参数见API。
   mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
2、天空盒还是一个cube,但是他的纹理给人一种圆柱的感觉。
   mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
3、天空是一个巨大的平面。
Ogre::Plane plane;plane.d = 1000;plane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;
mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane", 1500, 75);


三、烟雾

1、烟雾的生成不是在空的空间里面生成烟雾实体,而是对你当前看到的所有东西进行一个滤镜。

如果你凝视着雾,你讲什么都看不到,只能看到视口的背景。所以我们把背景颜色设置成雾的颜色。

2、有两种基本类型的雾:线性的和指数型的。线性雾浓度成线性变化,指数型的雾成指数变化。

Ogre::ColourValue fadeColour(0.9, 0.9, 0.9);mWindow->getViewport(0)->setBackgroundColour(fadeColour);
3、三种雾的设置函数

mSceneMgr->setFog(Ogre::FOG_LINEAR, fadeColour, 0.0, 50, 500);
mSceneMgr->setFog(Ogre::FOG_EXP, fadeColour, 0.005);
mSceneMgr->setFog(Ogre::FOG_EXP2, fadeColour, 0.003);
四、烟雾和天空

设置烟雾的时候要注意配合天空盒的设置,否则会出现可以看到奇特的天空的现象。


BasicTutorial4

1、FrameListeners
virtual bool frameStarted(const FrameEvent& evt);virtual bool frameRenderingQueued(const FrameEvent& evt);virtual bool frameEnded(const FrameEvent& evt);
frameStartedCalled just before a frame is rendered.frameRenderingQueuedCalled after all render targets have had their rendering commands issued, but before
the render windows have been asked to flip their buffers overframeEndedCalled just after a frame has been rendered.

  

timeSinceLastFrame This variable keeps track of how long it's been since the frameStarted or frameEnded last fired (in seconds). 
Note that in the frameStarted method, FrameEvent::timeSinceLastFrame will contain how long it has been since the last frameStarted event was last fired (not the last time a frameEnded method was fired).
frameRenderingQueued函数:使用GPU进行计算。

2、Unbuffered Input
bool currMouse = mMouse->getMouseState().buttonDown(OIS::MB_Left);
if (mKeyboard->isKeyDown(OIS::KC_J)) // Left - yaw or strafe
if(mKeyboard->isKeyDown( OIS::KC_LSHIFT ))
完成。

BasicTutorial5
简介:
The program controls will be the same as in the last tutorial. 
We will override the frameRenderingQueued and createFrameListener methods, as well as the MouseListener and KeyboardListener event methods (keyPressed(), keyReleased(), mouseMoved(), mousePressed() and mouseReleased).

利用 public OIS::KeyListener, public OIS::MouseListener 监听接口。
添加监听:
virtual void createFrameListener(void);函数中添加如下代码:
// Do not add this code to the project!mMouse->setEventCallback(this);mKeyboard->setEventCallback(this);
实现监听器的如下函数:
virtual bool keyPressed( const OIS::KeyEvent& evt );
virtual bool keyReleased( const OIS::KeyEvent& evt );
// OIS::MouseListener
virtual bool mouseMoved( const OIS::MouseEvent& evt );
virtual bool mousePressed( const OIS::MouseEvent& evt, OIS::MouseButtonID id );
virtual bool mouseReleased( const OIS::MouseEvent& evt, OIS::MouseButtonID id );
注意:
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt );函数中添加代码:
       mKeyboard->capture();
       mMouse->capture();
代码用于更新鼠标键盘状态。

具体实现函数类似:
bool keyPressed(const OIS::KeyEvent& evt){    switch (evt.key)    {    case OIS::KC_ESCAPE:         mShutDown = true;        break;    default:        break;    }    return true;}
具体实现3D中的动作,virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt );函数中添加代码:
mCamNode->translate(mDirection * evt.timeSinceLastFrame, Ogre::Node::TS_LOCAL);


0 0
原创粉丝点击