- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个移动点(在一维空间),我需要它平滑移动。所以我认为它的速度必须是一个连续函数,我需要控制加速度然后计算它的速度和位置。
算法对我来说似乎不是很明显,但我想这一定是一个常见问题,我只是找不到解决方案。
注意事项:
最佳答案
这是使用“临界阻尼 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/
我想计算正在行驶的车辆的加速度。到目前为止,我能够使用以下公式获得沿航向矢量的加速度 a = (velocity(now)-velocity(previous))/time m/s^2 示例:一辆汽车
网站上修改后的滚动行为是如何制作的?正如您在示例中看到的那样,我想完成加速滚动行为。所以你以一定的速度滚动,当你放手之后,页面会自行滚动一点,减速并停止。 不幸的是,我绝对没有根据为您提供代码,希望您
我想使用标准操作(CCMoveBy 和 e.t.c)创建一个具有轨迹的可见对象,类似于: x = sin(y) 我的代码: CCMoveBy *moveAction1 = [CCMoveBy acti
问题是我的鼠标速度和加速度太高,系统设置(Ubuntu)完全没用,所以我需要一个外部工具/技巧来调整它。 那么,如何在不手动执行命令的情况下在启动时绝对减慢鼠标速度? xinput list 的输出是
我是一名优秀的程序员,十分优秀!