我在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中实现的,则意味着点的静止方向始终是左下角的绿点,而右上角的蓝点。无论点在哪里开始,它们都应该以下面的方向结束(与方向矢量匹配):
我尝试将法线乘以弹簧矢量:
norm1 = multiplyVectors( normalize( sub1 ), spring.direction ),
然而,这是一个noop,因为向量是(1,1)
。我已经在这个系统上乱了几天了,而且我被卡住了。我怎样才能将我的2d弹簧限制在特定的方向?
答案 0 :(得分:2)
弹簧力就像重力一样中心,这意味着系统的总角动量是守恒的。由于您从零初始速度开始,系统的角动量最初为零。弹簧相互作用将其保持为零,因此弹簧的最终方向等于其初始方向 - 重量仅沿连接它们的线移动。
要让系统旋转到所需的最终位置,您还应该施加扭矩。最简单的方法是将蓝色权重设为正电荷,将绿色权重设为负值,然后在方向(1,1)
中应用恒定的外部字段。这样两个电荷将形成偶极子,与外场的相互作用将产生所需的转矩。
我与JavaScript不相处,但我尝试根据您的初始代码here编写内容。强度为E
的外部字段对费用q
施加的力为F = q * E
,其中F
和E
都是向量。通过调整q
和E
,您可以控制偶极子在外场方向上的定向速度。
力现在变为 F = -k(| x | -d)( x / | x |)+ q E - b'强> v 强>
这可能会产生不良副作用,即弹簧的最终长度会稍长delta
,其中delta = 2 * |q||E| / k
。您可以通过减少弹簧的长度来调整它。此外,这种方法存在一些问题。即,存在两种平衡状态:一种是偶极子面向场方向(稳定平衡),另一种是偶极子面向相反方向(不稳定平衡)。模拟的初始步骤中的一些随机噪声将阻止偶极子陷入后者状态。