如何通过按下按钮(Ogre3D)逐渐加速一个对象?

我目前有一个想要逐渐加速的对象。 你按住某个键的时间越长,速度越快。 我设法让它在一个键上正常工作(当它向右移动时),但它似乎不适用于其他方向。

我现在的代码是:

    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD8)) 
    {
        mSpeed += mAcceleration*evt.timeSinceLastFrame;
        movement.z -= mSpeed*evt.timeSinceLastFrame;
        mAcceleration++;
    }
    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD4)) 
    {
        mSpeed += mAcceleration*evt.timeSinceLastFrame;
        movement.x -= mSpeed*evt.timeSinceLastFrame;
        mAcceleration++;
    }
    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD5)) 
    {
        mSpeed += mAcceleration*evt.timeSinceLastFrame;
        movement.z += mSpeed*evt.timeSinceLastFrame;
        mAcceleration++;
    }
    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD6))
    {
        mSpeed += mAcceleration*evt.timeSinceLastFrame;
        movement.x += mSpeed*evt.timeSinceLastFrame;
        mAcceleration++;
    }

最后一个工作正常的声明是正确的。 其余的只是正常移动,没有任何加速度。

我想知道如何让对象在其他方向逐渐加速。

PS以防万一有人想知道,我不能将“if”改为“while”。 当我改变它时,程序根本不运行。

PPS当我将其他人改为“别人如果”时,对象工作(逐渐加速到各个方向),但是我不能再对角地移动 ,这也是我的问题。 我曾尝试过诸如

else if (mKeyboard->isKeyDown(OIS::KC_I) && mKeyboard->isKeyDown(OIS::KC_J))
    {
        mSpeed += mAcceleration *evt.timeSinceLastFrame;
        movement.z -= mSpeed*evt.timeSinceLastFrame;
        movement.x -= mSpeed*evt.timeSinceLastFrame;
        mAcceleration++;
    }

但它仍然不会对角移动。


加速度应该是一个常数,除非你希望你加速加速。 所以在一些我用键输入做的图形中,我有一个名为boost或force的变量,我将它定义为一个数字。 那么,对于if语句,我将会:

if (mKeyboard->isKeyDown(OIS::KC_<whatever>)) {
    object.boost();
} else { object.noBoost(); }

boost()是一个在对象内将布尔值设置为true的函数。 在更新函数中,绘制对象的位置有:

if (isBoosting) {
    velocity += accel//where accel is a defined number
}

你不需要添加所有这些东西,但是不用添加mAcceleration++ ,我只是删除它并在其他地方定义它的加速,并且具有mSpeed += acceleration *... ; 。 我希望这有帮助!


我认为你的解决方案需要两个改变:

  • 加速度应该是一个常数。
  • 速度必须是矢量。
  • 我认为像下面这样修改代码应该可行(不是testet):

    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD8)) 
    {
        mSpeed.z -= mAcceleration*evt.timeSinceLastFrame;
    }
    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD4)) 
    {
        mSpeed.x -= mAcceleration*evt.timeSinceLastFrame;
    }
    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD5)) 
    {
        mSpeed.z += mAcceleration*evt.timeSinceLastFrame;
    }
    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD6))
    {
        mSpeed.x += mAcceleration*evt.timeSinceLastFrame;
    }
    
    movement += mSpeed*evt.timeSinceLastFrame;
    

    显然,我只需要添加另一个if语句

    if (!mKeyboard->isKeyDown(OIS::KC_NUMPAD8) && !mKeyboard->isKeyDown(OIS::KC_NUMPAD4) && !mKeyboard->isKeyDown(OIS::KC_NUMPAD6) && !mKeyboard->isKeyDown(OIS::KC_NUMPAD2))
    {
        mSpeed = mSetSpeed;
        mAcceleration = mSetAcceleration;
    }
    

    (我知道它看起来不好ahahaha),当它不再被按下时,将速度和加速度恢复到正常(所以它可以逐渐增加)。 但仍然好奇,为什么它没有mAcceleration++不起作用。

    解决这个问题的另一种方法是拥有

    if(movement.length()==0) mSpeed = mSetSpeed;
    else mSpeed += mAcceleration*evt.timeSinceLastFrame;
    
    链接地址: http://www.djcxy.com/p/95549.html

    上一篇: How do you gradually accelerate an object based on button press (Ogre3D)?

    下一篇: How do you set an objects Orientation to another objects in Ogre3D?