gpt4 book ai didi

控制加速度直到到达某个位置的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:29:03 24 4
gpt4 key购买 nike

我有一个移动点(在一维空间),我需要它平滑移动。所以我认为它的速度必须是一个连续函数,我需要控制加速度然后计算它的速度和位置。

算法对我来说似乎不是很明显,但我想这一定是一个常见问题,我只是找不到解决方案。

注意事项:

  • 物体的最终目的地在移动时可能会发生变化,无论如何移动都需要平稳。
  • 我猜想一个天真的实现会产生弹跳,我需要避免这种情况。

最佳答案

这是使用“临界阻尼 Spring ”的完美选择。

从概念上讲,您可以使用 Spring 或橡皮筋​​将点连接到目标点。 Spring 被阻尼,因此您不会“弹跳”。您可以通过更改称为“SpringConstant”的常量来控制系统的 react 速度。这基本上就是这 block 弹性 Material 的强度。

基本上,您对位置施加两个力,然后随着时间的推移对其进行积分。第一个力是由 Spring 施加的力,Fs = SpringConstant * DistanceToTarget。第二个是阻尼力,Fd = -CurrentVelocity * 2 * sqrt( SpringConstant )。

CurrentVelocity 构成系统状态的一部分,可以初始化为零。

在每一步中,您将这两个力的总和乘以时间步长。这使您可以更改 CurrentVelocity 的值。再次将其乘以时间步长,即可得到位移。

我们将其添加到点的实际位置。

在 C++ 代码中:

float CriticallyDampedSpring( float a_Target,
float a_Current,
float & a_Velocity,
float a_TimeStep )
{
float currentToTarget = a_Target - a_Current;
float springForce = currentToTarget * SPRING_CONSTANT;
float dampingForce = -a_Velocity * 2 * sqrt( SPRING_CONSTANT );
float force = springForce + dampingForce;
a_Velocity += force * a_TimeStep;
float displacement = a_Velocity * a_TimeStep;
return a_Current + displacement;
}

在系统中,我使用大约 5 的值是开始试验 Spring 常数值的好点。设置太高会导致 react 太快,设置太低会 react 太慢。

请注意,您最好创建一个保持速度状态的类,而不是必须将其一遍又一遍地传递给函数。

希望对您有所帮助,祝您好运:)

编辑:如果它对其他人有用,很容易将其应用于 2 或 3 维。在这种情况下,您只需为每个维度独立应用一次 CriticallyDampedSpring。根据您想要的运动,您可能会发现在极坐标(对于 2D)或球坐标(对于 3D)中工作会更好。

关于控制加速度直到到达某个位置的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100811/

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