用100多行代码写一个最简单的PBD软体模拟

taichi实现PBD软体模拟

这是一个用taichi实现的软体模拟小玩具。目的是为了测试PBD算法和理解PBD算法原理。因此代码非常简单。

Github代码

运行方法

安装taichi>=1.04

运行


python tiPBD.py

将展示结果为:

demo

也就是一个下落的斯坦福兔子

文件结构

总共3个文件:

  • tiPBD.py是主要逻辑。PBD算法在此文件。代码很短,只有130行左右。

  • mesh_data.py保存的是斯坦福兔子的模型。按照OBJ的格式保存为一个python字典。其中包括四个字段:顶点位置、四面体顶点连接关系、边顶点连接关系和三角表面顶点连接关系。

  • tiReadMesh.py是用来读入网格到taichi field当中的。主要使用pos保存顶点坐标,tet保存四面体顶点编号,edge保存边顶点编号,surf保存三角面顶点编号

关于tiReadMesh的详细用法,请参看

参考

主要参考自Matthias Muller的tenMinutePhysics

https://matthias-research.github.io/pages/tenMinutePhysics/

尤其是其第9讲和第10讲。这里也参考了他的代码实现。他的代码是使用javascript + THREE.js写的。我们将其改为taichi实现。

原理

PBD是Matthias Muller等人发明的基于位置的动力学。它的算法流程就三步:

  1. 根据外力和碰撞更新粒子,不考虑粒子间关系

  2. 根据粒子间关系的约束,修正粒子的位置

  3. 根据位置反向更新速度

实际上,本代码实现的是XPBD。它和PBD的区别很小,求解速度差不多,但是稳定性更好,并且支持更多类型的约束。

具体的可以参考这个博客

还应该参考Muller等人的原始论文。

5 个赞

@beidou 棒啊。

我想问下,你是用了一个shape,还是多个shape来建模变形体?

1 个赞