Unity IK动画相关研究

简介

IK是Inverse Kinematic的缩写,也就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置

Unity中IK能设置的部位就是5个,分别是:头、左右手、左右脚

实际应用

角色的头的旋转,这样可以和你视角的方向一致。角色的脚的位置,这样可以让角色踩在地面跟贴合。手持枪、弯曲等一些fps的应用较多。

总结
1.通过Uniy官方API的相关接口进行实现(前提模型的Rig类型 要设置成humanoid)
关键接口API:

游戏对比

针对IK的头部、手、脚进行了主流游戏的采样结果如下:
在这里插入图片描述
雪鹰领主:

  1. 进入照相前摄像机的初始位置是玩家的前方,也是超出转动范围后的重置位置。
  2. 待机动画和IK动画互斥。但逻辑互不影响
  3. 超出旋转范围后(或者在旋转内长时间无操作)会进行重置

新笑傲江湖IK:

  1. 和雪鹰领主差不多,区别就是没有重置的逻辑,处理上相对简单些

总结

通过Uniy官方API的相关接口进行实现

ps:仅支持Unity5.x以上版本

  1. 前提模型的Rig类型 要设置成humanoid
    在这里插入图片描述

  2. Animator必须启用IK
    在这里插入图片描述

关键接口API:

//设置看向的权重
public void SetLookAtWeight(float weight, float bodyWeight = 0.0f, float headWeight = 1.0f, float eyesWeight = 0.0f, float clampWeight = 0.5f);

public void SetIKPosition(AvatarIKGoal goal, Vector3 goalPosition);
public void SetIKPositionWeight(AvatarIKGoal goal, float value);

public void SetIKRotation(AvatarIKGoal goal, Quaternion goalRotation);
public void SetIKRotationWeight(AvatarIKGoal goal, float value);

public void SetIKHintPosition(AvatarIKHint hint, Vector3 hintPosition);
public void SetIKHintPositionWeight(AvatarIKHint hint, float value);

官方API大致分为两类:

  1. 控制关节的position和rotation,其参数类型是AvatarIKHint:左右膝、左右肘
    在这里插入图片描述

  2. 控制部位的position和rotation,其参数类型是AvatarIKGoal :左右脚、左右手
    在这里插入图片描述

简单说就是:2个前提,3个接口(SetLookAtWeight、SetIKPosition/Position、SetIKPositionWeight)

启用IK和未启用IK 脚面和地面的切合度对比图
在这里插入图片描述
在这里插入图片描述

根据原理自己编写API(仅用作于简单部位处理,例如头部旋转)

在这里插入图片描述
target:看向的目标点
Smooth Time:平滑过渡的时间
Chest Parts:支持其它身体部位
Show Debug:是否显示调试信息(用来限定最大可旋转的旋转角度)
Head:

    public class Part
    {
        public Transform part;
        public Vector3 positionOffset;  //位置偏移两
        public Vector3 rotationOffset;  //旋转偏移量
        public LimitRotation limitRotation;  //旋转条件限定(通过控制value来觉得旋转角度)
        private Rotation rotation = new Rotation();

        public Rotation GetRotation()
        {
            return rotation;
        }
    }
    public class AxisLimitRotation
    {
        public bool active;   		//是否激活限定条件
        public float offsetValue; 	//偏移值
    }

    public class LimitRotation
    {
        public AxisLimitRotation x;
        public AxisLimitRotation y;
        public AxisLimitRotation z;
    }

Demo链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqooopp123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值