【问题标题】:JS - How can I implement gravity?JS - 如何实现重力?
【发布时间】:2013-07-13 23:10:42
【问题描述】:

如何实现重力?我做了这个:http://jsfiddle.net/X2XvC/5/,但所有点都只是跟随你的光标(这不是万有引力)。我听说过 Eulers 方法,但我不知道如何在我的代码中实现它。

我发现了什么:

void update(float dt)
{
    position += velocity * dt + acceleration * 0.5 * dt * dt;
    velocity += acceleration * dt;
}

【问题讨论】:

  • 您必须通过重力影响您的点“velocityY”值。每次迭代,“velocityY”必须变小一些(正数较小),并且数量本身必须随着时间的推移在每个点的基础上变大。想想真实重力的基本物理学:)
  • 我会看看我能做什么:)
  • 哦,请注意,由于网页上的坐标系是颠倒的,因此概念上的“负”速度实际上是正的!

标签: javascript math gravity numerical-methods


【解决方案1】:

正如 Pointy 已经建议的那样,您必须影响点的速度矢量。

重力是一种通过以下方式计算的力:

F_G = gamma * mass1 * mass2 / distance^2

其中gamma 是引力常数,mass1mass2 是物体的质量。您可以通过以下方式获得加速度:

F_G = a * mass1
a = F_G / mass1
  = gamma * mass2 / distance^2

您会看到加速度与移动物体的质量无关。剩下的是gamma * mass2,您可以将其设置为任意常量。哪个最能满足您的需求。

现在我们有了加速度向量的长度。方向当然是normalize(cursorPosition - pointPosition)。所以整体加速度为:

d = cursorPosition - pointPosition
a = constant * d / length(d)^3

知道了这一点,您可以通过以下方式更新点在每一帧中的速度和速度:

velocity += a * dt
position += velocity * dt

其中dt 是最后一帧的持续时间。

Here 是您更改后的示例代码。 if(distance < 6)... 线用于限制加速度(如果一个点移动通过重心,它会被无限加速)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多