【Unity】Obi插件系列(八)—— Obi Softbody

Softbody blueprints

  • 有2种不同的软体蓝图。这两种类型的蓝图都可以赋给ObiSoftbody actor
    1. Surface softbody:会在网格顶点位置随机分布粒子,确保它们不重叠,对它们进行定向和缩放,以尽可能接近表面形状。结果的视觉效果很好,计算成本也相对较低,不过如果网格很厚,模拟的结果会显得很 “空洞”。这是因为只模拟了网格的表面。【Unity】Obi插件系列(八)—— Obi Softbody
    2. Volume softbody:软体网格是像素化的,在每个“像素”的中心放置一个粒子。这比表面软体产生的粒子要多得多,因为它还会在网格内部产生粒子,但如果需要精确的体积效果,额外的成本可以得到更好的效果。【Unity】Obi插件系列(八)—— Obi Softbody
  • 要生成基本的软体蓝图,请转到Assets->Create->Obi->Softbody surface/volume blueprint,或右键单击项目文件夹并选择Assets->Create->Obi->Softbody surface/volume blueprint。
  • 软体模拟和渲染是由两个独立的组件来处理的。ObiSoftbody(模拟)和ObiSoftbodySkinner(渲染)。前者生成一个基于粒子的网格表示。后者则是将一个任意的网格蒙皮到基于粒子的表现形式上,使它们一起移动和变形。
  • 使用两个独立的组件可以让你分离模拟和渲染,这在很多时候是非常有用的。另外,请注意,你并不是非要为每个ObiSoftbody使用一个ObiSoftbodySkinner。你可以使用多个ObiSoftbodySkinners将多个网格Skinner到一个软体上。

Generating a blueprint

  • 软体蓝图需要一个网格作为输入。任何网格都可以使用,包括non-manifold meshe和polygon soups。
  • 当你按下蓝图inspector中的 "生成 "按钮时,将使用网格表面或体积(取决于软体类型)生成颗粒,然后生成形状匹配的簇。簇网络是将粒子固定在一起的,并模拟弹性和塑性。让我们来看看控制粒子和簇生成的所有参数。
    1. Input Mesh:软体组件中的 "输入网格 "插槽允许我们指定使用哪种网格来生成粒子。
    2. Particle Radius:这是控制软体质量/性能比的主要参数:一个非常小的半径将导致许多粒子被添加到网格表面(与输入网格中的顶点一样多)。较大的数值将导致网格的采样粗糙。
      2-1: 使用很多小颗粒会需要相当密集的形状匹配簇网络来实现刚度。所以间接地,你的软体中颗粒的数量也会影响它的刚度:颗粒多会导致软体,颗粒少会导致刚体。
    3. Particle Overlap:颗粒之间允许重叠的百分比。较大的数值将确保通过生成更多的颗粒,使输入网格表面覆盖更彻底。0.5-0.7的数值通常是覆盖率/性能的最佳点。
    4. Shape Smoothing:粒子播种前应用于网格的拉普拉斯平滑量。大的数值可以帮助表现细小的特征,如天线和带有线性粒子链的肢体。
    5. Anisotropy Neighborhood:计算粒子的形状和方向时,考虑到每个粒子周围的半径。接近或略大于粒子半径的数值会得到良好的结果。
    6. Max anisotropy:粒子的最长轴和最短轴之间的最大比率。大值将导致非常明显的椭圆体形状,小值将导致更多的球形颗粒。
    7. Soft cluster radius:每一个粒子周围的半径,在将该粒子与周围的粒子联系起来时,会考虑到这个半径。粒子半径的2-3倍的数值通常会得到良好的结果。
      7-1. 在 "可视化 "折页中启用 "形状匹配约束 "渲染模式,以获得软体的形状匹配集群网络的视觉反馈。【Unity】Obi插件系列(八)—— Obi Softbody
      7-2. 如果你的软体的部分在运行时散架了,这意味着你的集群网络是零散的。使用更大的软体集群半径来确保所有集群相互重叠。
    8. One Sided:如果启用,使用单面粒子来帮助进行碰撞检测。常规粒子会按照粒子表面最短路径的方向投射重叠体,而单面粒子则使用软体网格表面的最短路径。
  • 生成是一个过程可能需要相当长的时间。一旦完成,编辑按钮将被**。按下它,你将进入cloth blueprint editor。

Softbody blueprint editor

  • 软体蓝图编辑器中主要有三种模式,可以通过顶部的3个按钮进入。

    1. Particle selection
    2. Property painting
    3. Texture import/export
  • Particle selection【Unity】Obi插件系列(八)—— Obi Softbody

  • Selection/editing:在粒子选择模式下,你可以选择粒子来修改它们的属性,创建粒子组,并生成簇。要选择粒子,请在场景视图中点击并拖动它们。要取消选择粒子,请按住shift键同时拖动。

  • 你可以通过拖动画笔大小滑块来改变画笔大小。您可以将粒子剔除模式更改为三个选项之一:

    1. Off:所有的粒子都将被绘制并可选择。
    2. Back:背对镜头的粒子不会被绘制,也不能选择。
    3. Front:朝向相机的粒子不会被绘制,也无法选择。
  • 还有一些可用的工具对当前的选择进行操作:

    1. Invert selection:反选
    2. Clear selection:清除选择
    3. Optimize selection:删除所有选定的粒子,这些粒子与任何未选定的粒子没有共享约束。当你打算将一组粒子附加到一个变换上,并想删除那些在附加后不会对模拟做出贡献的粒子时,这个功能很有用。
      3-1. 在优化之前【Unity】Obi插件系列(八)—— Obi Softbody
      3-2. 优化选择后,只剩下被选择的粒子与未选择的粒子共享约束。【Unity】Obi插件系列(八)—— Obi Softbody
    4. Remove selection:删除所选
    5. Restore removed:将使所有因优化或删除而删除的颗粒恢复。
  • 你可以获取/设置当前选定粒子的任何属性:

    1. Mass:质量
    2. Radius:半径
    3. Phase:相位
    4. Color:颜色
  • Particle groups:你可以将那些对你有特殊作用或意义的粒子分组。例如,你可以将矩形布片四角的4个粒子创建一个组,以便以后将其挂在另一个对象上。分组主要用于创建粒子附件时,但也可以在运行时在自定义脚本中访问。

  • 要从当前选择中创建一个新组,只需按列表右下角的 “+“按钮。要删除一个组,从列表中选择它并点击”-”。您也可以通过点击选择按钮选择该组中的所有粒子(使用shift键多选组也可以),您可以通过点击设置来替换当前选择的粒子。

  • Visualization:所有三种蓝图编辑器模式(选择、绘制和贴图导入/导出)都有一个可视化选项部分。在这里,您可以更改渲染模式,该模式决定了应在场景视图中绘制的元素。一些选项是:

    1. Nothing:只渲染粒子选择手柄
    2. Everything:所有的渲染模式都会同时启用
    3. Particles:粒子被完全渲染,显示其形状、大小和颜色。
    4. Mesh:用于生成蓝图的源网格被渲染。当前选定的粒子属性被用来驱动顶点颜色。
    5. Shape matching constraints:让你可视化当前形状匹配的集群网络
  • 当网格渲染模式处于活动状态时,当前选择的属性(质量、半径等)会被映射到一个颜色梯度上,并用于绘制网格。默认情况下,计算出最小和最大属性值,并将其值映射到颜色梯度上。

  • Property painting【Unity】Obi插件系列(八)—— Obi Softbody

  • 在属性绘制模式下,可以使用画笔工具直接在软体表面绘制粒子属性。绘制时建议启用网格渲染模式来工作

  • 画笔有一个内半径和一个外半径。内半径内的画笔不透明度可以通过改变画笔不透明度值来设置。不透明度在内半径外平滑衰减,在外半径处达到零

  • 大多数属性提供3种模式:

    1. Paint:将当前的属性值移到proprerty字段中设置的值。刷子的不透明度决定了值向目标值移动的速度
    2. Add:将属性字段中设置的值添加到网格中的属性值。同样地,画笔的不透明度决定了改变数值的速度。您可以按住键盘上的shift键来减去而不是添加
    3. Smooth:平滑
  • Selection mask:如果当前有一些粒子被选中,可以启用选择遮罩。当选择遮罩**时,画笔将只作用于被选择的粒子。如果您只想绘制网格的某些部分,这很有用。

  • Texture import/export【Unity】Obi插件系列(八)—— Obi Softbody

  • 你可以使用这些工具将任何属性导入/导出到纹理

  • Import:当从纹理加载属性值时,我们需要知道如何将像素值映射到属性值。Obi从0-255像素值范围线性映射到用户定义的属性值范围。

    1. Source: 用于读取属性值的纹理。
    2. Source channel:虽然有些属性(如颜色)使用了所有4个纹理通道(红、绿、蓝和阿尔法),但大多数属性(质量、半径…)都是浮点值,所以只需要一个纹理通道来存储/检索它们。使用这个下拉菜单,你可以选择从哪个通道读取数值。
    3. Min value:从像素中读取的属性值,值为0
    4. Max value:从像素中读取的属性值,值为255
  • Export:导出颜色属性时,会使用所有4个纹理通道。导出浮点属性时,网格中的最大属性值被映射为白色像素(255),最小值为黑色像素(0)。值总是存储在红色纹理通道中。

    1. Texture width:纹理的宽度
    2. Texture height:纹理的高度
    3. Padding:UV接缝处的像素填充量。确保从纹理导入数值时,在UV接缝处读取准确的数值
  • 导出的粒子半径没有填充【Unity】Obi插件系列(八)—— Obi Softbody

  • 导出的粒子半径以16个像素为填充【Unity】Obi插件系列(八)—— Obi Softbody

Softbody skinning

  • 软体模拟和渲染是由两个独立的组件来处理的。ObiSoftbody(模拟)和ObiSoftbodySkinner(渲染)。前者生成一个基于粒子的网格表示。后者则是将一个任意的网格蒙皮到基于粒子的表现形式上,使它们一起移动和变形。
  • 使用两个独立的组件可以让你解开模拟和渲染,这在很多时候是非常有用的。另外,请注意,你并不是非要为每个ObiSoftbody使用一个ObiSoftbody皮肤。你可以使用多个ObiSoftbodySkinners将多个网格剥皮到一个软体上。
  • Obi Softbody Skinner:该组件对目标 SkinnedMeshRenderer 的软体粒子进行自动Skinned。这是通过搜索离每个网格顶点最近的粒子并分配基于距离的权重来实现的。您可以使用以下参数来控制距离权重的执行方式:【Unity】Obi插件系列(八)—— Obi Softbody
    • Target:用于skinning的SkinnedMeshRenderer
    • Skinning Falloff:skinning的强度。数值为1表示线性回落,数值越大回落指数越大,从而使更接近顶点的粒子获得更多权重。
    • Skinning Max Distance:skinning时考虑每个顶点的最大距离。比这个距离更远的粒子将不被考虑。
  • 点击 "绑定皮肤 "后,Obi就会给软体颗粒的网状物套上皮肤。

Character softbodies

  • 您可以使用 Obi Softbody 组件有选择地对 SkinnedMeshRenderer 的任何部分进行软体化。要做到这一点,你需要:
    1. 在一个单独的GameObject中设置ObiSoftbody组件
    2. 将ObiSoftbodySkinner组件添加到SkinedMeshRenderer中,然后将SkinedMeshRenderer拖动到其 "目标 "槽中
    3. 在SkinedMeshRenderer中,将软体对象的父对象添加到任何骨头上,并根据需要定位
    4. 初始化ObiSoftbody。修正任何你不想成为软体模拟的一部分的粒子。然后,绑定ObiSoftbodySkinner
  • 需要注意的是,目前你不能在一个顶点中混合动画和模拟,不像在ObiCloth中可以。软体角色中的顶点要么由动画驱动,要么由模拟驱动,而不是两者兼有。
  • 让我们重新创建ObiSoftbody中包含的ElasticCharacter演示场景。这个角色的手臂是由软体模拟驱动的,而其他部分则是纯动画的。首先,我们要创建一个新的软体蓝图。在项目文件夹中点击右键,Create->Obi->Softbody surface blueprint。然后,选择角色网格作为蓝图的 "输入 "网格,调整生成参数,点击 “生成”。生成完成后,点击 "编辑 "进入蓝图编辑器。
  • 由于我们只希望手臂是软体化的,所以我们将选择除了手臂上的颗粒以外的所有颗粒:【Unity】Obi插件系列(八)—— Obi Softbody
  • 然后点击优化选中的按钮,除了那些与胸骨共享群组的粒子外,将它们中的大部分粒子去掉。然后,我们将从这些仍然被选中的少数粒子中创建一个粒子群,因为我们以后要把它们附加到胸骨上。【Unity】Obi插件系列(八)—— Obi Softbody
  • 由于我们希望在角色移动时能够控制惯性力,我们将在角色的根部添加一个ObiSolver。另外,不要忘记在ObiFixedUpdater中加入它,这样模拟就会更新。
  • 现在是创建软体actor的时候了。选择角色的根部,进入GameObject->3DObject->Obi->Obi Softbody,会自动创建一个软体actor作为角色根部的子代。然后,将我们之前创建的蓝图分配到它的蓝图槽中。【Unity】Obi插件系列(八)—— Obi Softbody
  • 我们需要确保胸部粒子(支撑手臂的)连接到骨头上。所以我们在软体上添加一个ObiParticleAttachment。然后,将胸骨分配到它的目标槽,并在下拉菜单中选择 "胸 "粒子组。这将确保胸部粒子跟随胸部骨骼。【Unity】Obi插件系列(八)—— Obi Softbody
  • 因为我们希望角色手臂由软体模拟驱动,所以我们需要将网格绑定到软体上。在角色的SkinedMeshRenderer中添加一个ObiSoftbodySkinner组件,并将ObiSoftbody分配到它的Source softbody插槽中。然后,点击绑定皮肤。
  • 你可能需要在绑定之前调整皮肤器的最大距离参数,以确保只有离软体粒子非常近的顶点才会被绑定到它。过大的falloff会导致远离软体粒子的顶点被模拟驱动,这可能是不需要的行为。【Unity】Obi插件系列(八)—— Obi Softbody