Houdini Ocean區別[10.13更新示例]




H13shelf上帶了6種做水的預設,之前一直不大瞭解幾種的區別,比如Splash Tank和Wave Layer Tank,研究後受益匪淺,感覺每個都是飽含了人類的智慧。

Ocean Waves


這個會創建一個普通的非動力學海洋,類似Maya Ocean但在渲染效果方面足以甩開幾條街。其巧妙之處在於將模型和真正的渲染分離,模型用一個低模+ocean sop來方便特效師layout什麼的,而渲染是用的vector displacement,精度大大提升。

另一方面,foam比maya的ocean實在強太多,這foam是一個基於VOP的簡單的foam solver算出來的,然後通過COP bake到2d貼圖中渲染生成高精模型,建議進solve_foam節點其內部的實現,很簡單但效果拔羣,配合其ocean surface shader可以輕易達到非定製的影視級。

Splash Tank


這個很牛逼,可以創建一個動力學的海洋,牛逼之處在於,既是動力學的,而且還能匹配ocean的動態。猶記得之前做海洋的時候自然的動力學和ocean的吻合很難兼得,當時的ocean就剛開始哐當了一下之後就抽搐的不成樣子了,根本談不上吻合,而後來借ocean sop的vel來驅動flip的做法效果不錯,但畢竟vel變成場後對pos來說是二階的,是有延遲的。Houdini13的Splash Tank才真正做到了完美匹配。
其精髓在於DOP net下的source,以SOP計算出的ocean的海面爲界,每幀都會把上幀海面內的粒子刪除,然後填充上新粒子。填充的粒子都是繼承有速度的。就這麼簡單。
這麼做的牛逼之處在於,海面以下的粒子是始終匹配海面的,因爲每幀都會刪除導入來刷新一遍。但是海面外的任動力學處理。這就導致碰撞或者高速甩出的粒子,只要在海面外就變成動力學粒子,落到海面內後又被ocean驅動的粒子取代,這兩者之間的轉換完全無縫,算一遍看上去就是不停自然哐當的海,撞到船上的地方居然還是動力學的流體粒子,一旦水落回海面後又自然咣噹,非常牛逼,非常犀利。

另外source的時候這個source是隻有表面一層粒子的,內部沒有粒子,很節省計算資源。
配合傻瓜化的whitewater系統,效果很不錯。

缺點是,海面內的100%匹配ocean動態,即便是一根金箍棒劇烈攪拌也不會阻擋其ocean的動態,只會產生flip化的splash,這樣導致比如一艘船行駛過,船頭的小浪花是很好很不錯的,但船後還是一片咣噹的ocean沒有留下漣漪。

所以sidefx稱之爲“Splash Tank”.

Wave Layer Tank


爲了解決上述金箍棒攪拌不起的問題,houdini還提供了這種Wave Layer  Tank的好東西。但不知原理調不好的加很容易出問題。
和Splash Tank不一樣的是,Wave Tank只用ocean的粒子更新boundary也就是邊界區域的粒子,這個boundary可以指定,所以只有邊界是和Splash Tank一樣的,這保證了跟隨物體(比如一艘船)在移動的時候會有源源不斷的粒子從boundary補充進來,一旦進來後就是動力學的了,既可以和船頭碰撞,又可以留下漣漪。當然,如果boundary太窄跟隨的物體移動太快的話很容易造成boundary斷斷續續的效果。
還有一點和Splash不一樣的是,匹配ocean動態用的方式是,用一個treat as wind的Advect POP(DOP)來驅動boundary圍着的粒子,而且在底下墊了個ocean的SDF來碰撞,一拱一拱的,就把粒子給掀的和ocean一樣了。
缺點是,物體移動時,不會對碰撞形成的空洞進行實時的填充,現實中當然也是這樣的,問題在於如果只是薄薄一層粒子那很容易形成空洞,而如果這層粒子厚了底下用來碰撞的ocean的作用就不明顯,當然可以加大advect節點的air resistance,但這樣一來漣漪效果也弱了。需要權衡。

Wave Tank


這個是Wave Layer Tank的不經濟版本,得益於新的基於DOP的POP系統的Advect by Volume也完美的解決了老版本Houdini中的wave tank哐當兩下子就亂了的問題。不經濟在於整個tank都填滿了粒子。看下Wave節點的連發會發現和Layer版本還是有區別的——沒有collision。這個很好解釋,layer的tank如果沒collision就在重力下全漏到sink裏了,而wave tank的容器是封閉的,不測漏,可以大膽的只用一個advect來匹配ocean。


Beach Tank


這是一個很不錯的預設,使得Houdini Player可以一鍵實現足以拿出來裝逼的流行效果。
準備一個沙灘(傾斜方向可以指定),應用此預設可以做成一個沙灘上浪打浪的tank,沒感受過的趕緊播放一下感受感受。方向和ocean的direction是同一種度量方式,所以默認直接就是鏈在一起的。
其原理爲,Ocean Source的velocity tab下預留了一個Velocity Ramp Parameter,普通的都是全滿的,而beach是在某一個範圍降到0,這樣的作用是ocean的advect沿direction到某個位置(往往是比較淺的位置)後就減小到0,任水在flip的解算下推上去又退下來,而深處的還是在ocean的作用下advect看起來很像海洋,一層又一層。這個方法實現的beach是非常自然的,淺灘上不會出現不自然的advect,深處又會很自然的浪一層層。

加上用於碰撞的礁石以及whitewater後效果很不錯。


Flat Tank


這個就是最基礎的Tank了,只是給你連好了初始粒子以及whitewater,用來做隕石砸水坑或者怪物出水還是挺合適的,就是沒有任何針對性的優化和tricks,但作爲一個開始會很不錯。


示例

這裏有一個我做的示例(文首圖),從海面涌出一根翻滾的水柱,水柱失去動力後會落在海面上。粒子儘可能少而且取之不盡用之不竭又能保持形態的話,以上ocean中無疑是splash更加適合。這海面給個pump能當發射器使了都。


只是個測試級別,完成度很低,有空一定繼續下去。

【完】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章