Performance 改变圆周运动的速度

Performance 改变圆周运动的速度,performance,simulation,physics,geometry,Performance,Simulation,Physics,Geometry,我正在寻找一种方法来平稳地增加或减少圆周运动的速度 使用圆的参数方程,我可以随时间移动圆中的对象: x = center_x + radius * sin(time * speed) y = center_y + radius * cos(time * speed) 这种方法的问题是,我不能简单地做speed=speed+1来加速对象,因为它会导致不平稳的运动。这是有意义的,因为x和y值是基于绝对值而不是相对于对象的上一个位置在每一帧重新计算的 另一种方法可能是使用表示对象速度的向量,然后对向

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

使用圆的参数方程,我可以随时间移动圆中的对象:

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
这种方法的问题是,如果我改变速度,半径就会增大或减小。这是有意义的,因为移动是相对于当前位置的,所以如果我改变速度,时间基本上被跳过


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

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

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

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

如果lastTime必须保持最后一个循环的时间,了解吗?

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

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

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

如果lastTime必须保留最后一个循环的时间,请理解?

如果您只是在执行
speed=speed+1
,那么您没有正确使用加速度。更一般地说,您希望这样做:

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

此外,加速度=1是一个相当大的角速度变化弧度-尝试一个较小的值,比如说
PI/16
。如果您需要如此大的加速度,并希望最小化急促运动的可见性,您可能需要尝试使用一些运动模糊。

如果您只是简单地执行
speed=speed+1
,那么您没有正确使用加速度。更一般地说,您希望这样做:

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

此外,加速度=1是一个相当大的角速度变化弧度-尝试一个较小的值,比如说
PI/16
。如果您需要如此大的加速度,并希望将急促运动的可见性降至最低,您可能需要尝试使用一些运动模糊。

您需要从角速度的角度考虑这一点。
你将角度θ计算为时间*速度,如果速度是传统意义上的速度,也就是距离/时间,这是没有意义的。角速度是角度/时间(即弧度/秒或度/秒)。传统速度是应用角速度后起点和终点/时间之间的距离。

您需要根据角速度来考虑这一点。
你将角度θ计算为时间*速度,如果速度是传统意义上的速度,也就是距离/时间,这是没有意义的。角速度是角度/时间(即弧度/秒或度/秒)。常规速度是应用角速度后开始点和结束点/时间之间的距离。

要平稳增加角速度,需要添加角加速度

x=半径*cos(θ)
y=半径*sin(θ)

θ(t)=θ(0)+ω(0)*t+0.5*α*t^2


式中,t是时间,θ(0)是时间0的角位置,ω(0)是时间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
x=半径*cos(θ)
y=半径*sin(θ)

θ(t)=θ(0)+ω(0)*t+0.5*α*t^2

其中t是时间,θ(0)是时间0的角位置,ω(0)是时间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
偏移量
可以从0或任何值开始。。。它用于保持连续性,如

time * old_speed + old_offset == time * new_speed + new_offset
偏移量
可以从0或任何值开始。。。它用于保持连续性,如

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

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

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

对于恒定的角加速度,你可以说

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

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

然后你们可以用角的正反方向来计算你们的卡瑟斯位置


角加速度可以(相当)离散地变化。

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

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

对于恒定的角加速度,你可以说

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

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

然后你们可以用角的正反方向来计算你们的卡瑟斯位置

角加速度可以(相当)离散地变化。

使用

time * speed
指出圆圈已经走了多远是错误的。只有在速度不变的情况下才有意义

相反,你需要停止