使用向量

时间:2015-05-26 22:06:31

标签: opengl math linear-algebra

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

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

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

1 个答案:

答案 0 :(得分:0)

您需要在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;
}