使用向量在 3D space 中减慢对象

Slowing an object in 3D space using vectors

我正在使用 OpenGl 编写一个相当简单的 3D 迷你高尔夫游戏。我 运行 遇到了一个让在表面上滚动的迷你高尔夫球减速的问题。球由速度和位置向量描述。

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

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

您需要找到 XZ 平面中 2D 速度矢量的大小作为标量,然后将摩擦函数应用于它,然后转换回 2D 矢量。

在类似 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;
}