我正在使用OpenGl编程一个相当简单的3D迷你高尔夫游戏。我遇到过一个问题,如何让一个在地面上滚动的迷你高尔夫球减速。球是用速度和位置矢量来描述的。
在平面上移动时,必须减速,但仅限于XZ平面(Y轴向上)。Y分量不能减慢,因为只有地面施加摩擦-空气对球的摩擦可以忽略不计,因此当球反弹时,Y分量开始起作用。为了改变它,我添加了一个重力矢量。
我正在寻找一种在两个轴上按比例降低速度的方法。我尝试指数/线性地减少X和Z分量,但这会导致错误的行为-当沿着这些轴中的一个移动时,球以低于方向移动时的速度减慢,例如,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;
}