> For the complete documentation index, see [llms.txt](https://okzkx.gitbook.io/blogs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://okzkx.gitbook.io/blogs/game-tech/engine/model/animation/games103-ji-yu-wu-li-de-ji-suan-ji-dong-hua-ru-men/4.rigid-contacts.md).

# 4.Rigid Contacts\_冲突文件\_zkx\_20240828215918

#### 刚体碰撞

* 基于物理
* 基于 shape matching

#### Topic

* Particle Collision Detection and Response
  * Penalty methods
  * Impulse methods
* Rigid Collision Detection and Response by Impulse
* Shape Matching

#### Signed Distance Function

计算一个点在某个区域的内侧外侧，以及到区域边缘的距离

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081121583.png)

常用的 3D SDF Example

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081123091.png)

**复杂的 SDF**

扇形，布尔操作，三个距离函数相交，与操作

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081140815.png)

* 内侧只需要知道 max
* 外侧不需要知道值

或操作

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081336245.png)

#### Penalty 的方法

Quadratic Penalty Method 二次碰撞方法

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081351629.png)

穿透产生了才产生碰撞和反向力，可能会导致 Artifact 穿模

预先加上一层外部偏移

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081353116.png)

可能会产生

* k 太小，还是穿模
* k 太大，overshooting

使用 Log-Barrier Penalty Method 来定义 k 的大小

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081418153.png)

可以保证粒子永远不会穿透表面

#### Impulse Method 脉冲法

假定点是立刻更新的，利用方向和距离得到点的更新

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081430654.png)

速度也要更新

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081431098.png)

u 弹性系数，a 摩擦系数 a 的计算遵循库仑定律，另外希望 a 足够小

算 a 是算动摩擦和静摩擦，取较大值 静摩擦看作无穷大的摩擦力能让物体停下来

可以比较精确的控制反弹的位置

对每个点检测

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081442770.png)

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081443863.png)

只需要修改整个刚体的速度和角速度

碰撞点对刚体的速度和角速度做出贡献，然后再反推回每个点当前的速度

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081447221.png)

叉乘可以写作矩阵形式，要先把左边的向量写成叉乘矩阵

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081455975.png)

点 i 的速度对于冲量的变化

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081459914.png)

速度更新算法

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081512687.png)

细节

* 多点碰撞，用多点的平均值
* 重力导致物体反复震荡 （oscillation），用衰减 u 的方式来 hack 避免抖动问题
* 不更新位置，因为是一个非线性问题

#### Shape Matching

假设每个点没有互相的约束，也就没有力矩角速度这些。 模拟完再重新组合成原本的约束，

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081549103.png)

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081554118.png)

c 是质心，argmin 是取得函数中的最小值 希望所有的 xi 与 yi 足够接近

优化问题本质上是一阶导 = 0，假设质心是 0 点，那么所有点的向量的求和为 0

刚体是没有本地形变，本地缩放的，所以可以省掉一些矩阵运算

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081626944.png)

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081628142.png)

* 容易和多种模拟相结合
* 难以实现多种约束
* 对模拟精度要求不高

![image.png](https://image-1253155090.cos.ap-nanjing.myqcloud.com/202306081631296.png)
