代码之家  ›  专栏  ›  技术社区  ›  Kai

改变圆周运动的速度

  •  1
  • Kai  · 技术社区  · 15 年前

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

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

    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 回复  |  直到 6 年前
        1
  •  6
  •   tekBlues    15 年前

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

    delta = time - lastTime
    angle = angle + delta * speed
    
    x = center_x + radius * sin(angle)
    y = center_y + radius * cos(angle)
    

    上一个周期的时间应该放在什么地方,明白吗?

        2
  •  4
  •   xtofl Adam Rosenfield    15 年前

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

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

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

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

    角度(t)=t *ACC/2+VEL [ t=0 ] *T+角 [ t=0 ] .

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

    角加速度 可以 变化很大。

        3
  •  3
  •   Not Sure    15 年前

    如果你只是在做,你就没有正确地使用加速度。 speed = speed + 1 . 一般来说,您希望这样做:

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

    此外,加速度=1是一个很大的角速度变化,以弧度为单位-尝试一个较小的值,例如 PI / 16 . 如果你需要这么大的加速度,并且想要最小化颠簸运动的可见性,你可以尝试使用一些运动模糊。

        4
  •  3
  •   Philip Waldron    15 年前

    为了使角速度平稳增加,需要增加角加速度

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

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

    式中,t是时间,θ(0)是时间0时的角位置,ω(0)是时间0时的角速度(等于速度参数),α是角加速度参数,您选择合适的参数。

        5
  •  2
  •   UncleO    15 年前

    使用

    time * speed
    

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

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

    其他人使用加速度的建议也很好。尝试一下

    v = v + a;
    d = d + delta * v;
    
    x = center_x + radius * sin(d)
    y = center_y + radius * cos(d)
    
        6
  •  0
  •   plinth    15 年前

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

        7
  •  0
  •   ephemient    15 年前
    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