首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

OGRE模型追随鼠标座标移动

2012-09-13 
OGRE模型跟随鼠标座标移动我想实现一个类似CS的视觉效果,一个手臂模型固定在视角前面一个位置,就想到跟随

OGRE模型跟随鼠标座标移动
我想实现一个类似CS的视觉效果,一个手臂模型固定在视角前面一个位置,就想到跟随鼠标来做,下面是我的代码,可是运行发现手臂乱跑,和鼠标位置不一致,请大侠们帮我看看,谢谢了

C/C++ code
// 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;} 



[解决办法]
高手就是你呀,帮顶。

热点排行