Version: 6000.3
语言: 中文
重定向人形动画
根运动的工作原理

Inverse Kinematics

大多数角色动画是通过将骨架中的关节角度旋转到预定值来创建的。孩子的位置关节允许刚体组件之间进行动态连接的物理组件,通常允许一定程度的移动,例如铰链。更多信息
请参阅术语表
根据其父级的旋转而变化。接头链的终点由沿链的各个接头的角度和相对位置决定。这种摆出骷髅姿势的方法被称为向前运动学描述角色关节和身体的位置和方向的几何体。由反向运动学用于控制角色移动。
请参阅术语表
.

然而,从相反的角度摆出关节姿势通常很有用。从空间中的选定位置或目标开始,然后向后工作,找到一种方法来定位关节,以便终点到达目标。如果您希望角色抓住物体或站在不平坦的表面上,这会很有用。这种方法称为逆运动学 (IK)。Mecanim 支持具有正确配置的人形角色头像(Avatar用于将动画从一个绑定重定向到另一个绑定的界面。更多信息
请参阅术语表
.

凯尔角色拿着一个圆柱体。
凯尔角色拿着一个圆柱体。

要为角色设置 IK,通常在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
角色与之互动。你可以使用这些对象和角色在脚本中设置IK。您可以使用以下 Animator 功能:

例如,上图显示了一个角色触摸圆柱形物体。要使用 IK 和脚本执行此作,请执行以下步骤:

  1. 为你的角色创建一个有效的头像。

  2. 创建一个动画师控制器(Animator Controller) 通过动画层控制动画,包括动画状态机和动画混合树,由动画参数控制。具有 Animator 组件的多个模型可以引用同一个 Animator 控制器。更多信息
    请参阅术语表
    至少有一个该角色的动画。

  3. 动画器窗口 可视化和编辑动画器控制器的窗口。更多信息
    请参阅术语表
    ,点击 基础层(Base Layer) 中的 齿轮(Cog) 图标,然后从上下文菜单中启用 IK通道(IK Pass)。启用后,IK通道会发送OnAnimatorIK回调。在后面的步骤中,你将使用此回调在脚本中实现逆运动学。

    启用默认层的 IK通道(IK Pass) 复选框。
    启用默认层的 IK通道(IK Pass) 复选框。
  4. 确保将动画器控制器分配给角色的动画器控制器。

    分配给角色 Animator Controller 的 Animator Controller 组件。
    分配给角色的动画师控制器的动画师控制器组件。
  5. 接下来,为您的角色添加脚本。在此示例中,脚本名为IKControl.此脚本为角色的右手设置IK目标。此脚本还更改了注视位置,以便角色在抓取时看向圆柱体对象。完整脚本如下:

    using UnityEngine;
    using System;
    using System.Collections;
    
    [RequireComponent(typeof(Animator))]
    public class IKControl : MonoBehaviour {
    
        protected Animator animator;
    
        public bool ikActive = false;
        public Transform rightHandObj = null;
        public Transform lookObj = null;
    
        void Start ()
        {
            animator = GetComponent<Animator>();
        }
    
        //a callback for calculating IK
        void OnAnimatorIK()
        {
            if(animator) {
           
                //if the IK is active, set the position and rotation directly to the goal.
                if(ikActive) {
    
                    // Set the look target position, if one has been assigned
                    if(lookObj != null) {
                        animator.SetLookAtWeight(1);
                        animator.SetLookAtPosition(lookObj.position);
                    }
    
                    // Set the right hand target position and rotation, if one has been assigned
                    if(rightHandObj != null) {
                        animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
                        animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);  
                        animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
                        animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
                    }
                }
    
                //if the IK is not active, set the position and rotation of the hand and head back to the original position
                else {          
                    animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0);
                    animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0);
                    animator.SetLookAtWeight(0);
                }
            }
        }
    }
    
    
  6. 避免右手穿过气缸游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
    请参阅术语表
    ,将一个空的子游戏对象添加到CylinderGameObject 的 GameObject 中。为此,请右键单击“层次结构”窗口中的“圆柱体”游戏对象,然后选择“创建空”。将此空子游戏对象命名为Cylinder Grab Handle.

  7. 定位并旋转Cylinder Grab HandleGameObject,以便右手接触但不穿过圆柱体。

    空游戏对象充当 IK 目标。添加此空游戏对象,以便右手与 Cylinder 对象交互。
    空游戏对象充当 IK 目标。添加此空游戏对象,以便右手与 Cylinder 对象交互。
  8. 分配Cylinder Grab HandleGameObject 作为IKControl脚本。

  9. 分配CylinderGameObject 作为 Look Obj,以便在启用 IK Active 时角色朝向圆柱体的中心。

    IKControl(脚本)组件及其属性。
    IKControl(脚本)组件及其属性。
  10. 进入播放模式。 你的角色应该在启用和禁用 IK Active 复选框时触摸并释放圆柱体游戏对象。在播放模式下,更改CylinderGameObject 来查看右手和角色的外观如何反应。

重定向人形动画
根运动的工作原理