Houdini Study Note学习笔记 ( 二)
Scatter 节点
//如果模型是带动画的,直接scatter 会导致每一帧撒点的位置不同,会闪,解决如下
texture 节点: Attribute Class -> Auto Select(或Point)
//point 节点
//scatter 节点
Dop 中自定义场
------------>使用 Sop Scalar / Vecotr field microsolver 。这些节点能把SOPS下使用iso offset节点定义的 fog volume 引入到DOPS中。
------------>使用Gas Particle To Field microsolver 。这个节点允许点属性copy到自定义field中。
------------>使用 Gas Field Vop 。
Fog vs SDF
上图,上面对应Fog Volume , 下面对应SDF
>> Fog Volumes 更像传统意义上的贴图,物体在其中,存储1,否则0;
>> SDF(Signed Distance Fields)如果当前Voxel在物体里面,值为负(浮点数,不像Fog是整数),在物体外面,值为正。
>>对于两种Volume, 数值为0的点代表物体表面的位置,Fog存储的是整数,只能精确到voxel边界,而SDF由于是浮点数,可以根据相邻的voxel中存储的数值,判断表面的位置,增加精度,如图中紫色线(代表表面)所示。
Divergence
Divergence 是由于速度场(velocity field)的不平横造成的。Voxel的Divergence可以这样测量:比较Voxel边界上进来和离开的速度。Incompressible (不可压缩)流体的Divergence应为0。为了除去Divergence,引入了pressure field。Houdini 为此提供了三个结算器:Gas Project Non Divergent、Gas Project Non Divergent Multigrid(计算速度快,不支持碰撞和free surfaces)、Gas Project Non Divergent Variational (设置相对复杂,计算更精确)。
左图为速度场(velocity field),加了简单的noise, 可以看到点的分布不均匀,有的地方密(Compression),有的地方疏。右图为Pressure field ,是根据Project Non Divergent 计算得来的,是用来抵消Compression效果的。当把Pressure field 加到 velocity field 上后,你就得到了下面的图:
Free Surfaces
使用Gas Project Non Divergent Multigrid的时候,上面提到了这个结算器速度快,但是不支持free surfaces。Free Surface个人理解应为流体表面的自由流动,例如水表面的流动是自由的,不会受到附近空气的阻力而使速度减慢。
在Project Non Divergent 之前,需要把粒子的速度映射到一个 field(场),暂且称这个field为vel。映射需要使用节点Gas Particle to Field , 此时如果我们勾选了 Use Max Extrapolate Cells, Max Extrapolate Cells 设置为2,这时距离粒子大于2个Cell的voxel中,值就为0。
如此,经过Gas Project Non Divergent Multigrid 重新计算新的vel, 并用Gas Field to Particle 把速度直接赋给(利用copy的方法)Particle后,发现位于边界的粒子的运动好像受到阻力作用似的。这是由于Gas Project Non Divergent Multigrid在计算新的vel场时,位于粒子外、边界位置的voxel 的值为0,从而造成这种效果。
为了去除这种影响,正常的Gas Project Non Divergent 有一个Parameter:Surface Field 。创建一个surface field(注意Scalar类型)。
创建一个Gas Particle to SDF
可以看到surface field 创建成功了
使用Gas Project Non Divergent
Ps:houdini15中测试没有发现它明显的区别,已优化?
Transform 顺序问题
注意,Tansform 是有顺序的,如下。
新建一个test geometry, 接一个transform节点,rotate参数设置为:40,20,0,左图为没旋转之前,右图为rotate之后
接下来,我们再接一个transform , 设置如下:
boom ! 请看结果,
发现头并没有正过来,原因在于T1的Transform Order 为:Rx Ry Rz , 如果我们想正过来,那么T2应该设置为相反的顺序:Rz Ry Rx 。So Easy!
Vex 中利用通配符判断点在多个组内
在vex中没有函数pointgroupmask,注:某一个指定组时可用inpointgroup,这里讨论的是多个组。可以在wrangle中新建一个string 类型,利用表达式函数pointgroupmask函数表达式选出组,wrangle中代码如下:
1 int result = 0; 2 string chosengroups[] = split( chs("maskparm") ); 3 foreach(string group;chosengroups) 4 { 5 result = inpointgroup(0,group,@ptnum); 6 }
switch 节点的自动转换
如图,如果 object_merge1 有输入,自动切换到 左边物体,否则,右边物体。
只需在switch中写下如下表达式:strmatch(chs("../object_merge1/objpath1"),'')