gpt4 book ai didi

algorithm - 跟随鼠标加减速

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:18 26 4
gpt4 key购买 nike

我正在制作一个始终面向鼠标位置且过渡平滑的对象 - 加速和减速。

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

rotation += deltaRotation / speed

为了加速还有更多的代码(但它会围绕目标旋转摆动,因为没有摩擦或阻尼)

var deltaRotation = rotation - targetRotation;

if (Math.abs(deltaRotation) < EPSILON) { //Stop motion near 0
return;
}

var direction = deltaRotation != 0 ? deltaRotation / Math.abs(deltaRotation) : 0;

dv += ACCELERATION * direction * dt;

dv = FMath.clamp(dv, -MAX_SPEED, MAX_SPEED);

rotation += dv * deltaRotation;

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

最佳答案

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

考虑一个线性系统。比方说 xCursor是光标的位置,xMonster是追逐光标的东西的位置。让我们使用 dxMonster对于怪物的速度。

首先我们需要知道我们距离多远,因为我们想根据那个来加速怪物。

float delta = xCursor - xMonster;

force是合力。它包括使怪物加速朝向光标的直接力和抵抗怪物当前速度的阻尼力。

float force = A*delta - B*dxMonster;

您可以尝试使用常量来查看最有效的方法。你可能想要 A < B .在我的测试程序中,我使用了 A = 0.1B = 0.5 .

由于加速度与力成正比,我们可以将其直接加到速度上。请注意,我们不再需要限制速度,因为阻尼力会阻止它变得太大。然后使用速度更新位置。 (在更好的模拟中,您可以使用 Runge-Kutta 之类的方法进行积分,从而更好地对此进行近似,但对于简单的动画来说,只需在每个时间步添加即可。)

dxMonster += force;
xMonster += dxMonster;

对每个时间步重复。我省略了 dt这是因为我的帧速率足够稳定,所以无关紧要。

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

关于algorithm - 跟随鼠标加减速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34638281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com