A 3D Real Time Fluid Solver Demo (三維實時流體解算器)
最近對流體模擬(Fluid Simulation)很感興趣,參考Jos Stam的paper:Real-Time Fluid Dynamics for Games,擴充套件其2D solver,做了個簡單的3D fluid solver,模擬簡單的流體。Demo以及原始碼在這裡.
大話
實時流體模擬本是計算流體力學領域(CFD)的關心的事,工程人員為了通過計算機模擬獲得某種流體在特定條件下的有關資訊,如:流體的動量、熱量和質量等。由於工程上的精確性,所需的計算一般是很複雜的。後來,實時流體模擬又成了計算機圖形學(CG)的一個熱點問題,不過人家是為了模擬流體的外在形象。所需的計算無需很精確,強調的是視覺效果。如:模擬煙、火、雲彩、流水等,以滿足電影特效或者遊戲特效。
正文
我所關心的當然是CG中的流體模擬了,現實中能找的以及找不到的流體效果,都給我模擬出來,以假亂真,有趣!呵呵。在網上發現一些不同的演算法,被不同的大牛發現。大概有這幾種:
1.求解NSEs(拉格朗日法,尤拉法)
2.基於大規模資料取樣(快速傅立葉變換(FFT))
3.引數建模(線性波組合)
4...
其中,還是求解NSEs方法得出的結果較逼真,畢竟是基於物理模型的,但缺點是計算量大,而且計算結果有時不穩定,對時間步長敏感。想要實時很難。這方面Jos Stam是個人物,他將半拉格朗日演算法引入CG領域,求解NSEs,達到實時流體模擬。於是,找他的論文。好多,看到一篇Real-Time Fluid Dynamics for Games。好傢伙,Real Time的,不就是想要的麼。於是,看了下,其實其核心是採用Gauss-Seidel relaxation方法解線性方程組,收斂快而且穩定.詳細的描述見:http://www.dgp.toronto.edu/people/stam/reality/Research/pdf/GDC03.pdf.
由於原文是針對2D的情況,於是我自己試著寫了個3D的,純屬好奇,未作什麼優化,速度一般。渲染部分隨便弄了個alpha混合,估計用體渲染法(volume rendering)效果好點。最後渲染出來在我的舊本本上(cpu 1.4GHz),grid size為16*16*16的情況下FPS為14左右,桌上型電腦(cpu 2.6GHz)為32左右,如果想要更好的效果,需增大grid size,當然FPS肯定會下降.
Demo
1.Grid size = 16*16*16, diff = 0, visc = 0 (散射係數=0,粘滯係數=0)
2.Grid size = 32*32*16, diff = 0.00001, visc = 0.000001