Answers:
拉动电线的盒子会对电线施加张力。张力是一种力,以牛顿为单位。如果我们做一些简化的假设(导线和环境之间没有摩擦),那么沿着导线的所有点的张力都是相同的。
如果我们认为您的示例是静态的,那么电线上的张力就是盒子的重量:
T = m * g
其中,m是盒子的质量,g是由于重力引起的加速度(即9.8 m / s ^ 2)。请注意,这仅在静态情况下有效,请参见下文,以了解如何在动态情况下进行计算。
这样,导线中每个弯曲处的力就只是张力在相关方向上的投影。例如,弹簧对象尖端的力是沿接触法线的力,其大小为:
F = T * cos(angle between wire and contact normal)
在这种情况下,接触法线方向将是线段之间角度的二等分。第二个标记点对环境的作用力无关紧要,因为它不会对张力或其他任何影响。
现在,在动态情况下,拉力只是施加在盒子上的约束力,以使其保持与电线的连接。因此,如果物理引擎是基于脉冲的,那么张力就是:
T = impulse / timestep
这也导致了将电线缠绕在环境周围的通用算法。重要的属性是导线的总长度。仅需要模拟最后一个段,可以将所有较早的段视为固定的。因此,最后一段的长度是已知的,只需从总长度中减去较早段的长度即可。然后,最后一段可以是简单的弹簧约束。然后,只要在与环境相交时分割线段,就可以在弯曲变直时将其删除。
F = T * cos(angle between wire and spring axis)
。到底是哪个角度?另外:我不认为(在模拟中)有一种明智的方法来使导线“知道”该对象上附着了弹簧。
我非常感谢您对这些基于电线的线程感到沮丧,这是一个很难解决的问题。我们从来没有使碰撞完美地进行,但是约束模拟绝对是可行且直接的。
导线约束实际上与常规距离约束几乎相同。对于具有n个线段的导线,您没有n + 1个约束点,而是有一个n + 1个线段,每个顶点有一个n + 1点–在端点处,雅可比行列式等于距离约束(即,类似于d / | d |,其中d是矢量对于内部节点,雅可比行列式类似于(a / | a |-b / | b |),其中a和b是从节点到相邻节点的向量。(对不起,我碰到这已经有几年了...)
您不能伪装为“只有最后一段是动态的”,因为在您的示例中,对象可以与其他段进行交互,但是您只需要在绳索的末端模拟质量-在内部绳索可以无质量。需要将在每个节点上计算出的约束冲激应用于在该节点上碰撞的对象。
以下是一些相关论文:
前三个相对较新,应该会有所帮助。底页的第75页描述了一个“多栏”约束,它实际上是一条导线。
祝好运 :)
雷甘