论文《Detailed Rigid Body Simulation with Extended Position Based Dynamics》的复现(使用taichi)
论文阅读笔记在这里
想要实现的功能(期望达到的效果): 使用taichi实现一个通用的基于XPBD的刚体求解器,能够处理刚体之间的接触,各种关节以及与软物体的相互作用。
- 功能一:实现论文中提到的两个核心的投影操作
- 功能二:处理铰链关节,球状关节以及移动关节,并限制其自由度(关节约束,距离约束)(关节约束还有些问题卡着,待后续完善)
- 功能三:完成刚体碰撞检测(做不了啦。abandon)
- 功能四:能够自然处理刚体间的接触与摩擦(碰撞约束)
使用这个刚体求解器实现一些简单的场景(场景在设想,目前采取论文中的实验:
场景应该是最后实现了单,双,三摆场景
-
简单场景:很多刚体盒子(或者兔子)叠在一起(需要碰撞检测,adandon)
-
摆动场景:实现双摆和三摆,甚至闭环摆,类似下图(场景就是这个)
-
链条悬挂:100只兔子组成的链条悬挂在天花板上的模拟,类似下图(abandon)
-
弹珠场景:在电线上的弹珠滑下后与其他弹珠的碰撞的情况,类似下图(abandon)
实现的类:
-
Quaternion:四元数
- 四元数函数
-
Transfrom类(ti.dataclass):用于表示刚体与关节的欧式变换,
- 位置,缩放(世界):3D vector
- 旋转(世界):四元数
-
Entity类(ti.dataclass):用于表示实体(表示用于solver的数据)
- 成员:逆质量,逆转动惯量,transfrom(当前,上一帧),速度,角速度,静摩擦系数,动摩擦系数,修复系数,
- 函数:应用位置修正,应用旋转修正,应用速度修正,获取广义逆质量等
-
Model类型(ti.data_oriented):加载3D模型(目前加载obj模型)
-
Rigiboody类(ti.data_oriented): 包含一个Model 以及 一个Enitiy
-
Constarint类(ti.dataclass):用于表示需要进行约束:
- 位置约束:最大位置
- 碰撞约束:碰撞点(两个刚体上),碰撞法线
- 关节约束:固定关节,铰链关节,球状关节
最后求解器是分别对他们进行求解
-
XPBD Solver类(ti.data_oriented):用于对刚体模拟进行求解
- 对需要进行碰撞检测的物体生成一个AABB(世界坐标)(用于碰撞检测
- Broad-Phase: 动态生成潜在的碰撞对(potentail collision pair)
- Narrow-Phase: 碰撞检测,若检测到物体发生碰撞,生成对应的接触的法线以及在两个物体上的接触点
目前打算使用的TAICHIGAME的开源库进行碰撞检测,但是他有个问题计算太慢了(没有采用taichi加速)
pip install -r requirements.txt
按照目前的复现的,目前提供了两个场景:
由于笔者采用GS迭代,但是又没有实现并行化版本的GS,在多个约束或者多次迭代时候很多概率约束求解不正确,目前场景提供的标准的numsubStep=5时是效果最好的。(CPU并行)
CPU:i7-12700H
GPU:NVIDIA GeForce RTX 3070 Laptop GPU
numSubStep=5 | numSubStep=10 | |
---|---|---|
Boxes(CPU) | 80FPS | 60FPS |
Boxes(GPU) | 43FPS | 30FPS |
Three pendulum(CPU) | 60FPS | 48FPS |
Three pendulum(GPU) | 35FPS | 24FPS |