Houdini Ocean区别[10.13更新示例]

来源:互联网 发布:庄子哪个版本好 知乎 编辑:程序博客网 时间:2024/05/19 03:30




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能当发射器使了都。

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

只是个测试级别,完成度很低,有空一定继续下去。

【完】

0 0