首发于图形之道

十余个用Taichi实现的(半)隐式时间积分器

不知不觉GAMES 201课程也过去一半了,我们的作业1(线性系统求解)也在昨天截止了。不得不说作业1的难度还是不小的。不少同学都反映实现推隐式弹簧质点系统的时候推公式推的“头都秃了”。尽管如此,在有限的时间和不小的挑战下,还是有很多优秀作品浮出水面。在助教童鞋的激烈讨论下,我们在提交的作品中选出了十余个获奖作品。

在计算机图形学中,高性能线性系统求解是非常重要的工具,因此我们专门开辟了作业1作为给大家的练习,要求solver里面用到线性系统求解。没想到不少精益求精的同学们都用上了(几何)多重网格预条件共轭梯度法(Multigrid preconditioned conjugate gradients, MGPCG)求解线性系统,性能++++

下一次作业2又会回到作业0的开放模式,只要是物理引擎就可以提交。没有赶上评奖截止日期的同学们请不要灰心,相信你的作品经过接下来一个月的打磨,一定能够成为一份优秀的作业2提交。获奖的同学请再接再厉,这些作品在性能、效果方面继续提升以后可以作为作业2提交。

GAMES201的课程虽然大家都反映难度比预想的稍高,但是作为一门进阶课程,其内容还是获得了不少同学、专家的认可。比如,宾夕法尼亚大学 年均6篇SIGGRAPH 蒋陈凡夫教授的实验室直接将GAMES 201和Taichi编程语言作为计算机图形学Ph.D.招生前提条件,这样的认可让整个课程团队受到极大鼓舞。

蒋老师的招生简章,欢迎有志于攻读计算机图形学Ph.D.的同学申请!

由于作业均是用Taichi实现,只要安装了Taichi

python3 -m pip install taichi

就基本可以一键运行。欢迎大家下载优秀代码来研究!GAMES201的同学进行作业2的时候可以参考作业1。但是提交作业2时,不论是复制了别人的作业1的代码,还是仅仅参考了实现,都请在提交时注明,尊重他人劳动成果。

另外,为了解决直播卡顿的问题,以后主讲人(也就是我...)会用一台性能更好的台式机(而不是我的2013年老爷笔记本)直播。所以还是希望大家能够尽量来看直播呀!这样有问题及时提出来我们就能课上回答。有同学们的弹幕和反馈也能够让讲课的人随时调整难度。直播地址:webinar.games-cn.org 北京时间每周一晚8点30分。

获奖作品大赏 o(*≧▽≦)ツ

☯ 光滑粒子流体动力学 by mzhang [代码 论坛]

mzhang同学的PCISPH算法
mzhang同学的几种解法的对比

评语:mzhang同学实现了三种常见的SPH方法:Wesakly compressible SPH (WCSPH), Predictive-corrective incompressible SPH (PCISPH), Divergence-free SPH (DFSPH)。 视觉效果非常棒,代码也很工整,实验分析严谨。建议提升边界处理。固定边界建议采用boundary particle,DFSPH的自由表面也可以稍许提升一下。相关参考文献[SIGGRAPH Asia 2013] Versatile Surface Tension and Adhesion for SPH Fluids, [TOG 2015] Robust Simulation of Sparsely Sampled Thin Features in SPH-Based Free Surface Flows等


欧拉视角求解烟雾 by Timber [代码 论坛]

视频对比:

https://www.bilibili.com/video/BV1cK4y1x782?pop_share=1www.bilibili.com

评语:Timber实现了基于欧拉网格的流体模拟器, 采用了Jacobi、Red-black Gauss-Seidel、Conjugate gradients、MGPCG来求解Chorin式压力投影。渲染效果很棒,实验分析也很简洁、凝练。唯一美中不足是流体稍微有点粘,不知道是不是velocity field用了semi-Lagrangian advection而不是BFECC的缘故。建议尝试一下SIGGRAPH 2018的Advection-Reflection solver,很容易实现而且能够显著降低数值粘性(前提是所有物理量都用BFECC)。后面课程会提到的particle advection也可以了解一下 :-)

混合欧拉-拉格朗日法求解自由表面流体 by citadel [代码 论坛]

citadel的FLIP+MGPCG

评语:citadel同学不满足于Taichi的样例MGPCG实现只支持Open boundary,自己参考经典论文 A parallel multigrid Poisson solver for fluids simulation on large grids 实现了几何多重网格的加粗,这样就能模拟自由表面流体了。不可否认,整个系统要能搞work还是有不小的难度的(特别是边界条件的处理),这里必须点个赞!


分子动力学模拟 by victoriacity: [代码 论坛]

victoriacity同学的分子系统的模拟
victoriacity:“System of 10 polymer chains with 100 beads in each chain with a harmonic bond stretching potential, the equilibrium bond length between two beads is 1.54 Å and the simulation box length is 160 Å.“
这分析报告看起来真的非常专业了...

评语:victoriacity的分子动力学模拟用上了Forward Euler integrator、Verlet integrator (symplectic)、Backward Euler integrator、Implicit midpoint integrator (symplectic)四种不同的时间积分器。这份作业的选材非常独特,严谨性堪称典范。连我们助教团队在评选的时候都大呼“有意思,有意思!”我们不得不怀疑:victoriacity同学是不是在用Taichi做分子动力学科研,顺便跑来交了个作业1?


☯ 三维有限元模拟 by yucrazing [代码 论坛]

yucrazing的共轭梯度法3D FEM solver。Taichi中求解完成后在Blender中进行渲染。

评语:3D FEM的隐式实现还是挺有挑战的。yucrazing同学在实现了Jacobi和conjugate gradients方法,配合Taichi的PLY输出以及Blender的光线追踪渲染,模拟出了可爱的果冻效果。能够在“忙着入职和租房”的情况下还能做出这样高质量的结果和详细的分析报告,确实让人肃然起敬。如果要升级到作业2,可以考虑一下提高四面体数目来丰富模拟细节。另外,有限元系统的自碰撞也是很值得研究的话题,可以参考@Minchern 在SIGGRAPH 2020的大作:

Minchern:IPC: SIGGRAPH 2020开源有限元碰撞独家处理方案zhuanlan.zhihu.com图标


有限差分(FDM)热传导 (多重网格) by adam05 [代码 论坛]

基于Poisson的2D非稳态扩散求解器,模拟四周边界高温传导到内部低温的过程。采用隐式时间离散格式(Backward Euler)和MGPCG

评语:adam05同学基于有限差分格式、后向欧拉法、多重网格预条件和共轭梯度法编写了一套2D热传导求解器,代码工整、效果拔群。支持Neumann边界条件可能是一个不错的未来方向 :-)

布料模拟(x2)

linyaodong同学基于Taichi开发的OpenClothPy布料模拟器
archibate的布料模拟,使用了他创造的Taichi THREE软渲染器进行渲染

评语:布料模拟其实有很多讲究,两位同学的实现都非常棒。后续作业2可以考虑加上bending spring、self-collision等处理,这样能够模拟更加真实的布料。除了mass-spring,FEM、MPM也是模拟布料的好方法。一开始我们还有点担心结果的可视化会成为障碍,两位同学通过出色的工程能力向我们证明:不用担心了,我们都是分分钟就能用Taichi写出软渲染器的大佬...

弹簧质点 (x6)

g1n0st的实现
  1. woclass [论坛(含代码)]
  2. hakic [代码论坛]
  3. g1n0st [代码论坛]
  4. limengfan [代码论坛]
  5. JerryYan [论坛(含代码)]
  6. kphmd [论坛]

评语:弹簧质点系统的explicit实现非常容易,implicit实现却相当复杂,要写对还是要下点功夫。课上我们演示了explicit弹簧质点只需要几十行代码,估计不少同学因此入了弹簧质点的坑。真的推起公式、调试implicit solver来,才发现“头都秃了”:-) 当然,最后能够实现出来都是好样的。如要要升级到作业2,可以考虑一下改进样例代码中的指数衰减每个节点速度来做damping的方法,换成更科学的Rayleigh damping。另外,我们建议避免使用过于动态的test case来测试implicit solver的稳定性,那样不太容易看得出implicit的效果。接近quasi-static的case其实更能显示implicit solver的稳定性 :-)

鸣谢


感谢助教同学们的辛苦努力、Taichi核心开发组(特别是 archibate @幼儿园理化笙rexwangcck-ye @东半球吃货, xumingkuan)的大力支持、以及GAMES社区提供平台。

感谢woclass同学升级论坛。不少同学在论坛能够打出LaTeX公式,这都是woclass的功劳 :-)

感谢@张心欣 师兄为我们带来了精彩的客座讲座 (第5讲:Poisson方程与快速解法, 快速多极子, fast multipole method, FMM)

感谢后勤部同学为获奖同学定制、邮寄课程纪念品。收到纪念品的同学记得在群里晒图呀!那是对后勤同学的极大鼓舞。

最后,衷心感谢各位来听课、完成作业的同学。GAMES 201作为进阶课程,自然有一定难度。我作为主讲人,更多的时候扮演的只是一个“知识导游”的角色,真的动手实现起来,还是要投入不少功夫的。

借用一下第四讲结束以后某位同学在课程群里面发的图...

学习本来就是自我挑战的过程。一分耕耘,一分收获。相信在课程结束时,每一位同学都能写出自己满意的物理模拟器!:-)

编辑于 07-13

文章被以下专栏收录