使用矢量在3D空间中减慢物体的速度



我正在使用OpenGl编程一个相当简单的3D迷你高尔夫游戏。我遇到过一个问题,如何让一个在地面上滚动的迷你高尔夫球减速。球是用速度和位置矢量来描述的。

在平面上移动时,必须减速,但仅限于XZ平面(Y轴向上)。Y分量不能减慢,因为只有地面施加摩擦-空气对球的摩擦可以忽略不计,因此当球反弹时,Y分量开始起作用。为了改变它,我添加了一个重力矢量。

我正在寻找一种在两个轴上按比例降低速度的方法。我尝试指数/线性地减少XZ分量,但这会导致错误的行为-当沿着这些轴中的一个移动时,球以低于方向移动时的速度减慢,例如,45度,其中两个轴都对速度有贡献。

你需要在XZ平面上找到二维速度矢量的大小作为标量,然后应用你的摩擦函数,然后转换回二维矢量。

在类c的伪代码中:

// the current velocity in each direction
float velocityX, velocityY, velocityZ;
// compute magnitude using Pythagorean Theorem:
float magnitude = sqrt((velocityX * velocityX) + (velocityZ * velocityZ));
if(magnitude > 0.0)  // is it moving?
{
    // apply friction to magnitude using whatever function you want
    //           e.g. newMagnitude = magnitude * 0.95f;
    float newMagnitude = applyFriction(magnitude);
    float scaleFactor = newMagnitude / magnitude;
    // compute the new velocity in each direction:
    velocityX *= scaleFactor;
    velocityZ *= scaleFactor;
}

相关内容

  • 没有找到相关文章

最新更新