unity学习46:反向动力学IK

目录

[1 正向动力学和反向动力学](#1 正向动力学和反向动力学)

[1.1 正向动力学](#1.1 正向动力学)

[1.2 反向动力学](#1.2 反向动力学)

[1.3 实现目标](#1.3 实现目标)

[2 实现反向动力](#2 实现反向动力)

[2.1 先定义一个目标](#2.1 先定义一个目标)

[2.2 动画层layer,需要加 IK pass](#2.2 动画层layer,需要加 IK pass)

[2.3 增加头部朝向代码](#2.3 增加头部朝向代码)

[2.3.1 专门的IK方法 OnAnimatorIK(int layerIndex){}](#2.3.1 专门的IK方法 OnAnimatorIK(int layerIndex){})

[2.3.2 增加朝向代码](#2.3.2 增加朝向代码)

[2.4 增加头部朝向代码](#2.4 增加头部朝向代码)

[2.5 需要设置权重](#2.5 需要设置权重)

[2.6 需要设置位置position 和 rotation](#2.6 需要设置位置position 和 rotation)

[2.7 具体代码: 头部和手都实现了IK朝向](#2.7 具体代码: 头部和手都实现了IK朝向)


1 正向动力学和反向动力学

1.1 正向动力学

  • 正常的模型身体的运动
  • 模仿人体的真实的骨骼。

1.2 反向动力学

  • 真实世界中,不存在的,相反的一个骨骼方式
  • 用目标---牵引 手指---牵引手臂,这样反向的指引方式
  • 游戏里IK相关的就是

1.3 实现目标

  • 想实现,玩家角色的眼睛,头部,手,一直指向目标

2 实现反向动力

2.1 先定义一个目标

public class TestPlayer1 : MonoBehaviour

{

public Transform target1;

private Animator animator1;

2.2 动画层layer,需要加 IK pass

  • 需要进行反向动力学的动画层,
  • 动画层layer,需要加 IK pass

2.3 增加头部朝向代码

2.3.1 专门的IK方法 OnAnimatorIK(int layerIndex){}

  • 需要专门的IK方法
  • private void OnAnimatorIK(int layerIndex){}

2.3.2 增加朝向代码

  • animator1.SetLookAtWeight(1);
  • animator1.SetLookAtPosition(target1.position);

private void OnAnimatorIK(int layerIndex)

{

//设置头部IK Weight=0表示不生效

animator1.SetLookAtWeight(1);

animator1.SetLookAtPosition(target1.position);

}

2.4 增加头部朝向代码

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestPlayer1 : MonoBehaviour
{
    public Transform target1;
    private Animator animator1;

    // Start is called before the first frame update
    void Start()
    {
        animator1=GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        float horzontal=Input.GetAxis("Horizontal");
        float vetical=Input.GetAxis("Vertical");
        Vector3 dir1=new Vector3(horzontal,0,vetical);
        Debug.DrawRay(transform.position,dir1,Color.red);

        
        //如果按下了移动按键
        if(dir1 != Vector3.zero)
        {
            //面向向量
            transform.rotation=Quaternion.LookRotation(dir1);
            
            //播放跑步动画
            animator1.SetBool("IsRun",true);
            //朝着面向的前方移动
            transform.Translate(Vector3.forward*2*Time.deltaTime);
        }else
        {
            //播放walk动画
            animator1.SetBool("IsRun",false);
        }

        if(Input.GetKeyDown(KeyCode.Q))
        {
            //触发wave参数
            GetComponent<Animator>().SetTrigger("wave");
        }

        //获得曲线的test1参数
        //Debug.Log(animator1.GetFloat("test1"));
        
    }
    void rightfoot()
    {
        Debug.Log("右脚");
    }

    void leftfoot()
    {
        Debug.Log("左脚");
    }

    private void OnAnimatorIK(int layerIndex)
    {
        //设置头部IK  Weight=0表示不生效
        animator1.SetLookAtWeight(1);
        animator1.SetLookAtPosition(target1.position);
    }

}

2.5 需要设置权重

  • 权重=1 表示生效
  • animator1.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
  • animator1.SetIKRotationWeight(AvatarIKGoal.RightHand,1);

private void OnAnimatorIK(int layerIndex)

{

//设置头部IK Weight=0表示不生效

animator1.SetLookAtWeight(1);

animator1.SetLookAtPosition(target1.position);

//设置右手position的IK权重

animator1.SetIKPositionWeight(AvatarIKGoal.RightHand,1);

//设置右手旋转IK权重

animator1.SetIKRotationWeight(AvatarIKGoal.RightHand,1);

//设置右手IK

animator1.SetIKPosition(AvatarIKGoal.RightHand,target1.position);

animator1.SetIKRotation(AvatarIKGoal.RightHand,target1.rotation);

}

2.6 需要设置位置position 和 rotation

  • //设置右手IK
  • animator1.SetIKPosition(AvatarIKGoal.RightHand,target1.position);
  • animator1.SetIKRotation(AvatarIKGoal.RightHand,target1.rotation);

2.7 具体代码: 头部和手都实现了IK朝向

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestPlayer1 : MonoBehaviour
{
    public Transform target1;
    private Animator animator1;

    // Start is called before the first frame update
    void Start()
    {
        animator1=GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        float horzontal=Input.GetAxis("Horizontal");
        float vetical=Input.GetAxis("Vertical");
        Vector3 dir1=new Vector3(horzontal,0,vetical);
        Debug.DrawRay(transform.position,dir1,Color.red);

        
        //如果按下了移动按键
        if(dir1 != Vector3.zero)
        {
            //面向向量
            transform.rotation=Quaternion.LookRotation(dir1);
            
            //播放跑步动画
            animator1.SetBool("IsRun",true);
            //朝着面向的前方移动
            transform.Translate(Vector3.forward*2*Time.deltaTime);
        }else
        {
            //播放walk动画
            animator1.SetBool("IsRun",false);
        }

        if(Input.GetKeyDown(KeyCode.Q))
        {
            //触发wave参数
            GetComponent<Animator>().SetTrigger("wave");
        }

        //获得曲线的test1参数
        //Debug.Log(animator1.GetFloat("test1"));
        
    }
    void rightfoot()
    {
        Debug.Log("右脚");
    }

    void leftfoot()
    {
        Debug.Log("左脚");
    }

    private void OnAnimatorIK(int layerIndex)
    {
        //设置头部IK  Weight=0表示不生效
        animator1.SetLookAtWeight(1);
        animator1.SetLookAtPosition(target1.position);

        //设置右手position的IK权重
        animator1.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
        //设置右手旋转IK权重
        animator1.SetIKRotationWeight(AvatarIKGoal.RightHand,1);
        //设置右手IK
        animator1.SetIKPosition(AvatarIKGoal.RightHand,target1.position);
        animator1.SetIKRotation(AvatarIKGoal.RightHand,target1.rotation);

    }

}
相关推荐
NRatel10 小时前
亚马逊S3的使用简记(游戏资源发布更新)
游戏·unity·amazon s3
SmalBox16 小时前
【渲染流水线】[几何阶段]-[屏幕映射]以UnityURP为例
unity·渲染
SmalBox2 天前
【渲染流水线】[几何阶段]-[归一化NDC]以UnityURP为例
unity·渲染
SmalBox2 天前
【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例
unity·渲染
霜绛3 天前
Unity:GUI笔记(一)——文本、按钮、多选框和单选框、输入框和拖动条、图片绘制和框绘制
笔记·学习·unity·游戏引擎
谷宇.3 天前
【Unity3D实例-功能-移动】角色行走和奔跑的相互切换
游戏·unity·c#·unity3d·游戏开发·游戏编程
17岁的勇气3 天前
Unity Shader unity文档学习笔记(十九):粘土效果,任意网格转化成一个球(顶点动画,曲面着色器)
笔记·学习·unity·图形渲染·顶点着色器·曲面着色器
benben0444 天前
《Unity Shader入门精要》学习笔记一
unity·shader
YF云飞4 天前
Unity图片优化与比例控制全攻略
游戏·unity·游戏引擎·游戏程序·个人开发
SmalBox4 天前
【渲染流水线】[几何阶段]-[几何着色]以UnityURP为例
unity·渲染