What & How & Why

Houdini TIPS

Ver.18.0
Houdini 使用相关 Tips

UI

同时查看三个目标

问题描述:如何选中一个目标的同时 template 其他两个目标?

How to Fix:Houdini 会自动显示当前选中目标。我们可以利用这点来达到上述的要求:

  • 假设有 A B C 三个目标
  • 对 A 点选蓝标:display
  • 对 B 点选 紫标:template
  • 对 C 选中

这样就可以同时查看 A B C 了。

SOP

设置几何体的底部贴近地面

问题描述:默认创建的几何体都是以重心的 Y 轴位置作为地面的参考,这样会造成几何体在创建的时候有一半在地面上,一半在地面下。

How to Fix:使几何体的 Y 轴上的位移等于其高(Y 轴上长度)的一般即可:

ch('ty') * 0.5 //copy this channel to size of Y

将一组属性 Remap 到 [0,1]

问题描述:如何将一组属性 Remap 到 $[0,1]$?

How to Fix:我们可能首先想到的是使用 fit 对属性进行 remap。但 fit 需要我们指定源属性的范围,因此我们需要首先找到源属性的最大最小值。

Attribute Promote 节点允许我们找出当前属性中的最大最小值。因此,我们可以利用这点来确定原属性的范围:

  1. 首先使用 Attribute Promote 将源属性分别按 Maximum \ Minimum 的方法进行 Promote。注意需要关闭 Delete Original 选项,这样我们才能重复使用源属性。
  2. Promote 的属性转换方式我们选择从源属性的类型到 Detail。同时将转换后的属性重命名为 MinMax。到此为止,我们就有了两个 Detail 的属性,分别存储了源属性的最大最小值。
  3. 使用 fit remap 源属性。

随机化 Attribute Transfer 的范围

问题描述:如果控制 Attribute Transfer 的影响范围?

How to Fix:在 Attribute Transfer 中,控制该范围的主要数据是(以点为例)是源点到被传输的表面的距离。该距离的随机化可以通过一个随机化的标量与法线相乘得到。

需要注意的是,该距离越大,也就是源点离目标表面越远,Attribute Transfer 的范围就越小。因此在某些情况下我们需要进行反转。

具体步骤(以点为例):

  1. 首先建立 Distance 属性用于存储源点到表面的距离。我们基于法线来随机化该距离:rand(@ptnum) * @N
  2. 创建一个 multiplier 乘到之前的 Distance 上。

让 Scatter 的点附着在变形的几何体上

问题描述:如何让 scatter 的点附着在有变形动画的几何体上?

How to Fix:在默认情况下,如果我们对某些带动画的几何体进行 sacttering, 生成的点是不会随着动画的变形而移动的,就像是下面这种情况: 对于这种情况我们有两种解决方法。但不管哪一种解决方法,我们都需要使用两个 scatter 节点产生的属性:Prim Num Attribute / Prim UVW Attribute。这两个属性代表了 scatter 的点所属的 primitive 和坐标,因此可以用于定位这些点。因此,我们只需要记录下变形前的点的相对位置,就可以让点在几何体变形的过程中附着在点上了。具体步骤如下:

  1. 使用 timeshift / 或者 rest 节点存储原始的几何体的信息。
  2. 对存储后的几何体进行 scattering。
  3. 在 scatter 中导出属性 Prim Num Attribute / Prim UVW Attribute
  4. 使用 Attribute Interpolate 连接原始的几何体(右边)和 目标几何体(插值后的,左边)。

Vop / VEX

如何利用 ptnum 生成圆

的是一个方形如何利用 ptnum 转化圆,而仔细查看以后发现跟是不是方形完全没有关系。这个方法很简单,就是利用 ptnum 除以一个常数,在分别与 sinecose 相乘并作为对应的坐标,就能得到一个圆了。

原理就是利用极坐标系中坐标的定义($(cos(\theta), sin(\theta))$, 假设这里是单位圆)。

这个常数只需要自己调整就好。总的来说分两步:

  • 第一步 resample
  • 第二步 使用 ptnum 生成坐标(VEX在下面)

f@r = @ptnum / `chs("constant")`;
@P = {0,0,0}; //如果不归零会生成某方向上的螺旋曲线
@P.x = cos(@r); 
@P.z = sin(@r);

Rigid Body

Sim

pieces jittering in RBD

将场景 scale 放大,解算后再缩小,可以解决大部分的碰撞 jittering.

Fluid & Volume

FLIP 碰撞体中的粒子处理

问题描述:如何删除 FLIP 模拟中碰撞体内的粒子?

How to Fix:

FLIP 模拟中,默认情况下碰撞体中也会存在 TANK 中的粒子。这些粒子对整个模拟来说是没有用的,但因为其自身也会产生碰撞,所以会给模拟带来额外的消耗。我们可以使用 SDF 来判断粒子的位置来删除指定的粒子:

//sample volume in relation to Point positions, store result.
float volume = volumesample(1, "collision", @P);
//check weather the points are inside or outside the volume
if(volume<ch("threshold")){
//if the value of the volume sample we stored is less than the  threshold channel below then they will be removed
removepoint(0,@ptnum);
}

retime

retime substep + timeshfit / substep

Ocean

快速迭代

关闭 refraction 和 fake caustics 可以极大的增加渲染速度 降低 reflect limit / refract limit (2) 使用 direct light 选择指定的渲染对象