改变圆周运动的速度

时间:2009-06-03 19:23:31

标签: performance simulation physics geometry

我正在寻找一种平稳增加或减少圆周运动速度的方法。

使用圆的参数方程,我可以随时间移动一个圆形的物体:

x = center_x + radius * sin(time * speed)
y = center_y + radius * cos(time * speed)

这种方法的问题在于我不能简单地speed = speed + 1来加速对象,因为它会导致不稳定的移动。这是有道理的,因为基于绝对值而不是相对于对象的先前位置,每帧重新计算x和y值。

另一种方法可能是使用表示物体速度的矢量,然后将矢量应用于矢量:

v_x = radius * sin(time * speed)
v_y = radius * cos(time * speed)
x = x + v_x
y = y + v_y

这种方法的问题在于,如果我改变速度,那么半径将增大或缩小。这是有道理的,因为运动是相对于当前位置的,所以如果我改变速度,基本上会跳过时间。

我能想到的一个可能有效的实现是使用从对象指向圆心的向量。然后我可以通过使用垂直向量计算对象位置处圆的切线,对其进行归一化并按速度进行缩放。我还没有实现这个,因为对于像这样的问题似乎有些过分,所以如果存在更简单的解决方案,请告诉我。谢谢!

7 个答案:

答案 0 :(得分:6)

速度是角度的变化率,速度的变化仅影响最后一个间隔的角度变化,因此:

delta = time - lastTime
angle = angle + delta * speed

x = center_x + radius * sin(angle)
y = center_y + radius * cos(angle)

其中lastTime必须保持最后一个周期的时间,明白吗?

答案 1 :(得分:4)

你自己说过:你想改变角速度。现在,角度速度的变化在现实世界中受到物体的角度惯性的限制。这意味着它不能以1为步骤进行“离散”。

相反,角速度是角加速度的积分。角度位置是角速度的积分。

因此,对于恒定的角加速度,您可以说

速度(t)= t * acc + vel [t = 0]

angle(t)= t 2 * acc / 2 + vel [t = 0] * t + angle [t = 0]

然后你可以用角度的sin和cos来计算你的位置。

角加速度 可以(非常)离散地变化。

答案 2 :(得分:3)

如果你只是做speed = speed + 1,那么你没有正确使用加速度。更一般地说,你想要这样做:

accel = 1;
speed = speed + (accel * timeDelta);

此外,accel = 1是弧度中相当大的角速度变化 - 尝试较小的值,比如说PI / 16。如果您需要加速度那么大并且想要最小化不稳定运动的可见性,您可能想尝试使用一些运动模糊。

答案 3 :(得分:3)

为了平滑地增加角速度,您需要添加角加速度

x = radius * cos(theta)
y = radius * sin(theta)

theta(t)= theta(0)+ omega(0)* t + 0.5 * alpha * t ^ 2

其中t是时间,theta(0)是时间0处的角位置,omega(0)是时间0处的角速度(将等于你的速度参数),alpha是角加速度参数,你是选择合适的东西。

答案 4 :(得分:2)

使用

time * speed

表示圆圈行进的距离是错误的。只有速度永远不会改变才有意义。

相反,您需要存储变量中行进的距离,然后根据当前速度和自上次绘制以来的时间间隔将变量增加一个量。

其他人必须使用加速的建议也很好。尝试像

这样的东西
v = v + a;
d = d + delta * v;

x = center_x + radius * sin(d)
y = center_y + radius * cos(d)

答案 5 :(得分:0)

你需要根据角速度来考虑这个问题。 你正在计算角度θ,作为时间*速度,如果速度是传统的速度感,即距离/时间,这是没有意义的。角速度是角度/时间(即弧度/秒或度/秒)。常规速度将是应用角速度后起点和终点/时间之间的距离。

答案 6 :(得分:0)

x = center_x + radius * sin(time * speed + offset)
y = center_y + radius * cos(time * speed + offset)

def change_speed(new_speed):
    offset = time * (speed - new_speed) + offset
    speed = new_speed

offset可以从0开始,或者实际上是任何值...它用于保持连续性,如

time * old_speed + old_offset == time * new_speed + new_offset