XNA MathHelper.SmoothStep是什么?它是如何工作的?

5

我有一辆车,当加速时希望速度可以“缓慢”增加。

通过查看几个网站,我得出结论:可以使用SmoothStep方法来实现这一点?

我基本上知道如何移动纹理等内容,因此一个使用SmoothStep将值在float中逐渐增加的示例将非常有帮助!

提前感谢您的帮助 :)

我认为MSDN库中并没有所有方法的示例,这很遗憾。

3个回答

13

SmoothStep在这里不会帮助你。 SmoothStep是一个两个值的插值函数,类似于正弦插值。它会缓慢加速,在x = 0.5左右达到高速度,然后减速直到到达终点(x = 1.0)。

就像下面这样:

smoothstep_approx

这只是近似值,实际函数没有这些精确数字。

是的,你可以使用x = 0..0.5来实现你想要的效果,但是对于加速曲线,你的控制非常有限。

如果你想真正地加速汽车或任何其他对象,最好自行跟踪加速度和速度。

class Car : GameComponent
{
    public override void Update(GameTime time)
    {
         velocity += acceleration * time.ElapsedGameTime.TotalSeconds;
         position += velocity * time.ElapsedGameTime.TotalSeconds;
    }

    Vector3 position;
    Vector3 velocity;
    Vector3 acceleration;
}

如果你的游戏状态使用的维度不同,那么位置、速度和加速度将是Vector2或Vector3。此外,请注意这种积分形式容易出现轻微的数学误差。


6
这份文档来看,SmoothStep需要三个参数——你想要在它们之间移动的两个值和它们之间的数量,这个数量可能需要在0到1之间。
所以说,假设你有一个浮点数f,它在一段时间内从0线性增加到目标速度。使用SmoothStep而不是直接使用f作为速度,应该像这样:
float speed = MathHelper.SmoothStep(0, destSpeed, f/destSpeed);

这份文档真的太糟糕了,让人难以置信。


0

当您需要将离散数字插值为实数,并且需要关键点的斜率为零时。比如说,您想让您的汽车在精确的时刻缓慢启动,然后缓慢停止到非常精确的时刻,那么SmootStep就可以帮助您实现这一点。 - Coincoin
它也可以非常有用地用于各种动画过渡,例如菜单。 - Coincoin
如果有示例,请附上 :) - Moulde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接