======RBD Object======
**//从指定的几何体创建 RBD 对象。//**
----
该节点用于创建 RBD 对象。
====Attributes====
我们可以在 RBD 对象几何体上建立属性来对其行为进行影响(通过覆盖属性值的方式进行微调)。常用的属性如下:
^Name^Class^Tpye^Description^
| friction | Point | Float |指定每一点的静摩擦力,会覆盖 fraction 属性组。|
| dynamicfriction | Point | Float |指定每一点的动摩擦力,会覆盖 dynamicfriction 属性组。|
| bounce | Point | Float |指定每一点的弹力,覆盖 bounce 属性组。|
| nopointvolume | Point | Int |TBC|
| nodegevolume | Vertex | Int |TBC|
====Parameters====
| Creation Frame Specifies Simulation Frame | 决定当前的 create frame 是参考于 ''$F'' 还是 ''$SF''。''$SF'' 被 DOP 层级的 offset time / scale time 影响。|
| Creation Frame |指定对象被创建的帧。**只有在该值等于当前帧时,对象才会被创建。** 某些情况下我们会使用浮点帧,比如 ''3.5'',那么如果我们的 time-step 的倍数不能正好等于该帧数,那么对象就会无法被创建。这种情况下,我们需要对 time step 进行调整,使其适应该指定的帧。|
| Number of Objects |建立一系列同样的对象。使用 ''$OBJID$'' 来选取指定的对象。 |
| Object Name |被创建对象的名称。可以在 detail view 中查看,也可以在外部引用。\\ \\ 对象名可以重复。因此如果有很多名称相同的对象存在,我们应该使用 //$OBJID// 作为对象名(前缀 / 后缀 加自动编号方式)。|
| Solve On Creation Frame |对于新创建的对象,该选项决定该对象的对应解算器是否要在该对象生成的 time-step 内对其开始解算。通常情况下,如果模拟在模拟中创建对象(而不是在模拟的初始状态下创建),那么该选项需要打开。|
| Allow Caching |该选项可以让我们选择对模拟文件不进行 caching,推荐在较大规模模拟的时候使用。 |
| SOP Path |指定需要被创建为 RBD 对象的几何体在 SOP中的路径。该路径可以是一系列的路径,也可以是其他的元素。 \\ \\ 如果某个路径存在多个对应的 SOP,那么模拟会为每个对应的 SOP 创建指定的对象。|
| Use Deforming Geometry |开启该选项后,DOP 会在每个 time step 之间对 SOP 中的几何体信息进行一次抓取,如果几何体带动画,那么创建的 RBD 对象也是带动画的。\\ \\ 如果该选项启用,那么我们也应该在**解算器**中开启 ''Use Point Velocity'',这样才能正确的计算碰撞反馈。 |
| Use Object transform| 与 Use Deformation Geometry 类似,将已存在的 OBJ 层级的 Transformation 应用到当前RBD 对象上。\\ \\ 如果只需要应用位移(movement),那么使用 ''Object Position'' 节点即可。|
===Initial State===
| Angular Velocity|该速度的值等于**旋转轴乘以旋转率**,单位为 degree / sec,也就是 360 等于每秒旋转一次。|
| Inherit Velocity from Point Velocity |通常从外部导入的运动几何体,我们并不知道其精确的速度和角速度。如果选中了该选项,那么几何体的点速度属性会被用于计算该几何体对应对象的速度和角速度。|
===Glue===
| Glue to Object |当前对象将要 glue 的对象。如果留空,那么当前对象则像一般 RBD 对象使用。如果 glue 的对象与当前对象之间有相互作用,那么该对象将与指定 glue 的对象粘粘。两者的相对距离由解散器决定。|
| Glue Strength |打破当前 glue 需要的力。''-1'' 代表 glue 不会被打破,''0'' 会导致 glue 会在第一次受力的时候会被打破。|
| Glue Impulse HalfLife |打破 glue 的的力是一个累积力。当 glue 每次被撞击的时候,glue 都会累积该力(glue impulse force)。该选项控制 glue impulse force 衰减到一半的时间。|
===Collisions===
//注:业界目前流行的是 Bullet 引擎,因此不用花过多时间在 RBD 相关内容上。//
==Volume==
| Use Volume Based Collision Detection |开启该选项将导致 RBD 解算器使用当前对象的 volume rep 来进行碰撞检测。\\ \\ Volume rep 的优点是可以很快的获得碰撞检测的结果;并且得到的结果很稳定(tolerant of temporary interpenetration, TBE)。其缺点是 volume rep 不能用于表示**平**的对象,比如 grid, hollow sphere。\\ \\ 当该选项未选中时,碰撞检测则使用基于几何体的方式。在这种情况下,碰撞代码将全程跟踪运动对象的运动轨迹,从而找出碰撞发生的位置。这种模式下得到的结果会更加精确。\\ \\
需要在 DOP Network 中启用 //Cache Simulation// 选项。
|
| Collision Guide|将碰撞检测的结果转化为可视化的几何体。可以控制颜色。|
| Mode(创建碰撞 rep 的方式)| **Ray Intersect**:使用射线与几何体相交来创建 volume rep 的几何体。\\ \\ **Meta Balls**:使用 meta Ball field 来检测碰撞的内部与外部,而不是使用射线。需要关闭 ''Laser Scanning'' 选项。\\ \\ **Implicit Box**:计算几何体的 bounding box,然后使用 volume rep 的方式填充该 bounding box。该 box 总是与 DOP 对象的 local space 坐标对齐。\\ \\ 之前提到过 Use Object transform 将把 OBJ 层级的形变带入到对应的几何体中,并将位置的信息按世界坐标系存储。如果关闭 Use Object Transform,且 OBJ 层级存在形变,那么该形变的信息将直接发送到属于 RBD 对象的本地坐标系中,从而导致该本地坐标系的方向发生变化。\\ \\ **Implicit Sphere**:计算对应几何体的 bounding sphere,使用该球体作为 volume rep。\\ \\ **Implicit Plane**:计算对应几何体的 bounding box,沿着“最小”的坐标轴建立一个平面作为 volume rep。任何低于该平面的部分会被视作几何体的内部,反之为外部。\\ \\ 该模式适用于创建 ground plane,或者不可移动的墙等等。\\ \\ **Minimum**:使用到表面的距离作为 volume 的参考。如果距离为 ''0'',那么不会有 volume 产生。距离为**正**时会在几何体表面附近创建对应“厚度”的体积。该模式适用于将非常薄的物体,或者线转化为实体。\\ \\ **Volume Sample**:该模式下几何体的分辨率将不再作为 volume 的计算条件,取而代之的是 VDB primitive。此时的分辨率作为 voxel 的分辨率,而 volume primitive 被视作 SDF(signed distance field)。该模式假设接受的几何体数据是来自 ISO offset 或者 VDB from polygons。|
|Divisions Method|如果选择的是 **Non Square**,那么指定的大小实际上被以 voxel 为单位划分成了指定的数量单位(divisions)。但这些被划分出来的单元可能大小不一,很可能会导致模拟的变形。\\ \\ 当坐标被指定的时候,该坐标回用于决定划分的数量。该坐标的大小会被划分为 N 等分,用于生成 voxel 以及决定其大小。对于其他坐标系上的划分,Houdini 会使其尽量靠近指定大小的整数倍,从而使其适合指定的大小。\\ \\ 最后,在没有选中的坐标系上,被划分区域的大小会最终呈现为统一大小的 voxels。
* Max Axis 指定选择最长的坐标轴作为细分的参考坐标轴。
* By Size 意味着使用使用 Division size 计算每个划分区域需要的 voxels。
|
|Division|指定 volume rep 的细分程度。|
|Uniform Divisions|指定坐标轴的细分分辨率。调整该参数可以控制整体 volume rep 的细分水平。通过 ''Uniform Voxels'' 选项可以指定哪个坐标轴为细分的参考(通常最好使用 Maxinum axis)。|
|Division Size|Voxel 的大小。|
|Laser Scan|在 Laser Scan 模式中,volume rep 的简历是通过沿着主坐标轴进行发射射线来获取的。Houdini **只**会获取最近和最远的相交位置来决定碰撞区域的内外。在两个相交位置之间的区域属于内部,其他的属于外部。\\ \\ Laser Scan 模式可以处理各种法线不正确、有自我相交区域的,或者可能有漏洞的模型。其缺点在于无法表示内部的内容,因为其不可被探知。\\ \\ 当Laser scan 关闭的时候, volume rep 同样也会沿着主坐标轴发送射线。然而,Houdini 会获取所有相交的位置,对每一对相交点都进行测试。这种测严重依赖被**正确定义**的几何体上的法线(Manifold / 无自我相交的几何体,密封等等)。|
|Fix Signs|因为精度的原因,即便是质量非常好的几何体也会有 Sign 正负不一致的问题。该选项通过对 Volume rep 的结果进行后期修复(比如通过填洞之类的操作)。|
|Force Bounds|//Fix Signs// 选项在修正符号错误区域的同时,也有可能顺带将边界上的 voxel 的符号改变。开启本选项之后会强制设定边界上的区域为外部区域。|
|Invert Sign|有两种方式可以快速的建立一个中空的盒子(//hollow box//)。一种方法是建立大小两个盒子,将小盒子放置到大盒子内部,并不使用 //Laser Scanning//。另外一种更加稳定的方式是对内部的小盒子使用本选项。这会将所有在小盒子外部的部分作为内部,从而方便之后的 //Laser Scanning// 得到更稳定的结果。|
|Sign Sweep Threshold|即便通过 //Fix Signs// 的处理,我们也不能完全保证所有的 SDF 区域都拥有正确的符号。此时我们需要再次进行清理来试图清除这些带有问题的区域。\\ \\ //Sign Sweep Threshold// 决定了在符号的转化中,多大的的幅度会被考虑为“不一致”(inconsistent)的转化。如果 SDF 的改变幅度超过了该上限与 voxel 宽度的乘积,那么该改变会被认为是无效的。最后,我们使用射线相交的方式来检测当前几何体的内部外部,并用该结果作为标准决定哪些符号是有效的(正确的)。|
|Max Sign Sweep Count|通常情况下,符号清理的过程会持续到没有符号翻转的时候,或者清理的次数达到该上限。太低的 //sign sweep threshold// 可能会导致该过程难以收敛。|
|Offset Surface|SDF 会按该常量进行偏移(比如让碰撞的 volume rep 整体变大或变小)。该选项并不能显著的使 SDF 区域变大,变大区域受源几何体的 bounding box 控制。|
|Tolerance|当计算 SDF 的时候,该选项控制射线相交检测的宽容度。(该宽容度值与几何体的大小相乘,得到的结果具有 //[[https://en.wikipedia.org/wiki/Scale_invariance|scale-invariant]]// 的特性。)|
|Proxy Volume|使用另外一个几何体取代源几何体来计算 SDF。该几何体可以是 Volume、VDB,在某些情况下可以更好的掌控数据的缓存。|
|File Mode|处理 volume 数据的方式。需要处理的数据类型为 ''*.sim'' 文件(不会保存 bgeo)。\\ \\ **Automatic** \\ 如果 //File// 选项中存在路径,则从硬盘中读取缓存。否则使用本节点的设定创建 volume。\\ \\ **Read Files**\\ 读取磁盘文件。\\ \\ **Write Files**\\ 使用本页设定创建体积并写入磁盘 \\ \\ **No Operation**\\ 不指定任何读写操作,使用本页面设定创建体积。|
==Surface==
| Surface Representation|该选项可以选择使用 //Points// 或者 //Edge// 作为 volume rep 的碰撞参照。\\ \\ 除此之外,该选项还提供了两个属性 ''nopointvolume'' 和 ''noedgevolume'',该两个属性可以添加到目标几何体上,使指定的点和边不再参与到碰撞检测中(如果组成边的两点都没有参与碰撞检测,那么该边也不会)。|
| Convert To Poly|将目标几何体中的 //Primitives// 转化为 //Polygon//,且只有 //Polygon// 会被用于碰撞检测。|
|LOD|//Level Of Detail//,控制三角细分的精度。该选项主要用于指定点的密度(在 //UV// 坐标系中)。|
|Add Barycenters|允许每个多边形的重心参与碰撞检测。|
===Bullet Data===
|Show Guide Geometry|使参与碰撞的区域可视化(包括 //Collision Padding//)。该选项在 debug 的时候较为方便,但会降低解算的速度。|
|Color|指定 Guide 的颜色。|
|Deactivated Color|(限 //Bullet Solver//)指定没有移动且没有被激活的的对象的颜色。|
|Geometry Representation|(限 //Bullet Engine//)该选项用于指定代表碰撞个体的形状。\\ \\ ** Convex Hull**\\ 默认的对象形状。//Bullet Solver// 将使用对象几何体的点创建碰撞的形状。\\ \\ **Concave** \\ 在该模式下,//Bullet Solver// 将会把几何体转化为多边形,并且基于多边形的三角面来创建碰撞的形状。该选项在模拟凹面物体的时候很有用,但 Houdini 只推荐在必要的时候使用该选项,因为相对于该选项,//Convex Hull// 的速度要快很多。\\ \\ **Box / Capsule / Cylinder / Sphere**\\ 使用对象的 bounding 形状作为碰撞形状。\\ \\ **Compound** \\ 使用 Bullet primitives 创建复杂的几何体,并作为碰撞形状(需要 //Bake ODE SOP//)。\\ \\ **Plane**\\ 使用地面作为碰撞形状。|
|Create Convex Hull Per Set Of Connected Primitives|当使用 **Convex HULL** 生成碰撞形状的时候,//Bullet Solver// 会为复杂形状中的**相连的**每一个 primitive 创建一个单独的碰撞形状。|
|AutoFit Primitive Boxes, Capsules, Cylinders, Spheres, or Planes to Geometry|开启该选项之后,houdini 将使用对象几何体的子数据来对其进行分析。如果是简单几何体(primitives)或者是 Plane,将使用 bounding 来创建形状。|
|Collision Padding|该属性控制形状之间的填充距离。使用该选项我们可以更好的控制 Bullet 解算的可靠性和性能。需要注意的是,padding 功能会增加碰撞形状的大小,因此最好开启 ''Shrink Collision Geometry'' 来防止碰撞大小的增加。\\ \\ 该选项对 Plane 类型的几何体无效。|
|Shrink Collision Geometry|该选项用于阻止因 ''Collision Padding'' 导致的碰撞形状的增大。\\ \\ 该选项可以通过阻止非常靠近的形状的穿插,和除去因 ''Collision Padding'' 导致的对象之间的间隙,来提高解算的稳定性和表现。\\ \\ 当使用 //Primitives// 作为几何表现的时候,''Shrink Amount'' 会直接作为减数应用到对应形状的半径 / 长度上。\\ \\ 当使用 //Convex Hull// 作为几何表现的时候,所有的多边形将往**内**“平移”,平移量等同于 ''Shrink Amount''。\\ \\ 该选项对 //Concave// 和 //Plane// 无效。 |
|Add Impact Data|开启该选项将记录所有的 //Impacts// 和 //Feedback// 数据。|
|Enable Sleeping|开启该选项后,所有没有移动的对象均不参与到模拟中,直到这些对象再次移动。Houdini 通过线速度和角速度来判定对象是否移动。(可以看到对象在没移动的情况下的颜色是未激活颜色)。|
|Linear Threshold|线速度低于该上限的对象将被视作没有移动。|
|Angular Threshold|角速度低于该上限的对象将被视作没有移动。|
===Physical===
|Compute Center of Mass|该选项开启后会自动计算对象的质心(center of Mass)。 // //
质心和重心比较相似,但是有区别。重心由重力场定义,在均匀重力场中,质心的位置与重心相同。但在无重力的情况下,重心没有定义,但质心依然存在。
|
|Center of Mass|如果不开启自动计算质心,那么使用指定的值作为质心。需要注意的是,对象旋转的时候,其中心点就是质心,因此我们可以利用这一点来使对象往指定方向倾斜。|
|Compute Mass|决定是否要计算对象的质量。|
|Density|质量等于密度乘以体积。默认的 1000 指的是 $1000cm^3$,也就是水的密度。|
|Mass|对象的绝对质量|
|Rotational Stiffness|当对象收到一个倾斜方向上的力,通常它会旋转。旋转的程度取决于对象的形状和质量的分布(被称为 //Inertial tensor//,惯性张量)。\\ \\ //Rotational Stiffness// 会作为一个乘数应用到 //Interial tensor// 上。该值越高,对象**越不容易**旋转;反之越容易。|
|Bounce|对象的弹力。''1.0'' 代表不会失去任何能量,''0.0'' 会失去所有能量。|
|Bounce Forward|(可能等同于 shearing elastic stress,未确定)。 对象的 tangential elasticity。 如果该参数为 ''1.0'',则切线方向的移动只受摩擦力印象。如果是 ''0.0''那么两个对象的切线移动将一致。|
|Friction|对象的//摩擦系数//。''0'' 代表对象是**绝对光滑**的。该参数同时影响对象碰撞后的切线速度([[https://study.com/academy/lesson/what-is-tangential-velocity-definition-formula.html|tangential velocity]])。|
|Dynamic Friction Scale|相比静止的对象,滑动的对象通常拥有更大的动摩擦系数。该系数与静摩擦系数不同,但在 Houdini 中可选取的范围也是 ''0-1''。当该参数为 ''1'',意味着动摩擦力等同于静摩擦力。''0'' 意味着只要克服了静摩擦力,该对象将像没有摩擦力一样运动。|
||Temperature|//Temperature// 决定对象的冷热程度。该选项用于在烟雾解算中指定 fuel 的燃点,或者用于浮力计算。\\ \\ 需要注意的是,该温度并不与真实世界的温度挂钩。在该温度的度量下,环境温度(室温)通常被认为是 ''0''。|
====Useful Locals====
* **ST**:记录某个节点总共被模拟了多少时间。该变量保证了模拟是从 0 开始的。
* **SF**:记录某个节点总共被模拟了多少帧,该变量不等同与 ''F'',而是等同于 ''ST / timestep''。
* **SNOBJ**:模拟中对象的总数。好的使用方法:''object_$SNOBJ''。
* **NOBJ**:当前 timestep 中 参与模拟的对象总数。该变量会返回 ''0'' 当前节点处理的对象对象并不是按序列被处理的。
* **OBJ**:被当前 Node 处理对象的编号。该编号指定当前对象在处理序列中的位置,但并不会验证当前对象是否处于模拟中。该变量适用于为每个对象生成随机的编号,或者将对象简单的分成好多个组。
* **OBJID**:每个被处理的对象拥有的唯一ID。当对象被处理时,每个对象都被指定一个唯一的整型编号。处理完毕之后,该编号将不再被复用。\\ \\ 该变量适用于如果我们想对不同对象进行不同的处理,同时也适用于寻找特定的对象并进行操作。
* **OBJNAME**:当前被处理对象拥有的名字(string value)。\\ \\ 该名字并不是唯一的;不过如果我们可以手动的为对象指定唯一的名字,那么该变量实际上比 ''OBJID'' 要更加直观。\\ \\ 该变量也可以用于一系列类似的物体(通常这些物体都拥有同样的名字),并将其视作一个组。比如:我们需要特别处理一个组的对象 ''myobject'',让其在指定的位置激活。如果这些对象的名字都相同,那么我们就可以使用:''stracmp(OBJNAME, ''myobject'') == 0'' 的表达式来对其进行激活了。
====参考资料====
* [[http://www.sidefx.com/docs/houdini/nodes/dop/rbdobject.html#physical|RBD Object dynamics node]]