• Unity Animator动画状态机 深入理解(二)IK控制


    IK还是一个很神奇和实用的东西啊,起码可以用代码来控制人物骨骼位置还是很爽的。因为不是动画师~

    这篇可能跟Animator没啥关系了哈,都是代码层的。

    看了一官方的案例,老的,有些问题,自己修改了一下,达到了效果。

    官方建议把所有的IK操作放在OnAnimatorIK中进行。

    如果我们要进行IK操作,先要绑定IK位置。IK能控制的官方都给了enum

     

    然后我们要设置权重Weight,范围为0~1,这里都设成1

    1             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1.0f);
    2             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
    3             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
    4             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
    5             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
    6             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
    7             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
    8             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
    9             avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);

    如果我们把LeftFoot的权重设为0,则会出现以下情况

    在官方给的脚本中IK的绑定并没有在OnAnimatorIK中,而放到了Update中,然后就出现了绑定失败的问题。

    所以我把他们都放到了OnAnimatorIK中。就可以了。

    关于IK的操作~,给的少。

    1     //设置右手IK位置
    2     avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
    3     //设置右手IK旋转
    4     avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
    5     //获取右手IK位置
    6     rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
    7     //获取右手IK旋转
    8     rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);    

    上完整代码~ (ikActive)没开启时球跟随人,开启时人跟随球。

      1 using UnityEngine;
      2 using System.Collections;
      3 
      4 public class MyIK : MonoBehaviour {
      5 
      6     public Transform bodyObj = null;
      7     public Transform leftFootObj = null;            
      8     public Transform rightFootObj = null;
      9     public Transform leftHandObj = null;
     10     public Transform rightHandObj = null;
     11     public Transform lookAtObj = null;
     12     private Animator avatar;
     13     public bool ikActive = false;
     14 
     15     void Start()
     16     {
     17         avatar = GetComponent<Animator>();
     18     }
     19 
     20     void OnAnimatorIK(int layerIndex)
     21     {
     22         if (avatar == null) return;
     23 
     24         if (ikActive)
     25         {
     26             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0.0f);
     27             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
     28             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
     29             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
     30             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
     31             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
     32             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
     33             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
     34             avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);
     35 
     36             if (bodyObj != null)
     37             {
     38                 avatar.bodyPosition = bodyObj.position;
     39                 avatar.bodyRotation = bodyObj.rotation;
     40             }
     41 
     42             if (leftHandObj != null)
     43             {
     44                 avatar.SetIKPosition(AvatarIKGoal.LeftHand, leftHandObj.position);
     45                 avatar.SetIKRotation(AvatarIKGoal.LeftHand, leftHandObj.rotation);
     46             }
     47             if (rightFootObj != null)
     48             {
     49                 avatar.SetIKPosition(AvatarIKGoal.RightFoot, rightFootObj.position);
     50                 avatar.SetIKRotation(AvatarIKGoal.RightFoot, rightFootObj.rotation);
     51             }
     52             if (leftFootObj != null)
     53             {
     54                 avatar.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position);
     55                 avatar.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation);
     56             }
     57             if (rightHandObj != null)
     58             {
     59                 avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
     60                 avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
     61             }
     62 
     63             if (lookAtObj != null)
     64                 avatar.SetLookAtPosition(lookAtObj.position);
     65         }
     66         else
     67         {
     68             if (bodyObj != null)
     69             {
     70                 bodyObj.position = avatar.bodyPosition;
     71                 bodyObj.rotation = avatar.bodyRotation;
     72             }
     73 
     74             if (leftFootObj != null)
     75             {
     76                 leftFootObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftFoot);
     77                 leftFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftFoot);
     78             }
     79 
     80             if (rightFootObj != null)
     81             {
     82                 rightFootObj.position = avatar.GetIKPosition(AvatarIKGoal.RightFoot);
     83                 rightFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightFoot);
     84             }
     85 
     86             if (leftHandObj != null)
     87             {
     88                 leftHandObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftHand);
     89                 leftHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftHand);
     90             }
     91 
     92             if (rightHandObj != null)
     93             {
     94                 rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
     95                 rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);
     96             }
     97 
     98             if (lookAtObj != null)
     99             {
    100                 lookAtObj.position = avatar.bodyPosition + avatar.bodyRotation * new Vector3(0, 0.5f, 1);
    101             }
    102             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0);
    103             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 0);
    104             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 0);
    105             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0);
    106             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 0);
    107             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 0);
    108             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);
    109             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 0);
    110             avatar.SetLookAtWeight(0.0f);
    111         }
    112     }
    113 
    114 }

    附一个彩蛋,IK有意思~~呵呵~ o(* ̄▽ ̄*)ブ

  • 相关阅读:
    正则表达式之re模块
    collections模块
    openpyxl模块
    hashlib模块
    random模块
    os模块
    sys模块
    nodeType
    数据类型转换
    添加删除
  • 原文地址:https://www.cnblogs.com/SHOR/p/5740528.html
Copyright © 2020-2023  润新知