Practical Animation of Liquids 筆記
這篇文章講的是液體的模擬,液體不同於煙霧的地方在多了一個液麵的概念。這個液麵可能是一些比較光滑、連續的流體液麵,也可能是一些飛濺的小液滴或霧氣。除此以外,整體的演算法跟煙霧模擬沒有太大的區別。這裡重點作一下液麵的筆記。
對於液麵來說,我們希望通過傳統的圖形學方法去繪製它。這裡用到了一種粒子和網格的混合方法:
一、粒子法
1、首先,在網格中隨機放入一些粒子,通過線性插值的方法,根據速度場 u 計算粒子的速度。我們希望通過粒子生成一個三角面片構成的曲面,該曲面是平滑的,沒有不可導點,即一些突變的、尖銳的地方。這些粒子生成在一個包含於NS網格的次級網格中。
2、接下來通過一個函式生成等高面,進而生成液麵。說白了就是把這些粒子轉換成一個有體積的球體。對處於xp處的粒子而言,該函式為:
其中r為半徑。
3、對次級網格的每個網格頂點,用與之最近的粒子求該頂點的Φ值,接下來用marching cube演算法,根據Φ的值生成各cell的等勢面。Φ大於零表示在零勢面外,反之則在零勢面內。
4、此時各cell的等勢面相連,其實就是液麵,但這個液麵還有一些尖銳的地方。接下來平滑它。
5、對網格邊線上的Φ,迭代次數η:
其中:
經過幾次迭代後實現平滑。用root finder演算法求解零勢面。
6、至此粒子法的過程基本完成。但存在一些問題,如零勢面附近粒子可能太多,但實際不需要這麼多粒子;又或者粒子即使處於液體內部對液麵無貢獻,也依然需要存在和計算。因此,我們在建立粒子時同時構建Φ場,直接通過速度場來控制Φ的流動。
二、網格法
1、接上。已經說過,最直觀的方法是用粒子直接組成表面,但這樣有種種問題,處理起來顯得比較繁瑣。所以這裡引入一個level set方法。追蹤Φ流動的公式是:
2、網格法的不足之處在於對細節的表現力比較差, 因為一些細微的地方可能在解算過程中迭代幾遍就沒了;粒子法則相反,但需要耗費更多的資源。結合粒子法。先推算Φ場和粒子,在零勢面內的無貢獻粒子可以刪除,近表面的、附近稀疏的地方,適當填補粒子。
3、對於表面粒子,區域性插值求曲率
對於k較小的地方,忽略粒子,用level set方法表示該平滑面。對於k較大的地方,也就是一些細節變化較多的地方,比如飛濺面,我們允許粒子修改Φ。
4、另外還有少量粒子飛濺出液體外部的情況。