【blender动作练习生】从零开始的骨骼绑定学习vol.2
从零开始的骨骼绑定:IK,胯部/胸腔/脚部的控制器
IK的引入
大部分情况下,我们通过骨骼控制网格做出动作,需要按照父子级的关系,从上到下逐一去调整相应的骨骼,最终完成动作。这种方式被称作FK(Forward Kinematic,正向动力学)。
实际上FK的方式跟人们正常的思维方式是不同的,以手部运动为例,我们要拿起一个物体,要思考的肯定不是大臂怎么动,小臂怎么动,手怎么动,而是我们要用手把物体抓起来,而且拿到哪里。
总结来说,就是我们需要通过手部的运动反推其父级部分的运动方式,这种方式就被称为IK(Inverse Kinematic, 反向动力学)。
建立IK骨骼
首先我们在手腕处的部分拉出新骨骼,断开父子级关系,并重命名。
为小臂的骨骼添加IK约束,指定目标为上一步新建的IK骨骼。
在这里有一个有点高效的设置,在步长/链长为0的状态下,blender默认的不是IK不起效,而是IK对全部骨骼都起效。
调整链长为2后,IK表现基本正常。
但显然现在手肘这边时不时就会有鬼畜的情况,我们得给手肘这个部分多加一个限制,限制手肘的运动方向。
我们从手肘关节处拉出新骨骼,同样分离父子级关系,重命名骨骼并将其拉远一段距离。(距离太近会影响Ik的方向计算)
设置极向对象骨骼。
绑定极向后可能会出现模型扭转的情况,此时调整极向角度将其摆正。
绑定极向骨骼后的效果:
通过对称做出左边手臂的ik和pole骨骼。
同理,我们对应建立腿部的IK。
自定义IK,Pole骨骼的形状
为了更好地区分,观察IK,Pole骨骼与tgt骨骼。我们在场景中添加一个立方体,并在骨骼属性-视图显示-自定义形状中将对应骨骼的自定义物体调整为新建的立方体。
我们将IK骨骼换成线框立方体,将Pole骨骼换成线框球。
完成骨骼分层,就可以看到清晰的控制用骨骼了。
控制器的引入
手脚的动作特性上,我们是希望通过边缘的运动来反向计算相应的肢体的动作,这样比较符合我们运动的目的(如持握物体,抬脚踢腿等)。
胯部的控制器
对于躯干来说,则没有太多实现反向控制的需求。
但目前来说也存在问题,在blender的骨骼逻辑下,骨骼只能围绕尾端点进行旋转运动,从而带来了相对奇怪的动作效果。
兄弟们可能不太看出来奇怪的地方,主要是按人体运动的规律来说,提胯/胯部运动的发力点不应该是那个位置,或者说那个位置发力的时候运动的部位其实不太对(疑车无据)。就正确的发力位置(旋转位置)来说,更加接近于目前运动这跟骨骼的顶端。
所以我们希望通过顶端来旋转hip这跟骨骼。
实现方法很简单,直接增加一根与hip方向相反的骨骼,并挂上父子级关系。
在较大的旋转角度下就会看出差别,主要是整个胯部的形状在较大角度的运动下还能保持的比较完整。
为了实现胯部的独立控制,也更好体现差异,我们清除了spine骨骼的父级关系。
现在使用tgt骨骼和控制器运动的效果差别就比较明显了:
胯部和胸腔的控制器
那么接下来我们希望通过控制器直接控制躯干和胸腔,思路上也不难,我们直接建立一根覆盖躯干和胸腔骨骼的新骨骼。
但是这里引申出了两种约束的实现方式:
- 复制旋转/复制位置
- 父子级关系
首先是通过复制旋转+复制位置的方法来实现约束。
注意在世界空间下,会带动骨骼造成模型扭曲,调整成局部空间后恢复正常。
这里又出现了bug,显然我们控制器调整的方向直接跟tgt骨骼运动的方向相反了。
猜测是控制器的方向和tgt的方向相反,我们直接回到编辑模式下进行旋转调整,对齐坐标轴。
对齐坐标轴后,控制器表现正常。
同理我们给脊柱和胸腔的tgt添加复制位置,选择世界坐标。并设置限位,确保胸腔控制器只能进行竖直方向的上下移动(这里涉及坐标变换的问题,实际上是只开放y轴方向的变换)
效果如下
父子级和复制约束的传递关系
不幸的是,由于之前我们取消了tgt的父子级关系,现在这个人依然处于一个上下半身分离(骨骼上)的可怜状态。
我们需要创建一个控制器并通过父子级关系来实现对胯部和胸腔控制器的统一控制。
问题又来了,但是新控制器对躯干控制器的控制显然没有生效。
猜测:骨骼间的复制旋转/复制位置约束和父子级的约束间存在冲突,所以不具有传递性。
我们直接调整胸腔控制器和新控制器的约束关系,换成同样的复制旋转+复制位置的约束。
位置和旋转的控制上已经正常了,但是由于坐标轴向的问题,在旋转的控制上会有一些反直觉的情况。如果希望实现与胸腔和脊柱同向的旋转,则需要在建立之时就调整好控制器的坐标轴方向。
但是新的问题又又出现了,我们在骨骼绑定vol1的博文中也提到过,复制性约束会导致传递关系中的中间集全部都失去控制能力,即现在胸腔控制器在复制旋转和复制位置约束添加后,已经无法再独立控制胸腔的旋转和位置了!
为了实现胸腔控制器的重新控制:
一,可以重做胸腔控制器,转换成父子级关系。
二,或者我们直接做部分调整,按结构来说,其实人的躯干部分是无法分层胸腔和胯部两部分各自进行单独的位置变化的,所以我们干脆就只让躯干控制器做整体的位置控制,把旋转的部分交还给胸腔控制器和胯部控制器进行控制。
躯干控制器只控制整体位置而不控制旋转。
胸腔和胯部控制器只控制旋转而不控制位置
有人可能会问,那耸肩的时候我想动胸腔了该怎么办?
如果想要做胸腔的单独位置控制,那还是应该调整约束关系,用父子级的办法来做约束。
但同时,耸肩动作的本质并不是胸腔向上动了,而是肩膀的骨骼向上动了,通过拉长躯干来实现耸肩动作的思路本身就不那么合适。
设置自定义控制器形状,完成躯干和胸腔控制器
设置颜色显示和分组管理
在动作模式下,选择 物体数据属性栏,新建骨骼组并完成骨骼的分配指定,选择不同的配色集,实现不同颜色的区分显示,完成划分。
效果如下
脚部控制器
脚部控制器的逻辑,介绍两种实现方法:
一是直接按照tgt骨骼的逻辑来,脚掌和脚趾各做一个控制器,由于脚掌和脚趾都是不能运动的,直接复制旋转约束就行。
第二种绑定方式,和第一种的需求有点不一样。我们想实现一种类似于踏地起步的绑定关系,让脚在抬起的同时保持触地感。
示意图如下。当然这种绑定方式和我们之前做的IK骨骼有所冲突,所以我们得另起炉灶进行绑定说明。
我们光速建模搞一只jiojio,完成基本的骨骼绑定。那么我们这次就不用tgt了,直接开始演示。
首先要调整旋转方向,需要以当前的连接中间为基点建出新骨骼。新骨骼实现与arch的父子级关系,这时就能够实现基于前脚掌的旋转了。
在世界原点单独建立一根骨骼,通过复制旋转实现整体控制,添加相应的旋转限制。
重点就在于控制前脚掌旋转的部分,需要做一个复制旋转约束并做旋转的限制,从而实现踩地感。
刚刚说到这种绑定跟之前的IK存在一些冲突,是因为这里的绑定方式下,脚部的位置变化全靠控制器的旋转实现,而IK带动的位置变化就是纯粹的位置变化,而没有旋转变化。在IK的驱动方式下,脚部的位置变化无法带动相应的骨骼的旋转约束生效。
所以在先前的绑定基础上,这基本上不算是二选一的绑定方式,如果是第二种方法的话,可能整个脚的绑定方法都需要重做。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)