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

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

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

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

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

 

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

             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
             avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);

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

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

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

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

     //设置右手IK位置
     avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
     //设置右手IK旋转
     avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
     //获取右手IK位置
     rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
     //获取右手IK旋转
     rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);    

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

 using UnityEngine;
 using System.Collections;

 public class MyIK : MonoBehaviour {

     public Transform bodyObj = null;
     public Transform leftFootObj = null;
     public Transform rightFootObj = null;
     public Transform leftHandObj = null;
     public Transform rightHandObj = null;
     public Transform lookAtObj = null;
     private Animator avatar;
     public bool ikActive = false;

     void Start()
     {
         avatar = GetComponent<Animator>();
     }

     void OnAnimatorIK(int layerIndex)
     {
         if (avatar == null) return;

         if (ikActive)
         {
             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
             avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);

             if (bodyObj != null)
             {
                 avatar.bodyPosition = bodyObj.position;
                 avatar.bodyRotation = bodyObj.rotation;
             }

             if (leftHandObj != null)
             {
                 avatar.SetIKPosition(AvatarIKGoal.LeftHand, leftHandObj.position);
                 avatar.SetIKRotation(AvatarIKGoal.LeftHand, leftHandObj.rotation);
             }
             if (rightFootObj != null)
             {
                 avatar.SetIKPosition(AvatarIKGoal.RightFoot, rightFootObj.position);
                 avatar.SetIKRotation(AvatarIKGoal.RightFoot, rightFootObj.rotation);
             }
             if (leftFootObj != null)
             {
                 avatar.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position);
                 avatar.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation);
             }
             if (rightHandObj != null)
             {
                 avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
                 avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
             }

             if (lookAtObj != null)
                 avatar.SetLookAtPosition(lookAtObj.position);
         }
         else
         {
             if (bodyObj != null)
             {
                 bodyObj.position = avatar.bodyPosition;
                 bodyObj.rotation = avatar.bodyRotation;
             }

             if (leftFootObj != null)
             {
                 leftFootObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftFoot);
                 leftFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftFoot);
             }

             if (rightFootObj != null)
             {
                 rightFootObj.position = avatar.GetIKPosition(AvatarIKGoal.RightFoot);
                 rightFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightFoot);
             }

             if (leftHandObj != null)
             {
                 leftHandObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftHand);
                 leftHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftHand);
             }

             if (rightHandObj != null)
             {
                 rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand);
                 rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);
             }

             if (lookAtObj != null)
             {
                 lookAtObj.position = avatar.bodyPosition + avatar.bodyRotation * , );
             }
             avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, );
             avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, );
             avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, );
             avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, );
             avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, );
             avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, );
             avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, );
             avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, );
             avatar.SetLookAtWeight(0.0f);
         }
     }

 }

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

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

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

    接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...

  2. Unity Animator动画状态机 深入理解(三)二维混合树

    介绍二维之前,先说说一维吧~ 这个是通过旋转角度速度快慢来表现身体的大转和中转~ 通过一个-133~133的数值来进行控制. 注:后面的那个对钩是镜像的意思. 其实二维混合树并没有想象中的那么难.先来 ...

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

    Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...

  4. Unity动画知识之二:Animator动画状态机

    上次我们讲过Unity游戏动画从入门到住院,今天我们来讲一下动画状态机. 好了,现在我们已经成功的导入了动画.接下来要玩的东西就很装13啦.因为大部分动画师是用不到这家伙的,需要掌握这个技能的,至少也 ...

  5. 用Unity的Animation播放Animator动画Clip

    简单的动画,其实不需要Animator动画状态机管理,用Animation播放效率更高,但可能由于历史遗留问题,或网上下载的第三方资源,得到的是Animator资源,可以在Clip的Debug试图下, ...

  6. Unity插件 - MeshEditor(六) 变形动画状态机

    变形动画状态机--MeshAnimator,是针对MeshAnimation的状态管理器,有大量类似Unity animator的功能,但MeshAnimator操作会更加简便,更加直观,居家旅(zh ...

  7. 【转】unity Animator 怎么判断一个动画播放结束

    关于unity Animator 怎么判断一个动画播放结束这里有几种方法.希望对大家有帮助.还有其他办法的可以分享一下 第一种方法:在动画结束帧后面加个动画事件,调用下含这个变量的函数接口不是可以了? ...

  8. Unity问答——请问一下动画状态机怎么判断动画是否播完了?

    这篇博客源自我在泰课在线的回答.链接:http://www.taikr.com/group/1/thread/233 问:请问一下动画状态机怎么判断动画是否播完了? 答: 1. 脚本参考 Animat ...

  9. Unity骨骼动画资源解析与优化

    一,背景 最近发现项目的动画文件有点大,不光内存大,而且文件也很大,所以从这2个方面下手处理 二,动画文件大小优化 为了优化动画文件大小,我们可以先分析下文件,Ctrl+D将动画文件从FBX拷贝出来, ...

随机推荐

  1. kindeditor4整合SyntaxHighlighter,让代码亮起来

    这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换 ...

  2. SQLCMD备忘录:执行文件夹所有Sql文件

    在做性能测试的时候最希望的一件事情是数据自动导入. 一般做法就是写很多SQL文件,通过Bat自动执行所有Sql文件. Bat代码: @ECHO OFF SET SQLCMD="C:\Prog ...

  3. MyEclipse10.6导出war包出错

    在右键选中项目->export->java ee ->war 的时候,一点就报错SECURITY ALERT:INTEGRITY CHECK ...,之后自动关闭 这个问题是因为用的 ...

  4. stringstream clear()的疑问 - yuanshuilee的日志 - 网易博客

    stringstream clear()的疑问 - yuanshuilee的日志 - 网易博客 stringstream clear()的疑问   2013-09-05 08:43:13|  分类: ...

  5. MVC推荐教程和文章列表

    着手Getting Started Getting Started with ASP.NET MVC 5 (共11部分) Pluralsight ASP.NET MVC 5 Fundamentals( ...

  6. Jmeter(四)-断言/检查点

    断言就类似LoadRunner中的检查点.对上一个请求返回的信息,做字符串.数据包大小.HTML.XML.图片等做判断,确保返回的信息的准确性. 添加响应断言:欢迎您 如果登陆页登陆成功,则后台会返回 ...

  7. 自己写的POIUtil,主要解决从不同的HSSFWorkbook复制sheet以及根据单元格插入图片等

    复制sheet的原始代码网上找的,但是小问题很多,然后自己动手改了一下: 根据单元格信息动态插入图片,如果单元格有文字,图片的位置会在文字之后,如果同样的位置已有图片则会往下插入. import or ...

  8. Flutter 即学即用系列博客——08 MethodChannel 实现 Flutter 与原生通信

    背景 前面我们讲了很多 Flutter 相关的知识点,但是我们并没有介绍怎样实现 Flutter 与原生的通信. 比如我在 Flutter UI 上面点击了一个按钮,我希望原生做一些处理,那么原生怎么 ...

  9. UML用例图之间的关系

    在画用例图的时候,理清用例之间的关系是重点.用例的关系有泛化(generalization).扩展(extend)和包含(include).其中include和extend最易混淆.下面我们结合实例彻 ...

  10. Linux /proc/pid目录下各文件含义

    /proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明/dev/kmem. /proc 里的大多数文件都是只读的, 但也可以通过写一些文件来改变内核变量. ( Linux 内核 ...