标签:des style blog http os io for ar 2014

在cApplication的构造函数中初始化mDragLook为false,否则就能自由移动摄像机了。
/***************************************************
©2014 Pf_D. All rights reserved.
***************************************************/
#pragma once
#include "OGRE\Ogre.h"
#include "OIS\OIS.h"
enum CameraStyle
{
CS_FREELOOK,
CS_ORBIT,
CS_MANUAL
};
class cCameraManager
{
private:
Ogre::Camera *mCamera;
CameraStyle mStyle;
Ogre::SceneNode *mTarget;
bool mOrbiting;
bool mZooming;
Ogre::Real mTopSpeed;
Ogre::Vector3 mVelocity;
bool mGoingForward;
bool mGoingBack;
bool mGoingLeft;
bool mGoingRight;
bool mGoingUp;
bool mGoingDown;
bool mFastMove;
public:
cCameraManager(Ogre::Camera *cam);
void setCamera(Ogre::Camera *cam);
Ogre::Camera *getCamera();
void manualStop();
void setStyle(CameraStyle style);
CameraStyle getStyle();
void setYawPitchDist(Ogre::Radian yaw, Ogre::Radian pitch, Ogre::Real dist);
void setTarget(Ogre::SceneNode *target);
Ogre::SceneNode *getTarget();
void setTopSpeed(Ogre::Real topSpeed);
Ogre::Real getTopSpeed();
bool frameRenderingQueued(const Ogre::FrameEvent& evt);
// Processes key press for free-look style movement.
void injectKeyDown(const OIS::KeyEvent &evt);
void injectKeyUp(const OIS::KeyEvent &evt);
// Processes mouse movement differently for each style.
void injectMouseMove(const OIS::MouseEvent &evt);
// Processes mouse presses. Only applies for orbit style.
// Left button is for orbiting, and right button is for zooming.
void injectMouseDown(const OIS::MouseEvent &evt, OIS::MouseButtonID id);
void injectMouseUp(const OIS::MouseEvent &evt, OIS::MouseButtonID id);
};
/***************************************************
©2014 Pf_D. All rights reserved.
***************************************************/
#include "Graphics.h"
cCameraManager::cCameraManager(Ogre::Camera *cam)
:mCamera(0),
mStyle(CameraStyle::CS_FREELOOK),
mTarget(0),
mOrbiting(false),
mZooming(false),
mTopSpeed(150),
mVelocity(Ogre::Vector3::ZERO),
mGoingForward(false),
mGoingBack(false),
mGoingLeft(false),
mGoingRight(false),
mGoingUp(false),
mGoingDown(false),
mFastMove(false)
{
setCamera(cam);
setStyle(CS_FREELOOK);
}
void cCameraManager::setCamera(Ogre::Camera *cam)
{
mCamera = cam;
}
Ogre::Camera *cCameraManager::getCamera()
{
return mCamera;
}
void cCameraManager::setYawPitchDist(Ogre::Radian yaw, Ogre::Radian pitch, Ogre::Real dist)
{
mCamera->setPosition(mTarget->_getDerivedPosition());
mCamera->setOrientation(mTarget->_getDerivedOrientation());
mCamera->yaw(yaw);
mCamera->pitch(pitch);
mCamera->moveRelative(Ogre::Vector3(0, 0, dist));
}
void cCameraManager::setTarget(Ogre::SceneNode *target)
{
if(target != mTarget)
{
mTarget = target;
if(target)
{
setYawPitchDist(Ogre::Degree(0), Ogre::Degree(15), 150);
mCamera->setAutoTracking(true, mTarget);
}
else
mCamera->setAutoTracking(false);
}
}
Ogre::SceneNode *cCameraManager::getTarget()
{
return mTarget;
}
void cCameraManager::manualStop()
{
if(mStyle == CS_FREELOOK)
{
mVelocity = Ogre::Vector3::ZERO;
mGoingForward = false;
mGoingBack = false;
mGoingLeft = false;
mGoingRight = false;
mGoingUp = false;
mGoingDown = false;
}
}
void cCameraManager::setStyle(CameraStyle style)
{
if(mStyle != CS_ORBIT && style == CS_ORBIT)
{
setTarget(mTarget ? mTarget : mCamera->getSceneManager()->getRootSceneNode());
mCamera->setFixedYawAxis(true);
manualStop();
setYawPitchDist(Ogre::Degree(0), Ogre::Degree(15), 150);
}
else if(mStyle != CS_FREELOOK && style == CS_FREELOOK)
{
mCamera->setAutoTracking(false);
mCamera->setFixedYawAxis(true);
}
else if(mStyle != CS_MANUAL && style == CS_MANUAL)
{
mCamera->setAutoTracking(false);
manualStop();
}
mStyle = style;
}
CameraStyle cCameraManager::getStyle()
{
return mStyle;
}
void cCameraManager::setTopSpeed(Ogre::Real topSpeed)
{
mTopSpeed = topSpeed;
}
Ogre::Real cCameraManager::getTopSpeed()
{
return mTopSpeed;
}
bool cCameraManager::frameRenderingQueued(const Ogre::FrameEvent& evt)
{
if (mStyle == CS_FREELOOK)
{
// build our acceleration vector based on keyboard input composite
Ogre::Vector3 accel = Ogre::Vector3::ZERO;
if (mGoingForward) accel += mCamera->getDirection();
if (mGoingBack) accel -= mCamera->getDirection();
if (mGoingRight) accel += mCamera->getRight();
if (mGoingLeft) accel -= mCamera->getRight();
if (mGoingUp) accel += mCamera->getUp();
if (mGoingDown) accel -= mCamera->getUp();
// if accelerating, try to reach top speed in a certain time
Ogre::Real topSpeed = mFastMove ? mTopSpeed * 20 : mTopSpeed;
if (accel.squaredLength() != 0)
{
accel.normalise();
mVelocity += accel * topSpeed * evt.timeSinceLastFrame * 10;
}
// if not accelerating, try to stop in a certain time
else mVelocity -= mVelocity * evt.timeSinceLastFrame * 10;
Ogre::Real tooSmall = std::numeric_limits<Ogre::Real>::epsilon();
// keep camera velocity below top speed and above epsilon
if (mVelocity.squaredLength() > topSpeed * topSpeed)
{
mVelocity.normalise();
mVelocity *= topSpeed;
}
else if (mVelocity.squaredLength() < tooSmall * tooSmall)
mVelocity = Ogre::Vector3::ZERO;
if (mVelocity != Ogre::Vector3::ZERO) mCamera->move(mVelocity * evt.timeSinceLastFrame);
}
return true;
}
void cCameraManager::injectKeyDown(const OIS::KeyEvent &evt)
{
if(mStyle != CS_FREELOOK)
return;
if (evt.key == OIS::KC_W || evt.key == OIS::KC_UP) mGoingForward = true;
else if (evt.key == OIS::KC_S || evt.key == OIS::KC_DOWN) mGoingBack = true;
else if (evt.key == OIS::KC_A || evt.key == OIS::KC_LEFT) mGoingLeft = true;
else if (evt.key == OIS::KC_D || evt.key == OIS::KC_RIGHT) mGoingRight = true;
else if (evt.key == OIS::KC_PGUP) mGoingUp = true;
else if (evt.key == OIS::KC_PGDOWN) mGoingDown = true;
else if (evt.key == OIS::KC_LSHIFT) mFastMove = true;
}
void cCameraManager::injectKeyUp(const OIS::KeyEvent &evt)
{
if(mStyle != CS_FREELOOK)
return;
if (evt.key == OIS::KC_W || evt.key == OIS::KC_UP) mGoingForward = false;
else if (evt.key == OIS::KC_S || evt.key == OIS::KC_DOWN) mGoingBack = false;
else if (evt.key == OIS::KC_A || evt.key == OIS::KC_LEFT) mGoingLeft = false;
else if (evt.key == OIS::KC_D || evt.key == OIS::KC_RIGHT) mGoingRight = false;
else if (evt.key == OIS::KC_PGUP) mGoingUp = false;
else if (evt.key == OIS::KC_PGDOWN) mGoingDown = false;
else if (evt.key == OIS::KC_LSHIFT) mFastMove = false;
}
void cCameraManager::injectMouseMove(const OIS::MouseEvent &evt)
{
if (mStyle == CS_ORBIT)
{
Ogre::Real dist = (mCamera->getPosition() - mTarget->_getDerivedPosition()).length();
if (mOrbiting) // yaw around the target, and pitch locally
{
mCamera->setPosition(mTarget->_getDerivedPosition());
mCamera->yaw(Ogre::Degree(-evt.state.X.rel * 0.25f));
mCamera->pitch(Ogre::Degree(-evt.state.Y.rel * 0.25f));
mCamera->moveRelative(Ogre::Vector3(0, 0, dist));
// don‘t let the camera go over the top or around the bottom of the target
}
else if (mZooming) // move the camera toward or away from the target
{
// the further the camera is, the faster it moves
mCamera->moveRelative(Ogre::Vector3(0, 0, evt.state.Y.rel * 0.004f * dist));
}
else if (evt.state.Z.rel != 0) // move the camera toward or away from the target
{
// the further the camera is, the faster it moves
mCamera->moveRelative(Ogre::Vector3(0, 0, -evt.state.Z.rel * 0.0008f * dist));
}
}
else if (mStyle == CS_FREELOOK)
{
mCamera->yaw(Ogre::Degree(-evt.state.X.rel * 0.15f));
mCamera->pitch(Ogre::Degree(-evt.state.Y.rel * 0.15f));
}
}
void cCameraManager::injectMouseDown(const OIS::MouseEvent &evt, OIS::MouseButtonID id)
{
if (mStyle == CS_ORBIT)
{
if (id == OIS::MB_Left) mOrbiting = true;
else if (id == OIS::MB_Right) mZooming = true;
}
}
void cCameraManager::injectMouseUp(const OIS::MouseEvent &evt, OIS::MouseButtonID id)
{
if (mStyle == CS_ORBIT)
{
if (id == OIS::MB_Left) mOrbiting = false;
else if (id == OIS::MB_Right) mZooming = false;
}
}
/***************************************************
©2014 Pf_D. All rights reserved.
***************************************************/
#pragma once
#include "Graphics.h"
#include "OGRE\Ogre.h"
#include "OIS\OIS.h"
#include "MyGUI.h"
#include "MyGUI_OgrePlatform.h"
class cApplication : public Ogre::FrameListener, public OIS::KeyListener, public OIS::MouseListener
{
protected:
MyGUI::Gui *mGUI;
MyGUI::OgrePlatform *mPlatform;
Ogre::Root *mRoot;
Ogre::RenderWindow *mWindow;
Ogre::SceneManager *mSceneMgr;
Ogre::Camera *mCamera;
cCameraManager *mCameraMgr;
OIS::InputManager *mInputMgr;
OIS::Keyboard *mKeyboard;
OIS::Mouse *mMouse;
bool mDragLook;
public:
cApplication()
:mDragLook(false)
{
}
virtual bool frameStarted(const Ogre::FrameEvent &evt);
virtual bool frameRenderingQueued(const Ogre::FrameEvent &evt);
virtual bool frameEnded(const Ogre::FrameEvent &evt);
virtual bool keyPressed(const OIS::KeyEvent &arg);
virtual bool keyReleased(const OIS::KeyEvent &arg);
virtual bool mouseMoved(const OIS::MouseEvent &arg);
virtual bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
virtual bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
virtual void setupResources();
virtual void createInput();
virtual void chooseSceneMgr();
virtual void setupView();
virtual void loadResources();
virtual void createScene() {}
bool setup();
void go();
void setDragLook(bool enabled);
};
/***************************************************
©2014 Pf_D. All rights reserved.
***************************************************/
#include "System.h"
bool cApplication::frameStarted(const Ogre::FrameEvent &evt)
{
mKeyboard->capture();
mMouse->capture();
return true;
}
bool cApplication::frameRenderingQueued(const Ogre::FrameEvent &evt)
{
mCameraMgr->frameRenderingQueued(evt);
return true;
}
bool cApplication::frameEnded(const Ogre::FrameEvent &evt)
{
return true;
}
bool cApplication::keyPressed(const OIS::KeyEvent &arg)
{
if(arg.key == OIS::KC_ESCAPE)
exit(0);
MyGUI::InputManager::getInstance().injectKeyPress(
MyGUI::KeyCode::Enum(arg.key), arg.text);
mCameraMgr->injectKeyDown(arg);
// ...
return true;
}
bool cApplication::keyReleased(const OIS::KeyEvent &arg)
{
MyGUI::InputManager::getInstance().injectKeyRelease(MyGUI::KeyCode::Enum(arg.key));
mCameraMgr->injectKeyUp(arg);
// ...
return true;
}
bool cApplication::mouseMoved( const OIS::MouseEvent &arg )
{
bool ret = MyGUI::InputManager::getInstance().injectMouseMove(
arg.state.X.abs, arg.state.Y.abs, arg.state.Z.abs);
if(!ret)
mCameraMgr->injectMouseMove(arg);
// ...
return true;
}
bool cApplication::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
bool ret = MyGUI::InputManager::getInstance().injectMousePress(
arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id));
if(!ret)
mCameraMgr->injectMouseDown(arg, id);
if(mDragLook && id == OIS::MB_Left)
{
mCameraMgr->setStyle(CS_FREELOOK);
MyGUI::Gui::getInstance().hidePointer();
}
// ...
return true;
}
bool cApplication::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
bool ret = MyGUI::InputManager::getInstance().injectMouseRelease(
arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id));
if(!ret)
mCameraMgr->injectMouseUp(arg, id);
if(mDragLook && id == OIS::MB_Left)
{
mCameraMgr->setStyle(CS_MANUAL);
MyGUI::Gui::getInstance().showPointer();
}
// ...
return true;
}
void cApplication::setupResources()
{
Ogre::ConfigFile cf;
#if OGRE_DEBUG_MODE
cf.load("resources_d.cfg");
#else
cf.load("resources.cfg");
#endif
Ogre::ConfigFile::SectionIterator secIter = cf.getSectionIterator();
Ogre::String secName, typeName, archName;
while(secIter.hasMoreElements())
{
secName = secIter.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = secIter.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);
}
}
}
void cApplication::createInput()
{
OIS::ParamList parameters;
unsigned int windowHandle = 0;
std::ostringstream windowHandleString;
mWindow->getCustomAttribute("WINDOW", &windowHandle);
windowHandleString << windowHandle;
parameters.insert(std::make_pair("WINDOW", windowHandleString.str()));
parameters.insert(std::make_pair("w32_mouse", std::string("DISCL_FOREGROUND")));
parameters.insert(std::make_pair("w32_mouse", std::string("DISCL_NONEXCLUSIVE")));
mInputMgr = OIS::InputManager::createInputSystem(parameters);
mKeyboard = static_cast<OIS::Keyboard*>(mInputMgr->createInputObject(OIS::OISKeyboard, true));
mKeyboard->setEventCallback(this);
mMouse = static_cast<OIS::Mouse*>(mInputMgr->createInputObject(OIS::OISMouse, true));
const OIS::MouseState &mouseState = mMouse->getMouseState();
mouseState.width = mWindow->getWidth();
mouseState.height = mWindow->getHeight();
mMouse->setEventCallback(this);
}
void cApplication::chooseSceneMgr()
{
mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);
}
void cApplication::setupView()
{
// Create camera
mCamera = mSceneMgr->createCamera("Camera");
mCamera->setPosition(Ogre::Vector3(0, 0, 50));
mCamera->lookAt(Ogre::Vector3(0, 0, -300));
mCamera->setNearClipDistance(5);
mCameraMgr = new cCameraManager(mCamera);
// Create viewports
Ogre::Viewport *vp = mWindow->addViewport(mCamera);
vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0));
mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth())/Ogre::Real(vp->getActualHeight()));
}
void cApplication::loadResources()
{
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
bool cApplication::setup()
{
#ifndef OGRE_STATIC_LIB
#if OGRE_DEBUG_MODE
mRoot = OGRE_NEW Ogre::Root("plugins_d.cfg");
#else
mRoot = OGRE_NEW Ogre::Root("plugins.cfg");
#endif
#endif
setupResources();
if(!mRoot->showConfigDialog())
return false;
mWindow = mRoot->initialise(true);
createInput();
ShowCursor(false);
chooseSceneMgr();
setupView();
loadResources();
createScene();
mRoot->addFrameListener(this);
return true;
}
void cApplication::go()
{
if(!setup())
return;
mRoot->startRendering();
}
void cApplication::setDragLook(bool enabled)
{
if(enabled)
{
mCameraMgr->setStyle(CS_MANUAL);
mDragLook = true;
}
else
{
mCameraMgr->setStyle(CS_FREELOOK);
mDragLook = false;
}
}
/***************************************************
©2014 Pf_D. All rights reserved.
***************************************************/
#include "System.h"
class cMyApplication : public cApplication
{
private:
Ogre::AnimationState *mAnimState;
public:
bool frameRenderingQueued(const Ogre::FrameEvent &evt)
{
mAnimState->addTime(evt.timeSinceLastFrame);
return cApplication::frameRenderingQueued(evt);
}
void createScene()
{
// MyGUI
mPlatform = new MyGUI::OgrePlatform();
mPlatform->initialise(mWindow, mSceneMgr);
mGUI = new MyGUI::Gui();
mGUI->initialise();
MyGUI::Gui::getInstance().hidePointer();
mSceneMgr->setAmbientLight(Ogre::ColourValue(.3, .3, .3));
mSceneMgr->createLight()->setPosition(20, 80, 50);
mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox");
// create an ogre head entity and attach it to a node
Ogre::Entity *head = mSceneMgr->createEntity("Head", "ogrehead.mesh");
Ogre::SceneNode *headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
headNode->attachObject(head);
mCameraMgr->setStyle(CS_MANUAL);
mCamera->setAutoTracking(true, headNode);
// create a camera node and attach camera to it
Ogre::SceneNode *camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
camNode->attachObject(mCamera);
// set up a 10 second animation for our camera, using spline interpolation for nice curves
Ogre::Animation *anim = mSceneMgr->createAnimation("CameraTrack", 10);
anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
// create a track to animate the camera‘s node
Ogre::NodeAnimationTrack *track = anim->createNodeTrack(0, camNode);
track->createNodeKeyFrame(0)->setTranslate(Ogre::Vector3(200, 0, 0));
track->createNodeKeyFrame(2.5)->setTranslate(Ogre::Vector3(0, -50, 100));
track->createNodeKeyFrame(5)->setTranslate(Ogre::Vector3(-500, 100, 0));
track->createNodeKeyFrame(7.5)->setTranslate(Ogre::Vector3(0, 200, -300));
track->createNodeKeyFrame(10)->setTranslate(Ogre::Vector3(200, 0, 0));
// create a new animation state to track this
mAnimState = mSceneMgr->createAnimationState("CameraTrack");
mAnimState->setEnabled(true);
}
};
int main()
{
cMyApplication App;
App.go();
return 0;
}
标签:des style blog http os io for ar 2014
原文地址:http://www.cnblogs.com/mynamepfd/p/3939190.html