2011/10/03

The Science of Fluid Sims流體模擬背後的科學

通常像這樣的文章沒十天, 半個月很難全部翻完. 一方面時間拖的太長, 另外一方面排擠掉其他好文的翻譯機會. 這樣很可惜. 也因為如此, 作者決定要提供另外一種的翻譯模式---改用讀書心得的方式呈現. 也就是說把每段的大意讀通, 消化了以後再用簡短的文字表現出來.

記得大學時代教授曾經講過:來不及看完所有的原文書嗎? 那就把每張附圖的意思搞懂就好了. 看不懂整段的文字段落嗎? 那就把文章的第一句跟最後一句搞懂就好了. 很簡單的20/80法則, 卻也十分有效!

這篇介紹流體模擬會遇到的狀況, 主要以Exotic Matter的Naiad流體軟體作為說明.

----以下為心得與編譯----
作者:Mike Seymour

前言
流體的運算是最耗電腦運算資源的, 但是對於視覺特效來說十分重要. 流體所指的不單單只是液體而已, 還包含了火焰,, 煙霧, 氣體等. 而煙霧跟液體最大的差別在於, 液體會有固定的體積, 氣體則不是. 流體的這個概念不僅僅被應用在視覺上, 在科學領域裡面, 用電腦輔助流體的研究簡稱CFD. 60年代, 被廣泛應用在氣象預報, 洋流, 飛機動力學(這些都對經濟有很大的影響).

Weta Digital在X-men電影裡面的流體特效

Framestore為納尼亞傳奇: 黎明行者號製作的視覺特效

基本概念
流體模擬主要分常兩種方式: 早期是把流體當成一個大平面 (例如海洋); 後來才有會計算到體積(Volume)的模式, 例如倒水杯, 或是大水衝到街道裡面. 這種模式必須要考量以下條件:
  • 質量守恆. 基本上水不會在模擬的過程中平白消失
  • 動量, 或是能量守恆
  • 體積守恆, 不可壓縮的流體. 真實的世界裡面, 水是可以被壓縮的, 但是如果假定水不可壓縮, 那計算公式變會簡單許多.
  • 流動加速度(connective acceleration) 空間會控制流體的加速度, 例如當水流出水管的時候.
  • 流體主要受到兩種力: 一個是重力, 另外是流體本身的壓力
  • 基本上會忽略黏著度
  • 邊界的條件(boundary conditions)這是流體計算很重要的關鍵
流體模擬主要就是要解算Navier-Stokes方程式:是一組方程式用來描述不同類型的流體, 這個方程式已經流傳幾百年了. Navier Stokes方程式的解算結果並不是單一個簡單數字, 例如42. 而是一組複雜的向量場. Navier Stokes掌控的不是位置, 而是速度. 基本上這個方程式就好像把牛頓第二運動定律應用到流體上面 也就是說F=ma. 這個方程式最後的解是速度場(velocity field)或是流場(flow field).用來描述流體在特定點的移動距離與時間. 一旦速度場被解出來, 就可以把流速或是阻力也推算出來.


以下是簡化版的Navier-Stokes公式
用大家可以理解的方式來解釋一下:

加速度+某東西+在壓力與密度的改變=本體的力+動態的黏度

但是假定流體是不可壓縮的話 黏度的計算就可以被忽略

加速度+0+在壓力與密度的改變=本體的力+0

整理一下公式, 會得到:

加速度=本體的力-壓力與密度的變化

而密度又等於質量除以體積, 壓力的改變又與體積有關, 因此:

流體的某一點的加速度=重力(外力)-壓力或是密度的改變, 也因此流體的加速度就與他所受到的力相關.

這樣的公式要怎樣實際導入到流體軟體裡面呢?
如果直接把公式寫成程式語言很簡單, 但是實際在計算的時候需要考量產業需求, 電腦運算時間. 寫實度往往必須跟速度達到平衡. 因此實際上需要很多偷步的技巧才能滿足不同流體狀況. 其中一種偷步技巧是Surface Tracking Euler method. 他是用height map來控制流體表面, 但是忽略掉水面以下發生的事情.

某些軟體的解算法並不能滿足所有尺度, 從小尺度的倒酒杯 到大尺度翻滾海浪上的船.

某些則是數學公式上面有缺陷 ,會導致流體會隨著時間讓體積越來越小, 例如在測試<加勒比海盜神鬼奇航:幽靈海>裡面有一幕玻璃箱裝載了美人魚, 而Naiad則是解決了這方面的問題.

ILM製作加勒比海盜神鬼奇航:幽靈海的畫面

以下是關鍵技術讓你可以在合理的時間裡面計算出寫實的流體:
SPH(Smooth Particle Hydrodynamics)方法
是一種用Navier-Stokes的粒子系統, 模擬完後再把這些粒子變成polygon. 這種方式對於倒酒的流體特效很適合 ,但是對於如海水般大量流體就會有困難.

Weta在格列佛遊記使用Naiad

Volume GRID方法
只有表面的流體, 又被稱為Volume Fluids. 例如在Houdini裡面, 可以很有效率地描述海洋波浪的高度與頻率, 這種方法沒有粒子, 對於小尺度的倒酒效果不合適. 這種方法通成被稱為Euler法.

FLIP方法
FLIP解算法是粒子解算法與volume解算法兩種的混合, 加勒比海盜神鬼奇航:幽靈海 美人魚裝在玻璃牢籠裡面的流體, 就是用Naiad的 FLIP模擬出來的.

FLIP跟粒子或是SPH相比最大的優點在於, 每個frame需要計算公式的次數不需要這麼多, SPH解算法在計算的時候, 每個frame都要計算好幾次, 有點像是時間上的反鋸齒計算, 這樣的公式往往必須要解算10-100次才有可能得到好效,果 要不然很容易產生分子炸開的問題.

Houdini也提供三種解算模式, 包含了FLIP的方式. 針對Houdini 11 Side Effects 的資深數學家Jeff Lait說:
"當FLIP流體被解算的時候, 會暫時產生速度場, 粒子的速度場會被轉移到grid裡面. 用來處理流體的彈射方向 ,這樣可以避免粒子重疊, 也可以避免它們都往同一個方向移動. FLIP流體的另外一個優點是不同的流體可以疊在一起, 不會影響到系統的穩定度. SPH法當兩個粒子很靠近的時候很容易就炸飛, 對於FLIP來說, 你可以添加新的粒子到流體裡面, 例如石頭丟到水裡面飛濺起來的分子"

Naiad案例分享
Exotic Matter公司的Naiad流體軟體用的方法是PIC-FLIP, deFLIP 甚至更先進, 未發表的方法. Exotic Matter公司的 CEO--- Marcus Nordenstam先生做了以下解釋:
"FLIP用了新的方法來改善以粒子呈現流體的計算方式, 在每次的模擬, 我們會從粒子產生grid, 把粒子的速度與表面資訊轉移到grid上面, 然後壓力會透過grid來計算, 而把計算的結果更新到粒子身上, 然後粒子再把新的速度轉移到grid上面, 如此計算稱為一次的step (譯者註:反覆的跑這樣的流程可以算出很寫實的流體).


Naiad Scene Test from slayerk on Vimeo.
問: Naiads能允許添加新的粒子嗎? 例如當石頭丟到水裡濺起水花.
答:可以. 有很多發射的operators可以做到這件事, 不論這是一級流體或是二級流體都可以.

問: Naiad的精度到多少? 你認為還要花很多時間開發才能得到好的精度嗎?
答:Naiad的精度幾乎是一等一的. 是目前的尖端科技, 如果是工程用的流體軟體價格是Naiad的十倍, 能達到最棒的精度. Naiad還可以同時計算剛體與流體, 而大部分的流體模擬軟體都是把剛體與流體分開計算的, 這會影響到細節與精度.

另外一個重點是細節與解析度Naiad最著名的就是提供大量的細節, 即便是解析度很粗糙.Naiad不是用傳統的方式調整解析度, 它不是靠單純固定大小的細胞--或是稱voxel來計算的. 而是以動態的 自適應的方式來處理. 因此, Naiad的流體不會侷限在某個框框裡面計算, 這要歸功於Naiad’獨特的3D tiling系統.

問:有沒有可能靠一種方式就能計算所有尺度的流體呢?
答:Navier-Stokes方程式可以應用到分子般大小的尺度都可以, 也可以適用於大尺度上面, 所以物理上方程式都是通的, 唯一的差別是, 在不同尺度上面, 某些方程式變得比較重要, 例如在小尺度的世界裡面, 表面張力的影響很大; 但是大尺度裡面, 表面張力就可以忽略.

用Naiad模擬大象跑過黏稠的泥沼(要觀看影片影點這裡, 或是download

問: 在做需要計算黏度的專案的時候, 要考慮到什麼?
答:Naiad會計算黏度, 不同於其他軟體Naiad會分別計算速度的向量, 因此結果會更精確, 也因此Naiad算出來的黏稠流體會有寫實的纏繞效果.

從用戶的角度來看, Naiad調整黏度很容易使用. 甚至還可以用3D材質來控制黏度的變化, 同樣的觀念也可以用來控制流體的密度.


Naiad density viscosity RND from Igor Zanic on Vimeo.
問:Naiad可以怎樣整合到工作流程裡面? 要怎要輸出到Houdini?
答:沒有預設的輸出. 但提供裡一個圖表, 有點像是NUKE裡面合成的節點那樣. Naiad圖表般含了file operators ,可以讓你把資料快取到硬碟裡面, 你可以輸出成mesh, 也可以輸出成3D場的資料, 例如速度, 也可以輸出成粒子.

Naiad圖表裡面也有render operators. 目前只支援Solid Angle’s Arnold renderer , 而我們也有跟Chaos Group合作, 讓它支援使用V-Ray. 所以輸出的時候不只是可以輸出成mesh 甚至還可以算圖!

最常用的整合方式是透過我們的外掛軟體. 例如Maya 與Houdini的外掛. 例如你可以把動態的角色自Maya輸出, 輸入到Naiad, 計算流體模擬, 然後在把資料導回到Maya裡面.

問:關於當今流體方面的研究有趨緩嗎? 變得更加成熟?
答:當今大部分的研究都希望用最新的硬體架構讓計算更有效率, 但是對於多物理(multiphysics) 例如同時計算流體與軟體, 或是剛體, 這方面的研究還有很多要做.

問:我們如果用Naiad來算流體 速度會多快?
答:跟解析度有關. Naiad很穩定, 不管你計算的step有多少次. 如果step太少的話結果會過於平滑, 所以大部分的人會用多一點的粒子, 高解析度來計算出寫實的流體效果.

----翻譯完畢----

[相關文章]

2 comments:

Unknown said...

很受用,感谢Hammer的翻译。

EJ小車記 said...

后里蟹,翻成中文我還是看不懂...