我正在寻找一种平稳增加或减少圆周运动速度的方法。
使用圆的参数方程,我可以随时间移动一个圆形的物体:
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
这种方法的问题在于,如果我改变速度,那么半径将增大或缩小。这是有道理的,因为运动是相对于当前位置的,所以如果我改变速度,基本上会跳过时间。
我能想到的一个可能有效的实现是使用从对象指向圆心的向量。然后我可以通过使用垂直向量计算对象位置处圆的切线,对其进行归一化并按速度进行缩放。我还没有实现这个,因为对于像这样的问题似乎有些过分,所以如果存在更简单的解决方案,请告诉我。谢谢!
答案 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