OGRE模型跟随鼠标座标移动
我想实现一个类似CS的视觉效果,一个手臂模型固定在视角前面一个位置,就想到跟随鼠标来做,下面是我的代码,可是运行发现手臂乱跑,和鼠标位置不一致,请大侠们帮我看看,谢谢了
// CatchApple.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <CEGUI/CEGUISystem.h>#include <CEGUI/CEGUISchemeManager.h>#include <OgreCEGUIRenderer.h>#include "ExampleApplication.h"#include <math.h>#include <iostream>using namespace std;class CatchAppleListener:public ExampleFrameListener,public OIS::MouseListener{protected: SceneNode *pHandNode;public: CatchAppleListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager,CEGUI::Renderer *renderer,SceneNode *handnode) :ExampleFrameListener(win,cam,false,true),mGUIRenderer(renderer) { // Reduce move speed mSceneMgr = sceneManager; pHandNode = handnode; mMoveSpeed = 50; mRotateSpeed /= 500; mMouse->setEventCallback(this); mRaySceneQuery = mSceneMgr->createRayQuery(Ray()); } ~CatchAppleListener() { } bool frameStarted(const FrameEvent& evt) { Vector3 camPos = mCamera->getPosition(); Ray cameraRay(Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y); mRaySceneQuery->setRay(cameraRay); // Perform the scene query // 进行场景查询 mRaySceneQuery->setSortByDistance(false); RaySceneQueryResult &result = mRaySceneQuery->execute(); RaySceneQueryResult::iterator itr; // 获得结果,设置摄像机高度 for (itr = result.begin(); itr != result.end(); itr++) { if (itr->worldFragment) { Real terrainHeight = itr->worldFragment->singleIntersection.y; if ((terrainHeight + 10.0f) > camPos.y) mCamera->setPosition(camPos.x, terrainHeight + 10.0f, camPos.z); break; } // if } // for return ExampleFrameListener::frameStarted(evt); } bool mouseReleased(const OIS::MouseEvent &arg,OIS::MouseButtonID id) { return true; } bool mousePressed(const OIS::MouseEvent &arg,OIS::MouseButtonID id) { return true; } bool mouseMoved(const OIS::MouseEvent &arg) { CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel); mCamera->yaw(Degree(-arg.state.X.rel * mRotateSpeed)); mCamera->pitch(Degree(-arg.state.Y.rel * mRotateSpeed)); Vector3 pos; pos.x = arg.state.X.abs; pos.y = arg.state.Y.abs; pos.z = arg.state.Z.abs; pHandNode->setPosition(pos); //设置手臂模型跟随鼠标移动 return true; } void onLeftPressed(const OIS::MouseEvent &arg) { } void onLeftReleased(const OIS::MouseEvent &arg) { } void onRightPressed(const OIS::MouseEvent &arg) { } virtual void onRightReleased(const OIS::MouseEvent &arg) { }protected: CEGUI::Renderer *mGUIRenderer; // CEGUI渲染器 Vector3 CamTar; Vector3 CamPos; Vector3 HandPos; RaySceneQuery *mRaySceneQuery; // 射线场景查询指针 SceneManager *mSceneMgr; // 指向场景管理器的指针};class CatchAppleApp:public ExampleApplication{protected: CEGUI::OgreCEGUIRenderer *mGUIRenderer; CEGUI::System *mGUISystem; // CEGUI system SceneNode *Handnode;public: CatchAppleApp() { } ~CatchAppleApp() { }protected: void chooseSceneManager(void) { mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE); } void createScene(void) { mSceneMgr->setAmbientLight(ColourValue(0.5,0.5,0.5)); mSceneMgr->setSkyDome(true,"Examples/CloudySky",5,8); mSceneMgr->setWorldGeometry("terrain.cfg"); // CEGUI setup mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr); mGUISystem = new CEGUI::System(mGUIRenderer); Entity *ent = mSceneMgr->createEntity("hand","hand.mesh"); Handnode = mSceneMgr->getRootSceneNode()->createChildSceneNode("handnode"); Handnode->attachObject(ent); Handnode->setPosition(0,100,300); // Mouse CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme"); CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow"); } void createFrameListener(void) { mFrameListener = new CatchAppleListener(mWindow,mCamera,mSceneMgr,mGUIRenderer,Handnode); mFrameListener->showDebugOverlay(false); mRoot->addFrameListener(mFrameListener); } virtual void createCamera(void) { // Create the camera mCamera = mSceneMgr->createCamera("PlayerCam"); // 设置摄象机位置 //mCamera->setPosition(Vector3(0,0,500)); mCamera->setPosition(Vector3(0,100,0)); // Look back along -Z mCamera->lookAt(Vector3(0,0,300)); mCamera->setNearClipDistance(5); }};int _tmain(int argc, _TCHAR* argv[]){ CatchAppleApp app; app.go(); return 0;}