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(* ̄▽ ̄*)ブ

时间: 2024-12-13 03:36:08

Unity Animator动画状态机 深入理解(二)IK控制的相关文章

Unity Animator动画状态机 深入理解(一)

接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我这就不是Animator么. 对啊,Animator其实是由Animation组成的.比如在Animator没有出现的时候有些公司写的动画状态机其实就是代码版的Animator. Animator其实就是把Animation统一管理和逻辑状态管理的组件,而Animation就是每一个动画. 动画状态

Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长

Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com/Manual/AnimationOverview.html While Mecanim is recommended for use in most situations, Unity has retained its legacy animation system which existed b

【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- Animator动画状态机

Animator是unity 4版本之后的新动画 可以在编辑器中直接编辑连线各个动画的转换,也可以是用代码直接调用底层来转换动画 代码: 1 using UnityEngine; 2 using System.Collections; 3 4 public class AnimationTest : MonoBehaviour { 5 6 // Animation animation; 7 Animator animator; 8 9 // Use this for initialization

unity 对Animator动画系统的研究

unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看文章边查阅文档,最好能动手测试. 文章的开始之前,先讲几个基本的知识的: 1.创建动画的一个基本步骤是设置一个unity3d可理解的简化后的骨骼到骨架中实际骨骼的映射:在Mecanim的术语中,这个映射称为Avatar,即avatar是骨骼到骨架的映射. (图片来自网) Avatar主要用于类人骨骼

unity+动画状态机

代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public class ARModeAnimationController : MonoBehaviour { public Animator animatorTemp; public Animator OtherAnimatorTemp; public int ClickNumber; private double t1;

Unity animator:StateMachineBehaviour的一点应用(施工中)

Unity animator:StateMachineBehaviour的一点应用(施工中) 有什么用 直奔主题,我们先讲讲作用,用法,再慢慢解释 一个简单的应用场景:Unity动画状态机中有一个"特色"是,如果你为一组Animator添加一个triggerA的parameter,用于控制动画A的播放(这里我们举例triggerA触发一次,进入动画A播放一次),你会发现,快速出发两次或多次triggerA,不加入限制条件,动画A将再播放完后再播放一次或多次 已有的解决方案是在脚本中添加

Silverlight &amp; Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation)

原文:Silverlight & Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation) 说到对象的旋转,或许就会联想到对象角度的概念.对象的旋转实现实际上就是利用对象的角度改变来实现的位置变换,在<Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)>一文中有对对象的不同角度变换的实现介绍,本篇要介绍的自由旋转(Free-form rotation)将借助<Fun

spring深入理解二(关于容器工作源码)

spring基本工作原理如下: 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 4.如果是单例或lazy-init=false,则直接生成bean spring将 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 这三部分开,可以提供更多的定制给用户. spring将配置文件之类的文件资源抽象成一个Resource,封装了g

蓝鸥Unity开发基础—— 实践课程源代码二

蓝鸥Unity开发基础-- 实践课程源代码二 using System; namespace MyFirstGame{    class MainClass    {        public static void Main (string[] args)        {            //游戏即将启动时做一些操作            const int mapW=46;//地图宽度            const int mapH = 16;//地图高度 //定义常量