反向动力学IK

1、什么是IK?

在骨骼动画中,构建骨骼的方法被称为正向动力学,它的表现形式是,子骨骼(关节)的位置根据父骨骼(关节)的旋转而改变,用我们人体举例子:当我们抬起手臂时,是肩部关节带动的整个手臂的运动,用父子骨骼理解的话就是父带动了子。

IK全称是Inverse Kinematics,翻译过来的意思就是反向动力学的意思,它和正向动力学恰恰相反
它的表现形式是,子骨骼(关节)末端的位置改变会带动自己以及自己的父骨骼(关节)旋转
用我们人体举例子:当我们拿起一个杯子的时候是用手掌去拿,以杯子为参照物,我们移动杯子的位置,手臂会随着杯子一起移动,用父子骨骼理解的话就是子带动了父

2、2D IK包引入

在Package Manager窗口中引入2D IK工具包,需要在Advanced高级选项中选中Show preview packages(显示预览包),这样才能看到2D IK相关内容

注意:如果在引入包时报错,需要在Windows防火墙中添加入站规则

3、2D IK的使用

  • 新建一个空物体作为根节点,作为已建立骨骼的2D物体的父节点;
  • 在根节点加载 IK Manager 2D 脚本;
  • 在要控制的骨骼末端创建一个空物体;
  • 在IK Manager 2D 脚本添加IK 控制节点。添加之后会在 HIerarchy 中新建一个根节点的子对象(假设为A),并有对应的 Solver 脚本。将上一步中建立的骨骼末端的空物体作为 IK 节点的默认位置(拖拽到 Solver 脚本中的 Effector),并设置好相关参数之后,点击 Create Target, 会在 A 下新建一个物体,即 IK 节点,通过控制 IK 节点,并已经将其加载到了 Solver 脚本中的 Target 变量,即可反向控制父节点的移动。

如果将 IK 节点作为某个骨骼的子对象,那么 IK 节点会随着该骨骼一起移动,否则可能出现的情况就是:对手脚建立的 IK 节点,当身体移动的时候,手脚会被锁定,无法跟着身体移动,这个时候将手脚的 IK 节点作为身体骨骼的子对象即可。

 4、IK的意义

  • 瞄准功能
  • 头部朝向功能
  • 拾取物品功能

等等有指向性的功能时 我们都可以通过IK来达到目的,最大的作用,可以方便我们进行动画制作

5、练习

假设手臂已经建立了骨骼,通过点击鼠标移动手臂。主要思路就是通过改变 IK 节点的位置

public class MpveArm: MonoBehaviour
{
    public Transform ikPoint;        // 通过 Create Target 建立的节点

    private float z;
    private Vector3 mousePos;

    // Start is called before the first frame update
    void Start()
    {
        //这里是为了得到当前2D游戏所在平面的 横截面z轴坐标 用于之后的 屏幕坐标转世界坐标
        z = Camera.main.WorldToScreenPoint(ikPoint.position).z;
    }

    // Update is called once per frame
    void Update()
    {
        if ( Input.GetMouseButton(0) )
        {
            //得到当前鼠标所在位置
            mousePos = Input.mousePosition;
            //改变z轴 为了之后转换世界坐标后 横截面位置的正确
            mousePos.z = z;
            ikPoint.position = Camera.main.ScreenToWorldPoint(mousePos);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Go_Accepted/article/details/128294902