前言

  最近手头上有了新的工作,需要我去做角色的表情绑定。
  虽然之前在华强做了半年的表情。
  不过我做的事情是驱动开发,其实和绑定没有太大的关系。
  虽然理解了华强那一套绑定的精髓,但是没有亲手去实现过。

  最近自己又要成为一个 Rigger 绑定师来做绑定了
  就打算好好研究一下以前学习欠下来的东西。

  我找了不少绑定文件,打算参透不同的绑定系统,结合有用的放到绑定上

  其中我发现有一套的绑定的次级跟随特别牛逼,叫做 Lou Rig

lou_rig跟随效果

  可以看到这套绑定的强大之处在于次级控制器完美跟随模型的运动
  而且次级控制器的控制依然完全跟手。

  以前研究IKFK切换的时候,就是遇到了这个难点没有办法解决,因此才必须使用脚本进行切换,因为如果通过 父子约束 的话,会产生约束循环的问题,直接导致变换叠加。
  如果不明白什么是约束循环,可以试下在一个父子对象的物体下用子物体对父物体进行父子约束。

约束循环

  其实仔细想想就知道,父物体会带动子物体,但是子物体约束了父物体之后,也可以带动父物体,这就变成永动机了(:з」∠)
  因此Maya会发出警告,并且将这个死循环终止。

  但是回过头来看 Lou Rig ,它解决了这个蛋疼的问题。
  而且还不知道用什么方法实现了轴心点持续跟手。

  于是抱着巨大的好奇,我研究了一下整套跟随系统的设置原理。

跟随基本原理

  要实现跟随首先需要完成模型运动位置的追踪。
  在 lou_rig 的绑定文件中是通过曲线包裹变形器实现位置信息的跟踪。

lou_rig曲线

  这里我采用的方法是使用 毛囊 来实现模型运动的跟随。
  其实都为了追踪到 Mesh 节点的变形效果而已,目的是一样的。
  同理也可以使用 rivet 脚本(肌肉系统其实是附带的)

  有了这个运动信息之后就可以通过这里的位置移动来“约束”到控制器上。
  当然直接约束就是典型的永动机了,因此需要耍一些花招。
  我先做一套简单的绑定来测试效果。

我的绑定测试

  我自己做了一个简单的绑定将整个跟随系统简化成一个小球的绑定情况。

我的绑定测试

  下面简单阐述一下这里要做的效果。
  首先是一套蒙皮的绑定效果。
  六根骨骼可以控制这个球体。
  这个被绑定的模型称之为 Skin

我的绑定测试

  接着复制蒙皮的模型,这个模型作为 毛囊 模型用来约束蒙皮模型的骨骼。
  然后通过脚本,根据骨骼的位置计算UV数值,并生成在对应位置生成毛囊。

我的绑定测试

  如此一来毛囊模型就实现将一切的变形效果转换为骨骼驱动附加到蒙皮模型上。
  我们可以给毛囊模型添加 Blendshape 来实现多层次的驱动。
  因为 Blendshape 是叠加 Transformation 的,因此可以将大量的绑定系统集成到一起,而不需要担心变形互相覆盖等等的问题,而且一套不可行也可以利用同样的方法拆成多个来实现。是非常有想象力的绑定方案。

我的绑定测试


  下面就可以通过添加 Blendshape 来驱动 Fol_Mesh ,Fol_Mesh 则通过骨骼蒙皮驱动 Skin 模型。
  于是我简单弄了两套骨骼的绑定,然后通过 Blendshape 加到 Fol_Mesh 上。

我的绑定测试
我的绑定测试

  这样做的好处就是通过少量的骨骼可以控制更大范围的骨骼运动。换言之就是次级控制器。

我的绑定测试

  以上就是整套精简绑定的效果。


  下面可以简单添加两个控制器来控制上面和侧面的次级骨骼。

我的绑定测试

  我想要实现的是侧面的次级骨骼运动的时候,上面的骨骼也可以跟随运动,并且依然可以正确进行次级驱动。

我的绑定测试

  如果我们什么也不做,控制器只能留在原位,但是控制效果的确是我们所想要的。

跟随效果实现

  首先断开上层控制器对骨骼的约束,然后用毛囊对控制的父组约束

跟随效果实现

  这样实现的确可以让控制跟着毛囊进行运动。


  下面重点来了, Low_Rig 是通过表达式来进行输出控制,我这里是通过连接通道的方式。

  根据驱动的层级关系常见一个层级组。
  轴心位置需要和控制器保持一致,并且冻结变化。
  原本这个组应该放到 follow 组之外的,不过可以通过不继承变换放到 follow 组里面,方便管理(如果勾选继承的话,由于follow约束的原因仍然会导致约束循环)

跟随效果实现

  同理 driver 组也是这么操作,只是这里不需要去掉 继承 的勾选了。

  如此就将父子的关系通过通道连接去掉了。
  用 driver 组进行父子约束就不会有约束循环了。

跟随效果实现

  仅仅这样还是不够的,通过上面动图可以看到,这样移动控制器会导致 Double Transformation
  也就是控制器的运动以及上层组的约束驱动两层变换叠加了。
  因此这里需要去掉控制器的位移实现控制跟手效果。
  另外需要注意的是,正常情况下父层级的轴心点也无法跟随子层级,这也是需要解决的问题。

跟手处理

  只需要多加两个组与控制器进行相反位置运动,就可以抵消多出的位移效果。

跟手处理

  同样父层级也需要进行同样的操作。
  这样次级就是完全跟手的,而且父层级也完全没有问题。

  由于父层级控制和控制器之间隔了一个抵消组,于是我尝试修改一下他们之间的层级结构。
  结果这样处理父层级的轴心点就不跟随了(:з」∠)

跟手处理

  最终效果如下↓↓↓

跟手处理

总结

  总算是整理完成了这种次级跟随了
  感觉非常受用,不知道能否通过类似的手段来解决 IKFK 切换的问题。
  这个问题在 功夫熊猫 教程中有详细的阐述 av12415659
  只是当时看完教程不大喜欢教程的解决方案。

2022-7-14 梳理补充

  后面翻看自己的文章居然卡壳了(:з」∠),所以重新整理了一下。

  1. 现将 follicle 和 控制器同步到一个位置
  2. 然后弄一个 driver 同步到 控制器的位置并归零
  3. follicle 约束控制 控制器 的上层 (driver 则不能受 follicle 的影响)
  4. 控制器的数值直接连接到 driver
  5. driver 再约束到骨骼上

这里重点是 骨骼 不受 follicle 的跟随影响,只受控制器的位移旋转影响,但是控制器不能直接约束骨骼,因为会受到上层的跟随影响。
所以这里取巧地弄了一个外部的 driver 控制,将属性控制连接到 driver 上绕过 follicle 的影响。
在通过 driver 来约束到骨骼上。

这样做的结果就是:
follicle 因为其他控制器的运动而运动带动了 控制器,但是控制器自身的数值没有发生变化(上层的父层级变化了),所以没有影响到 driver 和 骨骼 的位置
当直接操控控制器的时候才会让它的数值变化从而驱动到骨骼。
不过这里运动骨骼也会影响到 follicle 让控制器也跟着偏移,导致控制器的偏移 double 了
抵消掉控制器数值带来的偏移即可解决问题。

  另外这只是其中一种 次级 跟随的方案,还有使用 wrap 变形器的方案 或者 follicle 驱动曲线顶点的方案。