Javascript spring physics:将方向向量应用于spring

时间:2015-10-15 07:45:27

标签: javascript math physics

我在Javascript中实现了弹簧物理,灵感来自this blog post。我的系统使用胡克定律公式计算弹簧力:

F = -k(|x|-d)(x/|x|) - bv

我制作了a CodePen,显示了两点之间弹簧的实现。 CodePen有两个由弹簧连接的点,每2秒点位置是随机的。你可以看到弹簧上的点反弹。

如果你看一下这个来源,你可以看到我为我的春天定义了一个方向向量:

var spring = {
    length: 100,
    direction: {
        x: 1, y: 1
    }
};

我正努力让春天永远“朝这个方向”解决。换句话说,我希望春天永远“向上”指向右边。如果这是在CodePen中实现的,则意味着点的静止方向始终是左下角的绿点,而右上角的蓝点。无论点在哪里开始,它们都应该以下面的方向结束(与方向矢量匹配):

Spring Hell

我尝试将法线乘以弹簧矢量:

norm1 = multiplyVectors( normalize( sub1 ), spring.direction ),

然而,这是一个noop,因为向量是(1,1)。我已经在这个系统上乱了几天了,而且我被卡住了。我怎样才能将我的2d弹簧限制在特定的方向?

1 个答案:

答案 0 :(得分:2)

弹簧力就像重力一样中心,这意味着系统的总角动量是守恒的。由于您从零初始速度开始,系统的角动量最初为零。弹簧相互作用将其保持为零,因此弹簧的最终方向等于其初始方向 - 重量仅沿连接它们的线移动。

要让系统旋转到所需的最终位置,您还应该施加扭矩。最简单的方法是将蓝色权重设为正电荷,将绿色权重设为负值,然后在方向(1,1)中应用恒定的外部字段。这样两个电荷将形成偶极子,与外场的相互作用将产生所需的转矩。

我与JavaScript不相处,但我尝试根据您的初始代码here编写内容。强度为E的外部字段对费用q施加的力为F = q * E,其中FE都是向量。通过调整qE,您可以控制偶极子在外场方向上的定向速度。

力现在变为 F = -k(| x | -d)( x / | x |)+ q E - b'强> v

这可能会产生不良副作用,即弹簧的最终长度会稍长delta,其中delta = 2 * |q||E| / k。您可以通过减少弹簧的长度来调整它。此外,这种方法存在一些问题。即,存在两种平衡状态:一种是偶极子面向场方向(稳定平衡),另一种是偶极子面向相反方向(不稳定平衡)。模拟的初始步骤中的一些随机噪声将阻止偶极子陷入后者状态。