======Houdini TIPS====== //Houdini 使用相关 Tips//\\ //Ver 19.5// ---- ====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 新版本 houdini 中可以使用 ''match size'' 达到同样的效果。 ===反选 Group 中的元素=== **问题描述**:选择不属于 group 中的元素。 \\ \\ //How to Fix//: * 使用 ''blast'' 节点删除 group 中的元素 * 使用 ''split'' 节点分离 group 中的元素 ===将一组属性 Remap 到 [0,1]=== **问题描述**:如何将一组属性 Remap 到 $[0,1]$? \\ \\ //How to Fix//:我们可能首先想到的是使用 ''fit'' 对属性进行 remap。但 ''fit'' 需要我们指定源属性的范围,因此我们需要首先找到源属性的最大最小值。 \\ \\ ''Attribute Promote'' 节点允许我们找出当前属性中的最大最小值。因此,我们可以利用这点来确定原属性的范围: - 首先使用 ''Attribute Promote'' 将源属性分别按 ''Maximum'' \ ''Minimum'' 的方法进行 Promote。注意需要关闭 ''Delete Original'' 选项,这样我们才能重复使用源属性。 - Promote 的属性转换方式我们选择从源属性的类型到 ''Detail''。同时将转换后的属性重命名为 ''Min''、''Max''。到此为止,我们就有了两个 ''Detail'' 的属性,分别存储了源属性的最大最小值。 - 使用 ''fit'' remap 源属性。 ===随机化 Attribute Transfer 的范围=== **问题描述**:如果控制 ''Attribute Transfer'' 的影响范围? \\ \\ //How to Fix//:在 Attribute Transfer 中,控制该范围的主要数据是(以点为例)是源点到被传输的表面的距离。该距离的随机化可以通过一个随机化的标量与法线相乘得到。 \\ \\ 需要注意的是,该距离越大,也就是源点离目标表面越远,Attribute Transfer 的范围就越小。因此在某些情况下我们需要进行反转。 \\ \\ 具体步骤(以点为例): - 首先建立 Distance 属性用于存储源点到表面的距离。我们基于**法线**来随机化该距离:''rand(@ptnum) * @N''。 - 创建一个 multiplier 乘到之前的 Distance 上。 ===让 Scatter 的点附着在变形的几何体上=== **问题描述**:如何让 scatter 的点附着在有变形动画的几何体上? \\ \\ //How to Fix//:在默认情况下,如果我们对某些带动画的几何体进行 sacttering, 生成的点是不会随着动画的变形而移动的,就像是下面这种情况: {{ :vfx:houdini:miscs:scatter_points.gif |}} 对于这种情况我们有两种解决方法。但不管哪一种解决方法,我们都需要使用两个 ''scatter'' 节点产生的属性:''Prim Num Attribute'' / '' Prim UVW Attribute''。这两个属性代表了 scatter 的点所属的 primitive 和坐标,因此可以用于定位这些点。因此,我们只需要记录下变形前的点的相对位置,就可以让点在几何体变形的过程中附着在点上了。具体步骤如下: - 使用 ''timeshift'' / 或者 ''rest'' 节点存储原始的几何体的信息。 - 对存储后的几何体进行 scattering。 - 在 scatter 中导出属性 ''Prim Num Attribute'' / ''Prim UVW Attribute''。 - 使用 ''Attribute Interpolate'' 连接原始的几何体(右边)和 目标几何体(插值后的,左边)。 **Example Files** \\ {{ :vfx:houdini:miscs:scatter_in_deforming_geo.hip |}} ===拷贝物体(随机大小)=== **问题描述**:在使用 copyToPoints 的时候,如何使被拷贝物体的大小随机? \\ \\ //How to Fix//: * 如果只是需要 Uniform scale 的话,使用 ''pscale'' (float)变量控制大小即可。 * 如果需要三维均随机,则需要使用 ''scale'' (vector)变量。 * 配合 ''attribute randomize'' 节点使用更佳 ===拷贝物体(随机旋转)=== **问题描述**:在使用 copyToPoints 的时候,如何使被拷贝物体的方向随机? \\ \\ 点拷贝的过程中,几何体的旋转方向由两个因素决定: * 方向的确定:由 ''up'' 向量与 ''normal'' 向量决定 * 方向的指向: ''copy to point'' 会使用法线 ''@N'' 方向匹配之前模型 ''+z'' 的方向,使用 ''@up'' 向量的方向匹配之前 ''+y'' 的方向。 以 houdini 自带的猪头为例子。默认情况下,猪头的鼻子是朝着 ''+z'' 方向的。如果将其拷贝到一个 grid 上,默认情况下 grid 上的点法线是朝上的,也就是 ''(0,1,0)''。此时如果进行拷贝,那么 gird 上的 ''N'' 会以猪头模型的 ''+z'' 方向为准进行拷贝,因此得到的拷贝结果猪鼻子都会朝上,也就是所谓的 N 对应 ''+z''。\\ \\ 如果此时需要指定旋转,那么必须加入 ''@up'' 向量。''N'' 已经定义了 ''+z'',''up'' 向量会定义 ''+y'',因此猪头的旋转就固定下来了。 //How to Fix//: 通常情况下有两种解决方案: * 如果需要几何体的位置与拷贝点位置的关系固定,那么用 ''@up + @normal'' * 如果只需要旋转随机,那么使用 ''@orient'' ''@orient'' 是四元数,因此 ''attribute randomize'' 需要设定为四维向量。同时,distribution 中的 Direction or Orientation 的选项可以更好的配合 ''@orient'' 使用。 Ref:[[https://www.sidefx.com/docs/houdini/copy/instanceattrs.html|Copying and instancing point attributes ]] ===改变多边形的面数=== **问题描述**:如何改变几何体的面数?\\ \\ //How to Fix//: ==将临近的点合并== 使用 ''fuse'' 的 ''Snap Distance'' 选项可以合并相邻的点,从而达到减少几何体面数的目的。 ==按照百分比减少几何体的面数== 使用 ''poly reduce'' 节点中的 ''percent to keep'' 选项即可;有几种方式可以选择。 ==重建几何体面数== 使用 ''remash'' 节点即可。 * 如果希望在不改变几何体形状的前提下提升细节,选择 ''Edge-length: Adaptive'' * 多个几何体同时存在的情况下,可以使用体积的方式重建几何体,使用 ''remesh to grid'' 节点即可。该节点与之前的 VDB 工作流程类似。 ==筛选复杂几何体中的指定部分== * 可以使用 ''measure'' 计算指定几何体的特性(比如面积)筛选出不需要的部分,再删除掉。(需要选择 ''pre piece'' 来选择分离的几何体) ====Vop / VEX==== ===如何利用 ptnum 生成圆=== 的是一个方形如何利用 ''ptnum'' 转化圆,而仔细查看以后发现跟是不是方形完全没有关系。这个方法很简单,就是利用 ''ptnum'' 除以一个常数,在分别与 ''sine''、''cose'' 相乘并作为对应的坐标,就能得到一个圆了。 \\ \\ 原理就是利用圆的定义($(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 ===retime=== retime substep + timeshfit / substep ====Ocean==== ===快速迭代=== 关闭 refraction 和 fake caustics 可以极大的增加渲染速度 降低 reflect limit / refract limit (2) 使用 direct light 选择指定的渲染对象