當前位置:首頁 >教程首頁 > Nuke >Naiad流體模擬製作解析

Naiad流體模擬製作解析

發布時間:2018-11-17 19:57:24
合成最終效果
 
[flash]http://player.youku.com/player.php/sid/XNTQyODMzMjgw/v.swf[/flash]
 
自學Naiad以來的第一個成品鏡頭,目的是測試Naiad配合其他軟件做水的整套流程。結果還ok!
 
以下的製作解析部分,如果具備基本的Naiad、Maya、3ds Max及Nuke的軟件基礎,那麼理解起來會更容易一些。
 
CubeFall Project的整個工作流程大致如下圖1:
 

 
這個流程圖展示了整個製作流程的各個節點,以及數據的格式和流向關係。由於這個流程圖是在鏡頭完成後總結出來的,隻能代表“總結”而非“探索”的過程。因此下麵我會從製作之前的初步思路來一步一步推進到鏡頭最終完成。
 
製作之前的思路:
 
在製作之前,首先是無數次的觀看ghost vfx為ilm做的“盒子砸水花”測試鏡頭。這是我見過迄今為止最棒的水體交互鏡頭,細致程度讓人歎為觀止。
 
在製作之前,我構思的大體思路是先用Maya製作小範圍的水體容器,然後倒入到Naiad中解算出小範圍容器的水的交互動態(解算數據包括主水體粒子、主水體mesh模型、浪花粒子),之後將粒子數據導入Maya進行浪花粒子的渲染,將主水體模型導入Maya進行海洋表麵渲染,各自渲染完成後生成圖像序列素材進Nuke進行合成。
 
這個思路看起來沒有問題,實際上過於簡明而忽略了太多的技術細節以至於不能預計到實際製作中碰到的問題。不過沒關係,剛開始的計劃總會顯得稚嫩,但至少有了大體製作方向,於是開始進入製作的第一步:進Maya建立水體容器。
 
Maya中建立基本場景
 
越靠前的步驟越重要,如果第一步就不對的話,後麵縱然再花時間也隻能說是在錯誤的道路上越走越遠。
 
在這一步中最最重要的地方是確定了整個場景的宏觀規模,也叫宏觀縮放。Naiad解算引擎是以現實世界中的物理參數為參考而設計的,因此場景的宏觀縮放直接影響到最終效果是小石塊掉湖裏還是大隕石掉海裏。
 
Maya的默認網格以厘米,而Maya的1厘米在Naiad相當於1米,我希望製作的效果是一個邊長2米的立方體落入水中的效果,因此我在Maya中首先創建了一個邊長為2厘米的方盒子。
 
如下圖2的藍色cube模型,Scale XYZ均為2。
 

 
(我2了一把,想標注這個立方體的體積為8m³,結果寫成了2m³,很囧。)
 
邊長2米的盒子砸入海中激起的交互反應會波及多遠?這個和盒子下落速度等因素有關,需要預估。
 
最初我設計了一個比較小的水體容器(水池),後來經過Naiad解算測試發覺太小了,最後將水池半徑改為約20米(Maya默認單位20厘米)後覺得差不多了(如圖3),實際上最終解算還是有少許水花會飛出水池外,不過基本可以接受,實在不行就靠後期修吧。如果cpu和內存資源夠多的話隨便做多大的水池都可以,但是實際製作中要考慮成本與質量之間的平衡。
 

 
我製作的是圓形的水池而不是方形的,因為在考慮到立方體從水池中心砸入水中導致水花飛濺,可能以任意速度朝向任意方向的情況下,圓形水池是最節約計算資源的選擇。
 
水池的底部是扁平半圓形狀,最深處約為2.4米,這也是為了節省計算資源,之前會擔心Naiad解算結果會使這種水池的設計失真,最後發現看不出來。
 
這一步一共建立了四個模型,一個水池容器、一個主水體存在區域、一個用作boundary layer的模型(後麵步驟會說)、一個邊長為2米的立方體。
 
主水體存在區域需要略微比水池邊緣大,這能保證生成主水體的時候不會使水體與水池之間出現空隙,使主水體的初始狀態穩定。
 
這一步初步搭建了場景相機,由於無法預測砸出來的水花的形態從哪個角度看最好看,因此該相機在後續步驟可以根據Naiad解算結果進行調整。

模型和相機分別導出為emp文件用於接下來的Naiad解算。
 
Naiad:主水體解算及導出粒子prt文件
 
主水體解算節點連接如圖4:
 

 
圖4中,Naiad視口中綠色線框表示的是水池模型,紅色線框表示的是boundary layer模型。盒子下落最後我采用的是Naiad的剛體解算下落的,最後發現Naiad 0.6.0.69這個版本的Maya接口插件無法導入解算好的剛體emp文件,遂在Maya中單獨給盒子k幀做的下落動畫以匹配Naiad的剛體盒子下落運動。
 
鏡頭做完後才發現Naiad 0.6.1.43這個版本的Maya接口插件成功修複了這個bug 。
 
如果不考慮A、B、C三個我個人添加的部分,那麼主水體的節點圖就是一個經典的particle-liquid解算流程圖,見圖5:
 

 
如圖6,A節點是一個Field-Nel-Channel節點,起的作用是speed limit,限製Field.velocity的值,避免出現粒子高速飛濺的情況。類似速度限製的表達式我在很多Naiad文件中都會用到,個人覺得是非常實用的功能。
 

 
如圖7,C節點是一個Particle-Nel-Channel,用於獲取粒子vorticity的強度值。老外教程裏的方法通常都是使用一個Field-Nel-Channel和一個Particle-Nel-Channel來得到vorticity的矢量,我把表達式優化之後隻需要一個Particle-Nel-Channel節點就可以得到vorticity的矢量,但圖7中我寫的表達式並不是去獲取vorticity的矢量,而是獲取了vorticity的強度。
 
我是基於以下兩點:
 
①、在krakatoa中渲染出的vorticity其實隻需要強度值即可用於後期校色;
 
②、vorticity的強度值是個標量,這樣在寫naiad緩存的時候要,存儲一個標量值比存儲一個矢量值數據量要少三分之二。
 

 
如圖8,B節點區域的核心是boundary-Layer,起的作用是讓水花飛濺到離盒子下落中心一定距離的時候,讓水花和水麵波浪運動減速,讓其盡可能在到達水池邊緣的時候沒有水花溢出也沒有水麵波浪反彈效果。
 


三個Boundary-Layer的參數分別為:
 
(15 voxels/(@'Master Voxel Size'))*0.1
 
(7 voxels/(@'Master Voxel Size'))*0.1
 
(3 voxels/(@'Master Voxel Size'))*0.1
 
意義為分三級不同範圍不同強度來控製particle-liquid接近水池邊緣時候的減速程度。
 
在這裏我用到了一個expression來控製Boundary-Layer的厚度,而不是使用絕對數值,這樣的好處是無論Master Voxel Size怎麼變,Boundary-Layer的物理厚度值都是不變的(肉眼可見的厚度)。
 
這樣的表達式用法我也經常用在particle-liquid上來控製Surface SuperSampling的厚度,以下的解釋也許能夠幫助更確切的理解為什麼要用到這樣的表達式,如圖9:
 

 
如上圖所示,無論MVS值是多少,都能夠保證粒子超采樣的表層厚度都是不變的。
 
D節點為全局設置,如圖10:
 

 
對於Global節點,Time-Stepping參數非常重要,在大多數教程上看到的參數基本都是Min Timestep 和Max Timesteps 都設置為1,這樣的話Adaptive Timestep Sensitivity無論是什麼值都不再有意義,每幀解算次數固定為1。
 
這樣的設定適合教學、低精度預覽和慢速流體的應用場合,一到高精度解算和高速運動流體的情況下,很容易出現動力學計算失真的情況。
 
在cubeFall這個鏡頭中,我的設置如圖10中綠框所示。也許會有人質疑:Adaptive Timestep sensitivity為0的情況下,Max Timesteps設置為4有什麼意義?
 
Adaptive Timestep sensitivity為0並不意味著每幀解算次數隻采取Min Timesteps的值,在高速運動場合一樣會采取更高的每幀解算次數來滿足CFL condition(與FumeFx同理),最高的每幀解算次數以Max Timesteps為限。
 
“0”不代表Adaptive Timestep Sensitivity完全丟失敏感度。

以下是Naiad help中關於Time-Stepping Parameters的解釋,以及附注的個人參數建議:
 
自適應每幀解算次數敏感度
 
譯:這個參數是CFL condition的縮放係數,用於控製Naiad有多高的敏感度去處理快速運動物體。通常來說,物體運動越快,每幀解算次數就需要越高,也就意味著你需要將一幀分解成若幹個小幀去計算。這個參數越接近1,表示Naiad將針對快速運動的物體采用更多的幀間計算次數來解算(最大次數取決於Max Timesteps)。明確的說,在一個流體模擬中,本參數設置為0代表允許流體在一次計算中最多移動10 voxel的距離,而如果本參數設置為1則代表允許流體在一次計算中最多移動1 voxel的距離,如果超過了移動距離限製,則將一幀分解成若幹個小幀去計算(最多分成多少個小幀取決於Max Timesteps)。請注意:本參數設置為接近1的值將會明顯降低解算速度,特別當你設置了一個很小的MVS值的時候。通常的建議是僅當你發現流體運動的時候發生動力學失真、體積莫名減少、整體細節有問題的時候,才去提升本參數的值。

個人建議:在MVS值很小的時候,本參數哪怕設置為0也一樣很敏感,一點輕微的水體運動就會觸發大於Min Timesteps的每幀解算次數,當MVS值很大的時候,本參數設置的很高也不一定會觸發每幀多次解算!因此本參數根據MVS精度的不同、項目不同而需要設置不同的值。
 
最小每幀解算次數/每幀最少分解成多少個小幀
 
譯:保證每幀解算次數最少不低於本參數,不管實際計算是不是需要這麼多的每幀解算次數來滿足Adaptive Timestep Sensitivity參數的要求。當你在想要強製Naiad進行一幀多次解算的時候本參數尤其有用。
 
個人建議:一般設置為1是沒問題的,99%的項目本參數都應該是1。如果發現設置為1的時候動力學效果有問題,可能是設置了錯誤的Adaptive Timestep Sensitivity和Max Timesteps。
 
最大每幀解算次數/每幀最多分解成多少個小幀
 
譯:每幀需要的解算次數最多不能本參數的值。當你覺得Adaptive Timestep Sensitivity參數要求過高的每幀解算次數的時候,本參數可以讓你手動限製最大每幀解算次數。
 
個人建議:一般情況下在激烈運動的流體中該參數才具備實際意義(例如與物體碰撞需要飛濺水花的時刻)。本參數設置過高的情況下可能導致解算太慢、水花飛濺距離太遠的問題,因此需要反複測試,從低值開始測試然後逐漸提高。
 
更細膩的控製方式:為該參數設置動畫,在流體平靜的時刻設置為1~2,當流體激烈運動之前(自行預測)將本參數設置為4-10。尤其在MVS很小、網格密度很高的時候,哪怕Adaptive Timestep Sensitivity設置為0的時候平靜的水麵運動都可能會觸發大於1的每幀解算次數,此時用k動畫的方式讓該參數強製為1是節約解算時間的好方法,當然要記得在激烈運動之前k高本參數,流體回歸平靜的時候再降低回去。
 
因此本場景中即使Adaptive Timestep Sensitivity設置為0,盒子砸入水中的瞬間,每幀解算次數還是很輕鬆就達到了Max Timesteps。
 
當每幀解算次數大於1的時候,如何能夠知道哪一幀進行了幾次小數幀解算?通常的方法是在Emp-Terminal中的Per-Timestep Channels填入*.*,這樣便會將小數幀的緩存數據悉數記錄下來,不足之處是小數幀緩存會占用額外的空間,刪除的時候也不方便刪,而小數幀緩存一般情況下是用不到的,因此為了節約磁盤空間,我是這麼設置的,如圖11:
 

 
在Emp-Terminal中的Per-Timestep Channels填入一個根本不存在的通道名稱,然後解算,最終的磁盤文件會產生一些非常小的文件,通過這些小文件可以很方便的看出來哪些幀用到了小數幀解算,要刪除這些小文件也方便,按照文件大小一排序,把特別小的那些文件刪掉就ok了。如圖12
 

华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼入群領福利

掃碼領福利最新AI資訊

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定