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