附录
Terrain Example
/*
This source file is part of OGRE
(Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/
Copyright ?2000-2003 The OGRE Team
Also see acknowledgements in Readme.html
You may use this sample code for anything you like, it is not covered by the
LGPL like the rest of the engine.
*/
/**
/file
Terrain.h
/brief
Specialisation of OGRE's framework application to show the
terrain rendering plugin
*/
#include "ExampleApplication.h"
#include "OgreStringConverter.h"
#define FLOW_SPEED 0.2
#define FLOW_HEIGHT 0.8
class TerrainListener : public ExampleFrameListener
{
public:
TerrainListener(RenderWindow* win, Camera* cam) :ExampleFrameListener(win, cam) { };
// Override frameStarted event to process that (don't care about frameEnded)
bool frameStarted(const FrameEvent& evt)
{
float moveScale;
float rotScale;
float waterFlow;
static float flowAmount = 0.0f;
static bool flowUp = true;
// local just to stop toggles flipping too fast
static Real timeUntilNextToggle = 0;
if (timeUntilNextToggle >= 0)
timeUntilNextToggle -= evt.timeSinceLastFrame;
// If this is the first frame, pick a speed
if (evt.timeSinceLastFrame == 0)
{
moveScale = 1;
rotScale = 0.1;
waterFlow = 0.0f;
}
// Otherwise scale movement units by time passed since last frame
else
{
// Move about 100 units per second,
moveScale = 10.0 * evt.timeSinceLastFrame;
// Take about 10 seconds for full rotation
rotScale = 36 * evt.timeSinceLastFrame;
// set a nice waterflow rate
waterFlow = FLOW_SPEED * evt.timeSinceLastFrame;
}
// Grab input device state
mInputDevice->capture();
SceneNode *waterNode = static_cast<SceneNode*>(
mCamera->getSceneManager()->getRootSceneNode()->getChild("WaterNode"));
if(waterNode)
{
if(flowUp)
flowAmount += waterFlow;
else
flowAmount -= waterFlow;
if(flowAmount >= FLOW_HEIGHT)
flowUp = false;
else if(flowAmount <= 0.0f)
flowUp = true;
waterNode->translate(0, (flowUp ? waterFlow : -waterFlow), 0);
}
static Vector3 vec;
vec = Vector3::ZERO;
if (mInputDevice->isKeyDown(KC_A))
{
// Move camera left
vec.x = -moveScale;
}
if (mInputDevice->isKeyDown(KC_D))
{
// Move camera RIGHT
vec.x = moveScale;
}
if (mInputDevice->isKeyDown(KC_UP) || mInputDevice->isKeyDown(KC_W))
{
// Move camera forward
vec.z = -moveScale;
}
if (mInputDevice->isKeyDown(KC_DOWN) || mInputDevice->isKeyDown(KC_S))
{
// Move camera backward
vec.z = moveScale;
}
if (mInputDevice->isKeyDown(KC_PGUP))
{
// Move camera up
vec.y = moveScale;
}
if (mInputDevice->isKeyDown(KC_PGDOWN))
{
// Move camera down
vec.y = -moveScale;
}
if (mInputDevice->isKeyDown(KC_RIGHT))
{
mCamera->yaw(-rotScale);
}
if (mInputDevice->isKeyDown(KC_LEFT))
{
mCamera->yaw(rotScale);
}
if( mInputDevice->isKeyDown( KC_ESCAPE) )
{
return false;
}
// Rotate view by mouse relative position
float rotX, rotY;
rotX = -mInputDevice->getMouseRelativeX() * 0.13;
rotY = -mInputDevice->getMouseRelativeY() * 0.13;
// Make all the changes to the camera
// Note that YAW direction is around a fixed axis (freelook stylee) rather than a natural YAW (e.g. airplane)
mCamera->yaw(rotX);
mCamera->pitch(rotY);
mCamera->moveRelative(vec);
// Rotate scene node if required
SceneNode* node = mCamera->getSceneManager()->getRootSceneNode();
if (mInputDevice->isKeyDown(KC_O))
{
node->yaw(rotScale);
}
if (mInputDevice->isKeyDown(KC_P))
{
node->yaw(-rotScale);
}
if (mInputDevice->isKeyDown(KC_I))
{
node->pitch(rotScale);
}
if (mInputDevice->isKeyDown(KC_K))
{
node->pitch(-rotScale);
}
if (mInputDevice->isKeyDown(KC_F) && timeUntilNextToggle <= 0)
{
mStatsOn = !mStatsOn;
//Root::getSingleton().showDebugOverlay(mStatsOn);
showDebugOverlay(mStatsOn);
timeUntilNextToggle = 1;
}
// Return true to continue rendering
return true;
}
};
class TerrainApplication : public ExampleApplication
{
public:
TerrainApplication() {}
protected:
virtual void createFrameListener(void)
{
mFrameListener= new TerrainListener(mWindow, mCamera);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
virtual void chooseSceneManager(void)
{
// Get the SceneManager, in this case a generic one
mSceneMgr = mRoot->getSceneManager( ST_EXTERIOR_CLOSE );
Terrain Example
/*
This source file is part of OGRE
(Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/
Copyright ?2000-2003 The OGRE Team
Also see acknowledgements in Readme.html
You may use this sample code for anything you like, it is not covered by the
LGPL like the rest of the engine.
*/
/**
/file
Terrain.h
/brief
Specialisation of OGRE's framework application to show the
terrain rendering plugin
*/
#include "ExampleApplication.h"
#include "OgreStringConverter.h"
#define FLOW_SPEED 0.2
#define FLOW_HEIGHT 0.8
class TerrainListener : public ExampleFrameListener
{
public:
TerrainListener(RenderWindow* win, Camera* cam) :ExampleFrameListener(win, cam) { };
// Override frameStarted event to process that (don't care about frameEnded)
bool frameStarted(const FrameEvent& evt)
{
float moveScale;
float rotScale;
float waterFlow;
static float flowAmount = 0.0f;
static bool flowUp = true;
// local just to stop toggles flipping too fast
static Real timeUntilNextToggle = 0;
if (timeUntilNextToggle >= 0)
timeUntilNextToggle -= evt.timeSinceLastFrame;
// If this is the first frame, pick a speed
if (evt.timeSinceLastFrame == 0)
{
moveScale = 1;
rotScale = 0.1;
waterFlow = 0.0f;
}
// Otherwise scale movement units by time passed since last frame
else
{
// Move about 100 units per second,
moveScale = 10.0 * evt.timeSinceLastFrame;
// Take about 10 seconds for full rotation
rotScale = 36 * evt.timeSinceLastFrame;
// set a nice waterflow rate
waterFlow = FLOW_SPEED * evt.timeSinceLastFrame;
}
// Grab input device state
mInputDevice->capture();
SceneNode *waterNode = static_cast<SceneNode*>(
mCamera->getSceneManager()->getRootSceneNode()->getChild("WaterNode"));
if(waterNode)
{
if(flowUp)
flowAmount += waterFlow;
else
flowAmount -= waterFlow;
if(flowAmount >= FLOW_HEIGHT)
flowUp = false;
else if(flowAmount <= 0.0f)
flowUp = true;
waterNode->translate(0, (flowUp ? waterFlow : -waterFlow), 0);
}
static Vector3 vec;
vec = Vector3::ZERO;
if (mInputDevice->isKeyDown(KC_A))
{
// Move camera left
vec.x = -moveScale;
}
if (mInputDevice->isKeyDown(KC_D))
{
// Move camera RIGHT
vec.x = moveScale;
}
if (mInputDevice->isKeyDown(KC_UP) || mInputDevice->isKeyDown(KC_W))
{
// Move camera forward
vec.z = -moveScale;
}
if (mInputDevice->isKeyDown(KC_DOWN) || mInputDevice->isKeyDown(KC_S))
{
// Move camera backward
vec.z = moveScale;
}
if (mInputDevice->isKeyDown(KC_PGUP))
{
// Move camera up
vec.y = moveScale;
}
if (mInputDevice->isKeyDown(KC_PGDOWN))
{
// Move camera down
vec.y = -moveScale;
}
if (mInputDevice->isKeyDown(KC_RIGHT))
{
mCamera->yaw(-rotScale);
}
if (mInputDevice->isKeyDown(KC_LEFT))
{
mCamera->yaw(rotScale);
}
if( mInputDevice->isKeyDown( KC_ESCAPE) )
{
return false;
}
// Rotate view by mouse relative position
float rotX, rotY;
rotX = -mInputDevice->getMouseRelativeX() * 0.13;
rotY = -mInputDevice->getMouseRelativeY() * 0.13;
// Make all the changes to the camera
// Note that YAW direction is around a fixed axis (freelook stylee) rather than a natural YAW (e.g. airplane)
mCamera->yaw(rotX);
mCamera->pitch(rotY);
mCamera->moveRelative(vec);
// Rotate scene node if required
SceneNode* node = mCamera->getSceneManager()->getRootSceneNode();
if (mInputDevice->isKeyDown(KC_O))
{
node->yaw(rotScale);
}
if (mInputDevice->isKeyDown(KC_P))
{
node->yaw(-rotScale);
}
if (mInputDevice->isKeyDown(KC_I))
{
node->pitch(rotScale);
}
if (mInputDevice->isKeyDown(KC_K))
{
node->pitch(-rotScale);
}
if (mInputDevice->isKeyDown(KC_F) && timeUntilNextToggle <= 0)
{
mStatsOn = !mStatsOn;
//Root::getSingleton().showDebugOverlay(mStatsOn);
showDebugOverlay(mStatsOn);
timeUntilNextToggle = 1;
}
// Return true to continue rendering
return true;
}
};
class TerrainApplication : public ExampleApplication
{
public:
TerrainApplication() {}
protected:
virtual void createFrameListener(void)
{
mFrameListener= new TerrainListener(mWindow, mCamera);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
virtual void chooseSceneManager(void)
{
// Get the SceneManager, in this case a generic one
mSceneMgr = mRoot->getSceneManager( ST_EXTERIOR_CLOSE );
本文展示了一个基于OGRE框架的应用程序示例,专门用于演示地形渲染插件的功能。通过控制水流动画、相机移动及场景节点旋转等交互操作,为用户提供了一种直观的方式来自定义观察地形。
2490

被折叠的 条评论
为什么被折叠?



