第七章 Hard Constraints(强约束)
在上一章我们研究了弹力作为力生成元和多个对象互相影响的情况。这是我们第一次令物体基于力学地与其他物体互动。
虽然弹簧可以表示许多情况,但是它们也可以表现得很差。当我们想让我替紧紧地联结在一起,我们需要的弹力常数几乎是不可能模拟的。对于那些物体被硬的线条连接起来的情况,使用弹力不是一个可行的选择。
在这一章,我将会讲一下硬约束(hard constraints)。一开始我们将会研究最简单的硬约束—两个物体间的碰撞和接触。一样的数学可以使用在其他类型的硬约束,就像棒条体或者没有拉紧的电缆那种可以把物体连接在一起的物体。
为了在我们的物理引擎中去处理硬约束,我们需要离开舒服的力生成元世界。我们建立的引擎的所有处理硬约束的技术都与力生成元不同。在本书的最后,18章,我们将会看到所有单元的整合。
7.1 简单地碰撞处理
为了去处理硬约束,我们将会增加一个碰撞处理系统在我们的引擎中。在本书的这一部分,一个碰撞意味着两个物体有接触。在标准的英语中,我们可能会把碰撞这个单词理解成激烈地处理两个物体接近时有很大的相对速度的情况。我们的目标也差不多,但是两个物体只要有接触就可以看作碰撞,而且可以没有接近速度。我们处理高速物体碰撞也是使用同样的方法。这是一个有意义但需要调整的设想。为了避免术语替换,我会在本章中使用碰撞和接触交替使用。
当两个物体碰撞时,他们碰撞后的位移可以根据他们碰撞前的状态计算:这就是碰撞的处理。我们确定两个物体碰撞通过确定两个物体有正确的移动会造成碰撞。因为碰撞发生在很短的时间之内,我们直接控制每个物体的运动。
7.1.1 接近速度
控制着碰撞物体的法则由接近速度决定。接近速度就是当两个物体足够靠近的时候的速度。
注意虽然接近速度叫速度,而不是速率,但它是一个标量。速率没有方向,它们只有非负值。速度有方向。如果我们把向量代表速度的话,那么速度的方向就是向量的方向。但是如果我们使用标量,那么速率的方向就是由它的符号决定。例如,两个物体的分离的话,那么它们的接近速度的小于0
我们计算两个物体的接近速度通过它们的分量计算出它们相对的方向的速度。
Vc是一个接近速度(一个标量),Pa和Pb是a,b的位置,头上有个点的是标量乘,头上有个^的表示这个方向的单位向量。方程可以简化为
虽然这是一个惯例,但是去改变这个标量的符号是更加普遍的。使用接近速度,我可以再做一个分离速度。接近速度是一个两个物体间的相对速度,它们的方向指向对方。