houdini 官方2小时超详细逼真瀑布流体制作教程(解算篇)
—— 微资讯 · 微课程 ——
利用零碎时间,走上超神之路!
此教程是houdini官方出版的使用flip制作流体瀑布的完整教程,包含了特效解算+材质渲染设置+后期合成部分,这篇为流体解算部分;个人觉得教程质量非常,能做到重点讲解清晰又不拖泥带水,虽然是使用houdni12.5的版本,小编用15.5做一个版本,大概花了1个多小时就完成了,同时把一些变化地方和容易犯错的地方在笔记中标识出来了,方便大家学习。
之前小编一直没有进入houdini中的dops特效解算模块,一方面是想把sop等基础打扎实,另一方面也是因为特效解算需要比较好的机器(否则等待时间太久) ,前不久公司终于买了一台3万多的机器,所以终于可以进入这个模块了。花了1个多小时学习,发现都是一些基础知识的应用,很快就上手做了个类似的效果,下面是自己整体的学习笔记和分析,希望对大家有用。
视频教程
瀑布参考视频
整体分析
学习笔记
第一步 地形创建
使用 mountain和polyextrude节点进行基础地形(注意houdini15中polyextrude的用法不一样),最后使用polycap进行封面处理(因为做动力学碰撞体需要封闭的模型)
创建完后选择地形模型,点击刚体工具架子上的创建static object被动刚体。
显示碰撞模型,调整碰撞精度
第二步 设置发射器+base基本流体解算缓存
创建grid,调整大小,放在地形上面
选择grid物体,点击创建emitt particle from shelf工具架,把grid转化为流体发射源
在动力学节点中可以看到创建的流体节点,在视图中也有流体显示
选择flip solver节点,设置解算容器大小,让其尽量和地形匹配
在flip object中切换粒子的显示模式为particles粒子形式
设置边界碰撞,除了z轴正方向没有碰撞(这个要根据模型场景的方向而定)
回到grid发射物体节点中查看发射源物体:目前是比较平均分布,播放的时候有抖动效果
在grid下面添加一个moutain节点对grid模型进行置换效果控制;对offset中的y轴设置$FF/20进行偏移控制
选择 create surface volume节点(实际上fluid source节点)
在vel速度标签下我们并没有看到任何速度属性显示,因为在上游节点中并没有设置模型的速度属性,所以这里无法继承
在moutain节点下面链接一个vopsop节点,添加turbulence控制设置为速度,提取出offse和freqquency等,然后设置$FF/18等进行速度的动画随机偏移控制。
fluid souce会继承模型的速度属性
回到dop网络中,同样找到source volume节点,在scale velocity中可以对速度进行缩放控制
缩放25倍后流体解算的运动效果
缩放13倍后的速度效果
base流体缓存
在dop I/O中设置需要缓存3中数据
geometry为粒子数据
surface为表面场数据,用于判定流体中外部和内部 0-1
vel速度场,获得粒子流体的速度属性
使用rop output driver对粒子缓存到硬盘中
重新加载缓存粒子,然后进行三部分分离处理
01分离出粒子 添加一个add节点
delet geometry but keep the points 删除几何体但是保留点
并且勾选Add particle system这个是为了可视化
02使用delete节点保留速度场
使用表达式 @name == vel.* 仅保留速度场
03保留surface 场:因为之前在保存的模式为smoke烟雾状态,可以查看到效果
@name == surface 可以保留surface的数据,surface用0-1来定义流体的内部还是外部。
修改三部分的名字
第三部分,制作表面的白色泡沫粒子
第一步,定义发射范围
在瀑布流体中发射流体的白色区域应该是一些流体发生强烈碰撞的地方,其结果就是速度的变化大;
这就需要对比速度的前一帧与当前帧之间的速度变化量: length(V2-V1)的值,然后使用颜色进行可视化。
问题,如何获得粒子前一帧的粒子的速度?
通过timeshit可以获得粒子上一帧的状态 $F-1,然后连接到input2
方法一,使用index粒子索引
使用importattributes节点,可以设置input端口并且获得该端口物体的属性:可以访问到粒子的速度属性
如果使用粒子的numpt粒子序号,会有个问题,因为粒子不断在删除(死亡),可能当前粒子和上一帧粒子就不是同一个序号
方法二,使用查找最近粒子进行速度分析(不用考虑粒子序号)
使用点云的方法 pointcloud
连接point cloud open 这个可以返回位置附近所有物体属性的一个元组,然后通过point cloud filter提取出元组中需要的属性
point cloud open的用法,query position连接全局中P的位置,然后提取出point cloud texture进行连接;
在外部把使用函数路径op:`opinputpath(".",1) 这里一个有三个函数 opinput()函数是返回第几个input接口中的节点路径 `为前置转化结果符号;op:把houdini中的文件当做是硬盘路径。
使用之前速度subtract减去当前速度,使用length把矢量转化为浮点,通过fit range设置范围,最后连接到Cd颜色中进行可视化设置。
通过fit range进行范围控制,使用delete节点通过颜色保留白色区域粒子
这部分就是我们水花泡沫的发射源粒子
其他两个数据也进行null命名
创建一个新的dopnet进行粒子模拟(在右下角的动力学按钮中切换)
创建粒子解算(粒子中使用的旧版的粒子系统,我们这里可以直接使用新版本的粒子系统)
直接选择粒子发射源的粒子, source particle emitter会创建粒子发射。
在source重视设置粒子发射数量和粒子寿命
添加gravity重力效果,粒子解算如下
可以给之前的地面做个static object与粒子碰撞(意义不太大,不过保险起见)
完成粒子碰撞的重要两个步骤
给粒子添加pop vop节点进行粒子运动状态控制
第一 判定粒子是在流体外部还是内部,如果是内部,直接然他回到流体表面位置(模拟粒子与流体碰撞效果);这里需要使用到surface场进行判定并且进行位移控制;
第二,粒子在落到流体之前随机速度,但是落到流体表面的时候,需要保持和流体一样的速度前进;这里需要继承之前的vel速度场
使用volume sample对surface进行采样处理
连接位置p,然后可以提取geome file,用来加载surface路径,这里提取需要注意,默认是灰色不可编辑
因为默认有一行代码要除掉{ opinput != file } 这个代码的意思是如果输入端不是file的话就自定屏蔽,把它去掉就可以
通过vomle sample可以对surface进行采样,如果值是≤0的话,那么粒子是在流体内部,我们需要把粒子推向粒子表面
这里使用compare做条件判定
然后输出给if block这里也有变化(如果条件成立,我们就要执行唯一变化)
那么我们其实知道位置的大小(通过volume sample就可以知道,因为它返回的是粒子与surface的距离,在内部为负数,在外部为整数),但是我们不知道移动的方向(矢量)
通过volume gradient进行方向采样,这个放回一个矢量值,也就是粒子与surface的方向;
但是我们需要的是反向移动,使用negate的进行反向翻转,然后与volume sample相乘,最后add加上当前的位置(强制把粒子返回到流体表面)
但是我们需要的是反向移动,使用negate的进行反向翻转,然后与volume sample相乘,最后add加上当前的位置(强制把粒子返回到流体表面)
获得流体的速度
通过volume sample file获得速度,但是每次只能获得一个元素,需要三个volme sample,设置primitive index为0,1,2
p位置属性连接,提取出geometry file(屏蔽方法同理)
分别设置number为0,1,2
最后面float to vector连接到输出矢量,然后设置为速度
最后粒子就实现在流体表面碰撞并且保持和流体一样的速度流动了
把表面粒子使用objectmerge加载到另外一个geometry节点中,添加一个box设置编辑框把这里多余部分删除
最后把粒子缓存出去;
下一篇 材质设置和渲染