其他分享
首页 > 其他分享> > 高级动画绑定功能:角色与物品的交互

高级动画绑定功能:角色与物品的交互

作者:互联网

在Unity 2019.1正式版中,我们发布了全新的预览版Animation Rigging资源包,目的是为开发者提供一套完整的约束解决方案,让用户可以在运行时创建不同的绑定,从而替换或更改动画。

在设计Animation Rigging资源包功能时,我们探索了各种可能,努力拓展运行时与创作之间的边界。本文将介绍Animation Rigging资源包最新的实验功能。
 


阅读准备

本文将重点介绍三种类型的组件:Rig Builder、Rig和各种Constraints约束组件。了解Animation Rigging资源包,请阅读:《Unity 2019.1中的Animation Rigging资源包》。

下载本文中的项目:

https://github.com/Unity-Technol ... aracter-interaction

温馨提醒:我们希望尝试让技术动画师不必编写代码,就可以在状态机中创建约束交互的方法。本文中的状态机功能均为试验性的,暂时不可用于正式的产品制作。

高级动画绑定功能

为了在已有的Animator动画控制器中让绑定约束活动起来,而且不需要编写代码,我们在Animator状态机的Layers图层中尝试了一种新方法。
 


在现有的状态机中结合动画绑定

为了在已有状态机的只读动画剪辑上正确地同步绑定和约束,我们利用了Animator状态机的Layers图层。
 


我们可以使用Layers图层和Sync同步功能,在已有的运动状态机中为任何状态添加激活绑定或禁用绑定的剪辑。
 


我们使用动画窗口创建了多个动画剪辑,它们储存在*Rig图层中,能够调整绑定和约束的属性。这里我们只是调整了不同绑定和约束的Weight(权重)和Source Weight(来源权重)属性。
 


我们使用了Player脚本来激活或禁用部分Weight Layer属性,实现不同的握枪方式。下图是Player脚本上控制握枪方式的滑动条。
 


忍者的枪械
 


创建忍者的绑定

Rig Builder组件上的Rig Layers可以让用户对绑定和绑定部件进行排序,从而确保栈计算和解算结果正确,让绑定组合和解算顺序更具灵活性。

例如:如果我们将示例中忍者的Shoulder Offset Rig排序故意弄错,会发生什么呢?
 


当我们将Shoulder Correction Rig移到Rig Builder组件上计算栈的底部,就会破坏正确的解算过程。
 


当Shoulder Correction Rig放回Rig Builder组件上计算栈的顶部时,我们又得到了正确的解算行为。

在第一张截图中,Shoulder Offset放在了栈的底部,造成双手位置错位。在正确排序后,肩膀的解算优先于手臂的其它部分,因此手可以正确地握住手枪。

接下来,我们可以用RightArm IK来矫正手枪握把的位置,解算UpperBody Rig。
 


小提示:下文中关于绑定和约束设置中的排序不一定和上图中展示的排序相同。

Shoulder Correction Rig

我们将Shoulder Correction Rig与RightArm Rig的Two Bone IK约束结合使用,从而矫正Right Shoulder骨骼的姿势,在Assault Rifle闲置动画和Pistol闲置姿势上做出应有的手臂弯曲。

我们使用Pivot模式的Override Transform组件和RightShoulder的Transform属性,在Y轴和Z轴加入额外的旋转角度。请注意,通过把Position Weight位置权重设为0,我们只会影响Rotation旋转属性。
 


Assault Rifle Rig

现在看看Hips Constraint游戏对象和其子对象。在Override Transform组件中,我们把模式设为Pivot,将Hips Ctrl对象作为来源,从而影响Hips骨骼,这使得我们能够偏移整个忍者层级。

然后,我们将Multi-Aim和Override Transform等约束组合在一起,创建一个能够影响脊柱和臀部的上身瞄准绑定。设置不同的瞄准权重约束值将会影响所有脊柱效应部分中旋转角度的分配。

在Hips Constraint对象下,Multi Aim Constraint组件的Source Objects部分中,各个部分的数值为:脊柱部分设为0.35,胸部设为0.5,胸部上半部分设为0.75,头部设为1.0。所有这些设置为目标对象加上了不同的旋转角度,创造出了瞄准效果。
 


Weapon Rig

Weapon Rig对象使用Override Transform组件来控制Weapon Bone动画流,使用来源对象Weapon Ctrl对象对它进行重定向。
 


然后,我们在Multi-Referential Constraint组件中使用同样的来源对象作为参照对象,实现多轴心操作。你可以在Multi Referential Constraint组件的Driving属性中测试这些数值,实时查看结果。
 


UpperBody IK Rig

Two Bone IK提供了对两个骨架手臂的解算。Multi-Parent Constraints组件的作用是把RHIK Effector对象和LHIK Effector对象关联到Weapon_Bone的IK目标子对象即AR_LHIK_Target和AR_RHIK_Target对象上。
 


Pistol Rig

我们使用了一套动画绑定约束,实现初始闲置动画向握枪姿势的转换。通过使用Pivot模式的Override Transform组件,我们把Pistol Ctrl对象效应部位上的数据偏移到Weapon Bone对象上。

然后,我们在Multi-Parent Constraint组件中,把Maintain Offset设为Position and Rotation选项,从而抵消Weapon Bone来源对象和Pistol Offset目标对象之间的全局定位坐标差异。
 


Weapons Source Rig

为了将突击步枪和手枪的骨架连接到不同锚点上,我们利用了多重父对象约束的多来源功能。

Assault Rifle Attach Rig对象能够充分利用Multi-Parent Constraint组件的多来源功能。当AR_Holster来源值设为1,Weapon_Bone来源值设为0时,AR_Grip_Bone对象会关联到AR_Holster对象上。
 

 


如果想让突击步枪即AR_Grip_Bone对象跟随Weapon_Bone对象,手机游戏拍卖平台只需将Weapon_Bone来源值设为1,AR_Holster来源值设为0即可。请注意,我们可以在大部分约束属性上编辑关键帧,例如:本示例中的多重父对象来源权重,从而得出想要的结果。

这个功能很关键,新的动画剪辑将在同步的Animator控制器图层的状态中使用,从而在现有运动状态机的状态中限制特定绑定状态。

下面的示例展示了在运行时对三个不同来源Pistol_Holster,Pistol Offset和RightHand_PistolGrip,使用多重父对象约束的方法。

该结果通过同步多个状态机图层上的两个不同动画剪辑得来,两个动画剪辑是:Base图层上运行的.fbx格式只读文件Pistol_Equip,Rig Pistol图层上的Unity原生动画剪辑Rig_Pistol_Equip。


Legs IK Rig

忍者的文件格式是fbx格式,包含了LowerBody对象的两个子对象:LeftFootIK对象和RighFootIK对象,我们用DCC工具为这两个对象加上了匹配的脚部骨架动画。


 


多重父对象约束主要用于将Leg IK Rig对象上的Feet IK效应部位关联到LeftFootIK对象和RightFootIK对象。该功能可将双脚锁定在地面根部层级上,使得在调整臀部时下身部分不会沉到地下。
 


最后,我们可以使用Two Bone IK约束上的IK解算,在下半身部分即脚部和指示部分的位置生成合适的动画矫正。
 


脚部设置

我们发现使用Multi-Referential Constrain组件来制作脚部绑定的效果很好。通过创建多轴心脚部控制绑定,我们可以利用IK效应部分的控制功能,未来的动画创作方案可能会和这种方法相似。
 


LeftHandGrip Rig

我们利用Left-Hand对象的层级的副本创建了一个完全不同的手部抓握姿势。通过使用Rig组件的权重滑块,我们可以在本地空间禁用或启用多个Override Transform约束,每个约束作用于一个手指对象,从而重写每个手指的本地角度。
 


为了将LHIK Effector对象对齐到AR_LHIK_Target_B对象,我们可以将AR_LHIK_Target的权重值设为0,将AR_LHIK_Target_B的权重值设为1。

然后,我们使用MonoBehaviour脚本同步LeftHandGrip Rig对象的权重属性和LeftArm IK及Muilti-Parent Constraint组件的来源权重属性,即AR_LHIK_Target对象和AR_LHIK_Target_B对象,从而调整武器上的左手位置和抓握姿势。
 


Twist Correction Rig

Twist Correction Rig对象是一个程序化的变形绑定,能够影响手臂的上下部分,以及双脚的上半部分。它能够提取出腕部骨骼的旋转角度,再根据特定权重值将旋转效果分布到每个手腕骨骼的本地X轴上。

在本示例中,Twist Correction在Rig Builder组件上位于Rig Layers部分的底部,这样Twist Correction对象可以方便接收之前绑定约束中的改动。
 


项目中的笔记和知识点

由于我们使用Animator状态机来控制约束属性,即浮点类型的权重值,它们将会继承状态机上的过渡与混合效果,例如:在混合处理结束前,数值可能会是0.998。要避免这个问题,请确保在约束权重动画开始之前,有足够的时间完成混合过渡。

该方法有另一个副作用,你需要记录受到之前状态影响的属性,从而避免这些属性回到默认数值或状态,当状态的同步层上没有剪辑时,需要特别注意这个问题。

在解决完这些问题后,我们就有了功能完善的结果。

标签:动画,对象,绑定,约束,组件,Rig,交互
来源: https://blog.csdn.net/august5291/article/details/120262419