ogre学习笔记-基础教程345

这三个教程的源码在我的上传资源里面。放到一个解决方案中了。这里假设你能够自己建立一个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);
frameStarted Called just before a frame is rendered.
frameRenderingQueued Called after all render targets have had their rendering commands issued, but before
the render windows have been asked to flip their buffers over
frameEnded Called 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值