GAMES103课程笔记04-Rigid Body Contacts
这个系列是GAMES103:基于物理的计算机动画入门(GAMES 103: Intro to Physics Based Animation)的同步课程笔记。本课程是计算机动画的入门课程,着重介绍各种基于物理的动画仿真模拟技术。本节课主要介绍刚体的碰撞与接触。
Particle Collision
Signed Distance Function
空间中的曲面可以使用有向距离函数(signed distance function, SDF)来表示。根据距离函数

常见规则曲面的SDF如下图所示:

使用SDF来表示曲面的好处之一在于它可以高效地表示质点与多个曲面的位置关系。假设我们有3个曲面

换句话说我们只需要计算若干个距离函数就可以判断质点是否与曲面发生碰撞,这就为碰撞检测带来了便利。
当然需要说明的是当质点位于曲面并集构成的区域中

但是如果
Penalty Method
碰撞仿真的基本方法是利用SDF进行碰撞检测,当质点进入曲面内部时施加一个反方向的力来把它推出去,这样的方法称为penalty method:

施加推力时可以把它想象成弹簧,这样力的大小就和压缩的距离成正比,力的方向为

然而这样方法存在一个问题,当弹簧系数

Impulse Method
penalty method通过施加推力来模拟质点的碰撞行为,除此之外还可以直接修改质点的运动状态来实现碰撞仿真,这种方法称为impulse method。在impulse mothod中,如果检测到了碰撞首先要更新质点的位置,将它移动到曲面上:

接下来需要修改质点的速度,我们将速度分解为曲面法向和曲面切向两部分

Rigid Body Collision
Collision Detection
我们可以把刚体视为质点的集合,对刚体上的每个点进行遍历并分别进行碰撞检测来实现刚体的碰撞检测。尽管这种方法并不完美,当仍然可以得到不错的结果。

Collision Response by Impulse
假设我们检测到了点
我们可以利用质点的碰撞公式得到


此时
根据叉乘的性质,向量之间的叉乘可以表示为反对称矩阵和向量的乘法:
我们可以把更新后的速度表示为矩阵乘法的形式:
其中

对于刚体之间碰撞的情况也可以使用类似的方法进行求解:

Shape Matching
本节课最后介绍了使用shape matching来解决刚体碰撞问题的方法。和前面介绍过的方法相比,shape matching更多地使用了数学优化而非物理定律来处理碰撞问题。shape matching的思路是忽略刚体的约束,将刚体上的每个点视为独立的质点来求解,每个质点的运动状态更新后再施加刚体约束来得到刚体运动后的状态。

具体来说,假设刚体质心的位置

我们定义优化的目标函数为
即更新后质心的位置为所有质点的平均值。接下来考虑旋转,我们暂时忽略旋转矩阵的约束只把它当成通常的矩阵
然后对
从SVD的角度来看,极分解的可以理解为在进行第二次旋转前将物体旋转回初始的位置,这样线性变换

总结一下,使用shape matching来求解刚体碰撞问题的流程如下:

shape matching除了可以解决刚体运动外还可以处理布料、弹性体甚至流体的运动仿真。但需要注意的是shape matching很难处理摩擦的问题,因此shape matching比较适合摩擦力可以忽略的场景。