AEJoy —— 表达式之反向动力学(Inverse Kinematics)【二】【JS】

295 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

效果图

一个使用反向运动学表达式进行绑定的 “cut out” 人物的例子

099.gif

想法

AEJoy —— 表达式之反向动力学(Inverse Kinematics)【一】里,我们研究了 Brian Maffitt 开发的几个反向运动学(IK)表达式。这些表达式非常有趣,但它们有一些非常严格的设置要求。例如,如果你的手臂/腿是垂直方向而不是水平方向,你就必须编辑代码。此外,为了让 IK 链逆时针弯曲,而不是顺时针,你也必须编辑代码。嵌入在代码中的层名,您必须找到它们并对项目进行正确的替换。如果你在将它们连接在一起并应用表达式之前缩放或旋转你的组件,那么事情就就不总是像预期的那样工作。此外,由于手/脚不受链条的其他部分支配(parented),如果你把它们移得离身体太远,它们就会脱离。

我想说,是时候再看看这些表达方式了,看看我们能否让它们变得更健壮、更友好一些。

设计

首先,我们将把任何可能需要修改的东西放在前面的变量块中。这将包括 手臂/腿 部分的层名,一个表示是顺时针还是逆时针弯曲部分的指示,以及另一个以确定表达式是为上肢部分还是下肢部分的指示

由于上肢和下肢的表达式有许多相同的代码,所以将两个表达式合并为一个并使用我们的上/下指示符来选择要执行的代码,这是很有意义的。这样的话,只需要关注一个表达式。

在原始的 IK 表达式中,肢端层(通常是手或脚)通过拖拽来定位 IK 链。在角度计算中,用一个空(Null)层代替肢端。这样做的一个副作用是,你可以很容易地将肢端从下肢移得太远而脱离。为了解决这个问题,我们将把肢端和下肢(父子级连接)parent 起来,并使用一个 “效应器”(effector) 层来进行定位。同样,如果我们让效应器成为一个引导层,我们可以设置它,使效应器在合成中是可见的,但不会被渲染。

让这一切顺利进行的关键是组件的初始设置。在你把身体的所有部分装入合成之后,需要移动每个部件的锚点到那个部件的关节的位置。例如,对于上臂来说,你可以将锚点移动到肩关节的位置。

每个身体部件的锚点被移动到关节的位置

image.png