2015-10-15 109 views
1

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

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弹簧限制在特定的方向?

+0

我想出了这样的东西......基本上有两个弹簧:一个在y(侧向弯曲)和一个在x上,其中x/y系统旋转以匹配弹簧的法线。独立应用这些力,看看会发生什么。这意味着你需要另一个'k'来进行侧身弯曲,但我认为这很合理。 –

+0

在两个弹簧总是以直角连接?这是一个有趣的想法,但它可能(我不确定)与角度上的弹簧根本不同。例如,向上向右伸出一块木块的弹簧与向右伸出的弹簧相连接的弹簧不同,弹簧直接向上弹起 –

回答

2

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

要使系统旋转到所需的最终位置,还应该施加扭矩。最简单的方法是给蓝色重量正电荷和绿色重量负值,然后在方向(1,1)上施加恒定的外部磁场。这样两种电荷将形成偶极子,并且与外部场的相互作用将产生期望的转矩。

我不相处的JavaScript,但我试图根据您的初始代码here写东西。具有强度E的外部场施加在电荷q上的力是F = q * E,其中FE都是向量。通过调整qE,您可以控制偶极子在外场方向上的速度。

的力现在变成˚F = -k(| X | -d)(X/| X |)+ Q ë - B v

这可能具有不希望的副作用,即弹簧的最终长度将稍长于delta,其中delta = 2 * |q||E|/k。你可以通过减少弹簧的长度来调整。而且,这种方法存在一些小问题。即有两种平衡状态:一种偶极子面向场方向(稳定平衡),另一种偶极子面向相反方向(不稳定平衡)。模拟的初始步骤中的一点随机噪声将防止偶极子陷入后一状态。

+0

这似乎不起作用,并且有点混乱。你可以看到我在一个更新的例子中尝试了你的公式。http://codepen.io/andrewray/pen/JYregB?editors=001'pos2 = addVectors(node1.offset,multiplyScalar(spring.direction,1/spring.length)) ,' –

+0

你似乎已经改变了计算力的代码。我所描述的是如何生成初始位置,因此应该在'randomizePointPositions()'中。或者可能是我没有正确理解你的问题。你想从完全随机的初始位置开始,让弹簧系统最终朝向所需的方向吗?考虑到单独的弹簧力,这是不可能的,除非初始配置已经与该方向对齐。 –

+0

是的,我想从完全随机的初始位置开始,并且将弹簧的力量解析为特定的方向。 –