此笔记仅为个人平时积累之用,描述并非专业,如有错误恳请指正
前言
我们在上一节【Maya绑定】三点式IK骨架的比例拉伸的实现思路中,实现三点式IK关节的拉伸。IK关节的控制器只有一个(在wrist处,呈现的是父约束),因此我们计算了各段骨长实现拉伸效果。
FK关节拉伸三段控制器,三段控制器的transform节点中的局部变换矩阵Matrix记录了控制器的自己的变换信息,因此不必计算各段骨长。
- 如何移动控制器
我们可以将父级控制器的定位器locator**(定位器是不包含旋转的改变)**去定位子关节的位置,其Matrix传递给子控制器的parentOffsetMatrix
,这样在拉伸的关节的过程中,定位器在移动,控制器也会跟随移动,但不会影响显性的变换。
parentOffsetMatrix
为maya2020新特性,为隐性变换。 - 为什么要专门制作FK拉伸机制
控制器使用父约束之类可以改变driven位置,为什么还专门去添加这种看似无意义的举动。
为了方便说明,可以看两种示例:
情况1,直接使用控制器进行拉伸:
情况2,使用增加的属性stretch比例因子:
这两个例子,区别在于控制器是否保持归零状态。 如果一段关节已经增加了控制器,但想要修改关节位置,正常思路是移动关到预期位置,控制器解除约束,控制器冻结,重新约束。第二种情况则有效避免了这样的情况发生,并且能实现不同比例模型的复用。上一节的目的也是如此。
关节和其控制器层级关系
↑上图大纲选中内容展示的是关节以及关节的定位器。关节的定位器定位了其子关节相对于父关节的相对位置,因此我们把定位器命名为“关节名称_OFF_LOC”
代表了子关节的相对位置(记两段原始骨长为L1,L2)
↑上图大纲选中内容展示的是控制器的层级关系。控制器与关节是点约束关系,但我们在节点编辑器中将控制器的rotate与关节的rotate进行相连。也就是说关节原则上是根据控制器移动和旋转。
伪代码实现
# stretch the bone
shoulder_FK.scaleX = shoulder_FK_CTRL.stretch * shoulder_FK.scaleX
elbow_FK.scaleX = elbow_FK_CTRL.stretch * elbow_FK.scaleX
# translate the off_loc
shoulder_FK_OFF_LOC.transX = shoulder_FK_CTRL.stretch * L1 # at elbow
elow_FK_OFF_LOC.transX = elbow_FK_CTRL.stretch * L2 # at wrist
# fill the parentOffsetMatrix of the Ctrl
elbow_CTRL.parentOffsetMatrix=shoulder_FK_OFF_LOC.matrix
wrist_CTRL.parentOffsetMatrix=elbow_FK_OFF_LOC.matrix
可使用的节点:multDoubleLinear