Unity3D之Mecanim动画系统学习笔记(七):IK(反向动力学)动画

本文介绍了Unity3D中的IK(反向动力学)动画技术,通过一个实例展示了如何使用Unity内置的IK功能让角色头部面向指定目标,并通过控制四肢实现更真实的交互效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是IK?

IK(Inverse Kinematics)即反向动力学,即可以使用场景中的各种物体来控制和影响角色身体部位的运动,一般来说骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学),而IK则倒过来,由骨骼子节点带动骨骼父节点,具体情况比如人物走路踩到了石头就需要由脚的子节点来带动全身骨骼做出踩到石头的响应。

IK可以使人物和场景更加贴合,从而达到更加真实的游戏效果,如果大家玩过《波斯王子》或《刺客信条》系列,应该对主角的攀爬和飞檐走壁的能力印象深刻,这些都是应用了IK,使动画贴合到具体的场景中进行的表现。

Unity3D本身已经带有了IK的功能(http://docs.unity3d.com/Manual/InverseKinematics.html),我们接下来就对IK进行一下简单的学习和使用。

FinalIK

该插件是对Unity本身的IK的优化和增强,可以模拟出更加真实的效果,有兴趣可以看一看。

https://www.assetstore.unity3d.com/cn/#!/content/14290

实例

我们直接上手一个小例子来看看Unity3D中的IK应该如何使用,我们会创建一个场景,使人物的头部始终面向一个点,同时创建四个点控制人物的手和腿的移动。

我们在场景中添加一个人物和5个小球,如下:


根据Unity官方的文档给出的资料来看,首先必须在需要使用IK动画的Animator的层上开启“IK Pass”,如下图所示:


只有开启了这个选项,系统才会调用IK相应的方法。

下面我们为这个人物添加一个脚本,如下:

using UnityEngine;
using System.Collections;

public class TestIK : MonoBehaviour
{
    public Transform lookAtTarget;

    public Transform leftHandTarget;
    public Transform rightHandTarget;
    public Transform leftFootTarget;
    public Transform rightFootTarget;

    private Animator _animator;

    void Start()
    {
        _animator = this.GetComponent<Animator>();
    }
    
    void OnAnimatorIK(int layerIndex)
    {
        if(_animator != null)
        {
            //仅仅是头部跟着变动
            _animator.SetLookAtWeight(1);
            //身体也会跟着转, 弧度变动更大
            //_animator.SetLookAtWeight(1, 1, 1, 1);
            if(lookAtTarget != null)
            {
                _animator.SetLookAtPosition(lookAtTarget.position);
            }

            _animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
            _animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
            if(leftHandTarget != null)
            {
                _animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandTarget.position);
                _animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandTarget.rotation);
            }

            _animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
            _animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
            if(leftHandTarget != null)
            {
                _animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandTarget.position);
                _animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandTarget.rotation);
            }
            
            _animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
            _animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
            if(leftHandTarget != null)
            {
                _animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootTarget.position);
                _animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootTarget.rotation);
            }
            
            _animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
            _animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
            if(leftHandTarget != null)
            {
                _animator.SetIKPosition(AvatarIKGoal.RightFoot, rightFootTarget.position);
                _animator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootTarget.rotation);
            }
        }
    }
}


需要注意的是,控制IK的脚本必须添加到OnAnimatorIK方法中才会生效,下面看下效果图:


天道酬勤,功不唐捐!

原文地址:http://www.cnblogs.com/hammerc/p/4829943.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值