简介
IK是Inverse Kinematic的缩写,也就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置
Unity中IK能设置的部位就是5个,分别是:头、左右手、左右脚
实际应用
角色的头的旋转,这样可以和你视角的方向一致。角色的脚的位置,这样可以让角色踩在地面跟贴合。手持枪、弯曲等一些fps的应用较多。
总结
1.通过Uniy官方API的相关接口进行实现(前提模型的Rig类型 要设置成humanoid)
关键接口API:
游戏对比
针对IK的头部、手、脚进行了主流游戏的采样结果如下:
雪鹰领主:
- 进入照相前摄像机的初始位置是玩家的前方,也是超出转动范围后的重置位置。
- 待机动画和IK动画互斥。但逻辑互不影响
- 超出旋转范围后(或者在旋转内长时间无操作)会进行重置
新笑傲江湖IK:
- 和雪鹰领主差不多,区别就是没有重置的逻辑,处理上相对简单些
总结
通过Uniy官方API的相关接口进行实现
ps:仅支持Unity5.x以上版本
-
前提模型的Rig类型 要设置成humanoid
-
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大致分为两类:
-
控制关节的position和rotation,其参数类型是AvatarIKHint:左右膝、左右肘
-
控制部位的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;
}