首页 > 代码库 > HiCameraTrack
HiCameraTrack
- Desc
在cApplication的构造函数中初始化mDragLook为false,否则就能自由移动摄像机了。
- Graphics.h
/*************************************************** ©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);};
- Graphics.cpp
/*************************************************** ©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; }}
- System.h
/*************************************************** ©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);};
- System.cpp
/*************************************************** ©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; }}
- Main.cpp
/*************************************************** ©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;}
HiCameraTrack
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。