Homework1 Eulerian Fluid Simulation -- smoke

使用Taichi 实现了一个基础的三维烟雾模拟器,基本是按照第四课的内容,包括了Advection 和 Projection。

  • Advection
    代码中的advection 有Semi-Lagrangian 和 BFECC,但是BFECC的Clipping部分作用于向量时会出错,目前还未解决,所以我对速度场使用了Semi-Lagrangian方法,对density场使用了BFECC。

  • Projection
    Projection部分主要参考了案例 stable_fluid.py, mgpcg.py和mgpcg_advanced.py。
    我代码中的线性系统求解方法为 Jacobi iteration, red-black Gauss-Seidel, Conjugate gradients, Multigrid preconditioned conjugate gradients。 前两个比较简单,后两个主要参考了案例的写法,还得加深理解。
    其中Jacobi iteration 在迭代次数少的时候(如下图,5次迭代),烟雾形态比较模糊。而Gauss-Seidel在同样迭代次数少的情况下更准确。


    Conjugate gradients方法在不用 preconditioner 的情况下收敛很慢,所以迭代次数少的时候形态会有较大差异。使用Jacobi preconditioner 的情况简单试了一下,没有太大差异。而使用Multigrid preconditioner 的效果却很惊人,在迭代十多次的时候就已经收敛了,而且就算只用5个iteration,最后的结果也非常好,和15次的几乎一样。

  • 其它
    我的模拟精度是160X256X160,dt 为0.04, 测试中发现dt大于0.07左右就会有Artifact 产生,当然这与初始发射源和速度的设置是有关系的。

视频地址
作业地址

8 个赞

更新了一下BFECC 和 Advection Reflection.

3 个赞

我学习了您的这个项目但是卡在了渲染这,我得到了ply文件该怎么进行渲染呢

你好,我是使用Houdini渲染的,Houdini支持PLY文件,只是要将点转换成体积。

一般ply格式是用于存储顶点网格模型的,据我所知不论houdini还是blender,都使用vdb格式作为体积格式……所以,你或许需要用到pyopenvdb来转换格式(注意:他们只支持docker里用)。

点转到体积的方式可以直接在Houdini中实现,以下是我的做法

感谢您的分享!我看到您smoke_3D.py的两个bfecc的advection里面,是不是算x2那行最后的coord[2]应该是coord2[2]?