Algorithm 以加速和减速跟随鼠标

Algorithm 以加速和减速跟随鼠标,algorithm,Algorithm,我正在制作一个物体,它总是面对着鼠标的位置,平稳地过渡——加速和减速 对于鼠标附近的减速,这是一个简单的方程式: rotation += deltaRotation / speed 对于加速,有更多的代码(但它围绕目标旋转摆动,因为没有摩擦或阻尼) var deltaRotation=旋转-定向; if(Math.abs(deltaRotation)

我正在制作一个物体,它总是面对着鼠标的位置,平稳地过渡——加速和减速

对于鼠标附近的减速,这是一个简单的方程式:

rotation += deltaRotation / speed
对于加速,有更多的代码(但它围绕目标旋转摆动,因为没有摩擦或阻尼)

var deltaRotation=旋转-定向;
if(Math.abs(deltaRotation)

如何合并这两种算法,使旋转缓慢开始并缓慢达到目标旋转?

在物理世界中,加速度与施加的力成正比。模拟在给定时间步长上施加的力的一种方法是使其与物体移动所需的距离成比例,减去一些阻尼力。阻尼力(如摩擦力或风阻)与流速方向相反,且与流速成比例。阻尼力有效地限制了最高速度,并在直接力下降时提供了良好的减速

考虑一个线性系统。假设
xCursor
是光标的位置,
xMonster
是物体追逐光标的位置。让我们使用
dxMonster
来计算怪物的速度

float force = A*delta - B*dxMonster;
首先,我们需要知道我们离目标有多远,因为我们想根据这一点来加速怪物

float delta = xCursor - xMonster;
是净力。它包括一个使怪物加速到光标的直接力和一个抵抗怪物当前速度的阻尼力

float force = A*delta - B*dxMonster;
您可以使用这些常量来查看什么最有效。您可能需要
A
。在我的测试程序中,我使用了
A=0.1
B=0.5

因为加速度和力成正比,我们可以直接把它加到速度上。请注意,我们不再需要钳制速度,因为阻尼力将防止速度增长过大。然后使用速度更新位置。(在更好的模拟中,您可以使用类似Runge Kutta的方法来进行积分,但对于简单的动画来说,只需在每个时间点添加就可以了。)

重复每个时间步。我省略了
dt
s,因为我的帧速率足够稳定,不太重要


你的问题是关于旋转而不是线性运动,但这是完全类似的。从物理角度讲,它只是角速度和扭矩,而不是线速度和力。

谢谢!这只是我游戏中的一个装饰性细节,所以不需要过度杀戮。我使用RK4/一些Verlet衍生产品(或Nape phys引擎使用的任何其他产品)作为重要的游戏元素。我会尽可能接受你的回答
dxMonster += force;
xMonster += dxMonster;