版本:Unity 6 (6000.0)
语言:English
重新定位人形动画
根运动的工作原理

逆运动学

大多数角色动画都是通过将骨骼中关节的角度旋转到预定的值来创建的。子关节一个物理组件,允许刚体组件之间建立动态连接,通常允许一定程度的运动,例如铰链。 更多信息
参见 术语表
的位置根据其父级的旋转而变化。关节链的终点由沿链的各个关节的角度和相对位置决定。这种摆姿势的方法称为正向运动学描述角色关节和身体位置和方向的几何图形。逆运动学使用它来控制角色运动。
参见 术语表

但是,从相反的角度摆姿势通常很有用。从空间中的某个选定位置或目标开始,然后向后工作以找到一种方法来调整关节的方向,使终点到达目标。如果您希望角色抓住物体或站在不平坦的表面上,这将非常有用。这种方法称为逆运动学(IK)。它在 Mecanim 中受支持,用于具有正确配置的角色一个用于将动画从一个骨骼重新定位到另一个骨骼的接口。 更多信息
参见 术语表
的人形角色。

要为角色设置 IK,您通常会在场景场景包含游戏环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰物,从本质上讲,您将游戏分段设计和构建。 更多信息
参见 术语表
周围放置角色交互的对象。您可以使用这些对象和您的角色在脚本中设置 IK。您可以使用以下动画器函数

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

  1. 为您的角色创建一个有效的角色。
  2. 创建一个至少包含一个此角色动画的动画控制器通过具有动画状态机和动画混合树的动画层控制动画,由动画参数控制。相同的动画控制器可以被具有动画组件的多个模型引用。 更多信息
    参见 术语表
  3. 动画窗口显示和编辑动画控制器的窗口。 更多信息
    参见 术语表
    的“层”窗格中,单击基本层中的齿轮图标,然后从上下文菜单中启用IK 传递。启用后,IK 传递会发送一个OnAnimatorIK回调。在后面的步骤中,您将使用此回调在脚本中实现逆运动学。

Enable the IK Pass checkbox for the Default Layer

  1. 确保动画控制器已分配给角色的动画组件模型上的一个组件,使用动画系统为该模型设置动画。该组件对一个动画控制器资源有引用,该资源控制动画。 更多信息
    参见 术语表

  1. 接下来,将脚本添加到您的角色。在此示例中,脚本名为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);
            }
        }
    }
}

  1. 为避免右手穿过圆柱体游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的功能由附加到它的组件定义。 更多信息
    参见 术语表
    ,向Cylinder游戏对象添加一个空的子游戏对象。为此,右键单击层次结构窗口中的圆柱体游戏对象,然后选择创建空对象。将此空的子游戏对象命名为Cylinder Grab Handle

  2. 定位并旋转Cylinder Grab Handle游戏对象,使右手接触圆柱体但不穿过圆柱体。

An empty GameObject acts as the IK target. Add this empty GameObject so that the right hand interacts properly with the Cylinder object.

  1. Cylinder Grab Handle游戏对象分配为IKControl脚本的右手对象属性。
  2. Cylinder游戏对象分配为观察对象,以便当启用IK 活动时,角色观察圆柱体的中心。

  1. 进入播放模式。

当您启用和禁用IK 活动复选框时,您的角色应触摸并释放圆柱体游戏对象。在播放模式下,更改Cylinder游戏对象的位置和旋转,以查看右手和角色观察是如何反应的。

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