1. 程式人生 > >流體模擬學習——基於物理的流體動畫

流體模擬學習——基於物理的流體動畫

基於物理的流體動畫

最近開始學習流體,這些天看了很多論文,一直來不及整理。正好今天是程式設計師節,忙裡偷閒釋出一下看論文時記的一點筆記。

基於物理方法的流體模擬,最經典的當然是Course notes的Fluid Simulation,但英文啃起來太難受了,搭配上師兄寫的基於物理的流體動畫綜述和研究中文書就好多了,雖然公式推導很不詳細(還是得看英文書),起碼把流體模擬是什麼東西瞭解個大概。

今天就先放一下中文書的筆記(注:小白筆記,如有錯請勿計較)。

1 流體動畫:精度低但計算速度快,獨立研究領域
流體渲染和繪製方法:
有清晰表面的流體(一般液體):圖形流水線(液體與空氣交界)、光線跟蹤
無清晰表面的流體(煙霧):密度場、光線步進法

2 Navier-Stokes方程組
質量守恆、能量守恆、牛二定律

Lagrange方法:連續->離散粒子(粒子法)
在這裡插入圖片描述
流體不可壓縮性
光滑粒子流體力學(SPH)
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
計算壓強項->保證流體不可壓縮

  • 傳統方法:理想氣態方程
  • 投影演算法
  • Tait方程

lagrange方法對計算資源要求較低->廣泛用於實時互動
lagrange方法很難進行液體表面跟蹤和重構

Eular方法:固定觀察點,考慮流體物理量在不同時刻的變化(網格法)
在這裡插入圖片描述
方法1標量記錄在網格中心,向量記錄在網格表面
方法2所有資料記錄在網格節點上
早期不直接處理方程組,而是假設和簡化->波動方程、淺水方程->缺點太過簡單
Eular法標準框架:
在這裡插入圖片描述


均一MAC網格

Lattice Boltzmann方法(LBM)
易於實現,著眼於微觀模型和力學方程
在這裡插入圖片描述
分為2步:流動步驟->碰撞步驟
流動步驟:按速度和方向傳遞至相鄰的網格
在這裡插入圖片描述

碰撞步驟:作用碰撞運算元(BGK)
在這裡插入圖片描述

三種方法比較:
Lagrange:
優點:容易理解和實現,對計算資源要求較低,適合遊戲以及其它需要實時互動的領域。
缺點:光滑核函式難以選取,無法嚴格保證流體的不可壓縮性,很難通過大量粒子重構光滑的液體表面
Eular:
容易重構光滑液體表面和較大時間步長,但計算時間長,擴充套件性差(可以自適應和混合減少計算)
MAC網格不能很好貼合不規則的物理邊界
四面體網格可以貼合,但計算量更大
Lattice Boltzmann:
優點:簡單易懂並容易並行,描述微觀
缺點:可擴充套件性差,時間步長有限制(為保證穩定性必須採用很小的時間步長)
在這裡插入圖片描述

3 流體現象分類
煙和雲:粘性可忽略,沒有清晰的自由表面,相對容易模擬
溼度,GPU加速,Lattice,旋度保持

火焰和爆炸:
火焰:焰心、外焰、黑煙
模擬多相流,基於過程的模擬方法
爆炸:徑向超音速衝擊波
先發光,衝擊波掃過地面造成擴張的灰塵,氣體和煙霧形成上升的火球

粘性、彈性和塑性流體:
不同區域不同粘滯係數:粒子系統模擬融化,點取樣網格
兼具流動特徵和彈性特徵:
粒子系統模擬,網格系統模擬,彈性張量,彈性項的旋轉

沙:
早期採用粒子系統;帶摩擦的塑性模型

小尺度流體:表面張力(水滴)
虛擬表面方法

氣泡和泡沫:
多相流模擬;網格與流體結合,SPH;簡化淺水方程;模組化程式設計解耦模擬沸騰;SPH模擬氣泡運動細節,Eular捕捉氣泡周圍水體運動;LBM
溼泡沫,幹泡沫

固-液耦合
固體速度->邊界條件,液體壓強的積分->計算受力;彈簧-質點模型表示固體,無質量的粒子系統表示流體;剛性流體;八叉樹,浸入邊界;四面體網格離散流體;勢能最小化原理

4 研究領域與方向
4.1 表面追蹤和表示
經典Metaball方法->斑駁的表面;三維點雲

前沿跟蹤方法;點集方法;VOF

將液體表面隱式表示為一個帶符號的距離場
在這裡插入圖片描述

水平集方法:會出現液體體積損失,細節被過度平滑->通過結合粒子與水平集來解決
零等面兩邊植入粒子,修正水平集的值->粒子水平集(PLS)
只在零等面植入粒子->標記水平集(MLS)
半Lagrange等高線方法(SLC):半Lagrange方法更新帶符號的距離場,Marching Cube演算法提取三角片網格

4.2 流體控制
最先的研究:壓強和速度控制流體
引數曲線控制火焰;粒子控制爆炸模擬;引入粘度、速度場的散度和水平集控制粒子;優化控制引數;共軛方法解決非線性最優化問題;Eular引入控制力項和反擴散項;徑向基函式;勢能揚;匹配水平集表面和目標形狀

尺度相關的控制力
保持小尺度流體細節:多尺度分解,控制項作用於粗尺度分量

4.3 混合方法
Eular:
四面體網格(三角面片可以精確地貼合任意邊界)+規則MAC網格
需要特殊的過渡單元格
高度場+MAC網格解決大量水體時Eular擴充套件性差的問題
二維淺水模型+三維LBM方法模擬開放水域的現象
淺水方程模擬的液體表面+SPH模擬的泡沫模型
網格中植入Lagrange渦旋粒子
Eular+粒子水平集模擬流體,SPH模擬噴濺之類小尺度細節,同時Eular與SPH相互耦合
粒子系統+Eular水平集

4.4 模型降級****
將高維問題投影到低維子空間
精確地非實時方案生成高精度流體模擬->模擬結果作為低維基函式->Galerkin方法投影Navier方程到低維空間
大大縮短計算時間
所需時間與基的數量成正比
基的選取和基的數量選取都很困難(選的好可以實時模擬)

新研究提出一個統一的模型降級框架,Navier方程投影到一個由Legendre多項式張成的子空間
計算速度提高三個數量級(只適用於模擬流體的低頻現象)

4.5 GPU
DirectX10
CUDA
著色語言
幾何著色器,marching cube

5 研究趨勢和未來研究方向
目前還沒有允許實時互動,又完全基於物理的真實流體模擬效果

5.1 細節捕捉
在這裡插入圖片描述

增加取樣評率->增加粒子數量或網格精度->記憶體消耗的線性增加+計算時間的超線性增長
粗精度物理模擬的基礎上疊加高頻的基於過程的流場,Kolmogorov理論

5.2 數值粘性
計算精度<->模擬速度
演算法穩定性<->數值粘性
數值粘性==數值耗散:數值演算法的誤差會慢慢消耗系統中的能量,導致模擬的流體運動比實際流體緩慢,顯得更為粘稠,大量運動細節逐漸流失

半Lagrange法計算方程任意大時間步長都無條件穩定,但只是一階數值精度,採用大時間步長或低精度網格就會有很大粘性
Limited Catmull-Rom離散格式來高階插值
誤差補償和矯正(BFECC)->先估計出計算誤差,然後減去
QUICK,WENO,CIP->降低計算對流項的數值誤差

速度、壓強計算的先後順序也會導致巨大誤差
多步測量運算元
運算元分裂

5.3 網格生成方法
流體動畫領域,目前只有2種網格型別用於離散求解流體方程:
MAC網格(邊界)和四面體網格(計算)
空間彎曲的計算網格,橢圓網格,區域網格

6 結論
啊,進入下一階段

(以上為綜述,以下為研究)

7 多層網格流體動畫框架
基於層次化網格結構->求解Navier方程組
與Eular不同之處:

  • 多層網格根據視覺重要性和計算複雜性將流體區域劃分成多個互相巢狀的子區域,並在每個子區域分配一種合適的網格
    在子區域分別求解,最後利用邊界條件對區域性解進行同步,使收斂於全域性解

7.1 求解方程組的尤拉方法
運算元分裂:
在這裡插入圖片描述

對流項:
在這裡插入圖片描述

壓強/不可壓縮條件:在這裡插入圖片描述
在這裡插入圖片描述

半Lagrange過程:
在這裡插入圖片描述

7.2 立方體網格離散方法
MAC網格:交錯式網格(不同變數儲存於不同位置的網格)
在這裡插入圖片描述
在這裡插入圖片描述

立方體網格的問題:
邊界走樣
多尺度細節

7.3 四面體網格的離散方法
四面體網格:交錯式網格(用於貼合不規則的固體)
儲存形式:
在這裡插入圖片描述
速度場儲存於四個面的外接圓圓心
壓強存於外接球球心

插值:
三角形劃分(Voronoi cell)
把四面體外接球球心連線起來
頂點加權平均值:
在這裡插入圖片描述
簡化為:
在這裡插入圖片描述
頂點速度值(球心): 在這裡插入圖片描述

四面體網格的問題:
計算開銷
方向偏差

7.4 多層網路框架
自適應的網格細化(AMR):多層相互巢狀
分佈低精度網格->尋找視覺重要和計算困難的區域->高精度網格疊加(不限制層數)
視覺重要性(加權):

  • 到水面的距離
  • 到邊界的距離
  • 旋度的大小
  • 煙霧的濃度

六面體-四面體雙層網格

附錄

  • 梯度
  • 散度
  • 旋度
  • Laplacian運算元