如何创建具有缩放功能的动态观察相机

How to create Orbit Camera with zooming function

本文关键字:功能 缩放 动态 相机 观察 何创建 创建      更新时间:2023-10-16

我是食人魔的新手,已经阅读了基本教程,但无法理解如何创建带有鼠标滚轮缩放的轨道相机。

这是我的相机代码

// 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;
}

但我可以绕着相机所在的点旋转,但只有当我使用滚轮滚动缩放时,而不是绕着相机旋转的点旋转。我该如何改变它只在一点上旋转?

为相机创建两个节点-第一个节点是target,它被放置在要旋转的点上。

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

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