天天看點

Houdini Ocean差別[10.13更新示例]Ocean WavesSplash TankWave Layer TankWave TankBeach TankFlat Tank示例

Houdini Ocean差別[10.13更新示例]Ocean WavesSplash TankWave Layer TankWave TankBeach TankFlat Tank示例

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

Houdini Ocean差別[10.13更新示例]Ocean WavesSplash TankWave Layer TankWave TankBeach TankFlat 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能當發射器使了都。

vimeo位址:  https://vimeo.com/108644636

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

【完】