Javascript spring 物理学:将方向向量应用于 spring
Javascript spring physics: Apply direction vector to spring
我在 Javascript 中实施 spring 物理,受到 this blog post 的启发。我的系统使用胡克定律公式计算 spring 力:
F = -k(|x|-d)(x/|x|) - bv
我制作了 a CodePen,显示了两点之间 spring 的实现。 CodePen 有两个由 spring 连接的点,每 2 秒点位置随机化一次。您可以看到 spring 上的点相互反弹。
如果你查看源代码,你会发现我已经为 spring:
定义了一个方向向量
var spring = {
length: 100,
direction: {
x: 1, y: 1
}
};
我正在努力做到 spring 总是 "resolves" 这个方向。 换句话说,我想要 spring 始终 "pointing" 向上和向右。如果这在 CodePen 中实现,则意味着点的静止方向将 始终是左下角的绿点和右上角的蓝点 。无论点从哪里开始,它们都应该以以下方向结束(与方向向量匹配):
我试过将法线乘以 spring 向量:
norm1 = multiplyVectors( normalize( sub1 ), spring.direction ),
然而这是一个空洞,因为向量是 (1,1)
。几天来我一直在破解这个系统,但我被困住了。如何将 2d spring 约束到特定方向?
Spring 力就像重力一样位于中心,这意味着系统的总 angular 动量是守恒的。由于您从零初始速度开始,系统的 angular 动量最初为零。 spring 交互使它保持为零,因此 spring 的最终方向等于其初始方向 - 权重仅沿着连接它们的线移动。
要让系统旋转到所需的最终位置,您还应该施加扭矩。最简单的方法是给蓝色权重带正电荷,给绿色权重带负电荷,然后在 (1,1)
方向施加一个恒定的外场。这样两个电荷就会形成偶极子,与外场的相互作用会产生所需的扭矩。
我和 JavaScript 合不来,但我尝试根据您的初始代码写一些东西 here。强度为E
的外场对电荷q
施加的力为F = q * E
,F
和E
均为矢量。通过调整 q
和 E
,您可以控制偶极子在外场方向上的定向速度。
力现在变为 F = -k(|x|-d)(x/|x|) + qE - bv.
这可能会产生不良副作用,即 spring 的最终长度会略长 delta
,其中 delta = 2 * |q||E| / k
。您始终可以通过减少 spring 的长度来对此进行调整。此外,这种方法还有一个小问题。即,存在两种平衡状态:一种是偶极子朝向场的方向(稳定平衡),另一种是偶极子朝向相反的方向(不稳定平衡)。在模拟的初始步骤中加入一点随机噪声将防止偶极子陷入后一种状态。
我在 Javascript 中实施 spring 物理,受到 this blog post 的启发。我的系统使用胡克定律公式计算 spring 力:
F = -k(|x|-d)(x/|x|) - bv
我制作了 a CodePen,显示了两点之间 spring 的实现。 CodePen 有两个由 spring 连接的点,每 2 秒点位置随机化一次。您可以看到 spring 上的点相互反弹。
如果你查看源代码,你会发现我已经为 spring:
定义了一个方向向量var spring = {
length: 100,
direction: {
x: 1, y: 1
}
};
我正在努力做到 spring 总是 "resolves" 这个方向。 换句话说,我想要 spring 始终 "pointing" 向上和向右。如果这在 CodePen 中实现,则意味着点的静止方向将 始终是左下角的绿点和右上角的蓝点 。无论点从哪里开始,它们都应该以以下方向结束(与方向向量匹配):
我试过将法线乘以 spring 向量:
norm1 = multiplyVectors( normalize( sub1 ), spring.direction ),
然而这是一个空洞,因为向量是 (1,1)
。几天来我一直在破解这个系统,但我被困住了。如何将 2d spring 约束到特定方向?
Spring 力就像重力一样位于中心,这意味着系统的总 angular 动量是守恒的。由于您从零初始速度开始,系统的 angular 动量最初为零。 spring 交互使它保持为零,因此 spring 的最终方向等于其初始方向 - 权重仅沿着连接它们的线移动。
要让系统旋转到所需的最终位置,您还应该施加扭矩。最简单的方法是给蓝色权重带正电荷,给绿色权重带负电荷,然后在 (1,1)
方向施加一个恒定的外场。这样两个电荷就会形成偶极子,与外场的相互作用会产生所需的扭矩。
我和 JavaScript 合不来,但我尝试根据您的初始代码写一些东西 here。强度为E
的外场对电荷q
施加的力为F = q * E
,F
和E
均为矢量。通过调整 q
和 E
,您可以控制偶极子在外场方向上的定向速度。
力现在变为 F = -k(|x|-d)(x/|x|) + qE - bv.
这可能会产生不良副作用,即 spring 的最终长度会略长 delta
,其中 delta = 2 * |q||E| / k
。您始终可以通过减少 spring 的长度来对此进行调整。此外,这种方法还有一个小问题。即,存在两种平衡状态:一种是偶极子朝向场的方向(稳定平衡),另一种是偶极子朝向相反的方向(不稳定平衡)。在模拟的初始步骤中加入一点随机噪声将防止偶极子陷入后一种状态。