如何创建具有缩放功能的Orbit Camera

时间:2014-04-20 10:17:46

标签: c++ ogre ogre3d

我是食人魔的新手并已阅读基本教程,但无法理解如何使用鼠标滚轮缩放创建轨道摄像头。

这是我的相机代码

// Create the scene node(orbit camera)
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("orbit", Ogre::Vector3(0, 100, -150));
node->attachObject(mCamera);

// create the second camera node(freecam)
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("free", Ogre::Vector3(0, 100, 400));

// create the third camera node (3rd person robot cam)
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("robocam", Ogre::Vector3(0, 100, -80));

这是我的按键功能

bool BasicTutorial05::processUnbufferedInput(const Ogre::FrameEvent& evt)
{
    Ogre::Vector3 transVector1 = Ogre::Vector3::ZERO;
    if (cam1 == true)//when cam 1 is selected, bool cam1 will be true;
    {
        if (mKeyboard->isKeyDown(OIS::KC_S)) 
        {
            mSceneMgr->getSceneNode("orbit")->pitch(Ogre::Radian(-0.012f));
        }
        if (mKeyboard->isKeyDown(OIS::KC_W))
        {
            mSceneMgr->getSceneNode("orbit")->pitch(Ogre::Radian(0.012f));
        }
        if (mKeyboard->isKeyDown(OIS::KC_A))
        {
            mSceneMgr->getSceneNode("orbit")->yaw(Ogre::Radian(0.012f));
        }
        if (mKeyboard->isKeyDown(OIS::KC_D))
        {
            mSceneMgr->getSceneNode("orbit")->yaw(Ogre::Radian(-0.012f));
        }
    }
    mSceneMgr->getSceneNode("orbit")->translate(transVector1 *evt.timeSinceLastFrame,      Ogre::Node::TS_LOCAL);
}

和鼠标滚轮缩放

//zooming for orbit camera
Ogre::Vector3 transVector2 = Ogre::Vector3::ZERO;
if (mMouse->getMouseState().Z.rel != 0){
    transVector2.z = -mMouse->getMouseState().Z.rel;
}

但是我可以围绕相机所在的位置进行轨道运动,但只有当我使用滚轮滚动变焦时,而不是围绕它在相机所在位置旋转的点旋转。 如何更改它只在某一点旋转?

1 个答案:

答案 0 :(得分:0)

为您的相机创建两个节点 - 第一个是target,它位于您想要旋转的位置。

应该在距离第一个节点一定距离处创建第二个节点。您应该将其作为target的子项附加,并将您的相机附加到此节点。最后,您应将相机对准目标节点(第一个)。

使用此设置,您只需将目标节点放在您感兴趣的位置并根据需要旋转它。摄像机位置将跟随目标,因为它是他的孩子。通过将摄像机节点移近目标节点,您可以更改缩放级别。