博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity Animator动画状态机 深入理解(二)IK控制
阅读量:5740 次
发布时间:2019-06-18

本文共 6108 字,大约阅读时间需要 20 分钟。

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

转载于:https://www.cnblogs.com/SHOR/p/5740528.html

你可能感兴趣的文章
Spring之旅第八站:Spring MVC Spittr舞台的搭建、基本的控制器、请求的输入、表单验证、测试(重点)...
查看>>
数据结构与算法——常用排序算法及其Java实现
查看>>
你所不知的Webpack-多种配置方法
查看>>
React.js 集成 Kotlin Spring Boot 开发 Web 应用实例详解
查看>>
webpack+typescript+threejs+vscode开发
查看>>
python读excel写入mysql小工具
查看>>
如何学习区块链
查看>>
搜索问题的办法
查看>>
微信分销系统商城营销5大重点
查看>>
求职准备 - 收藏集 - 掘金
查看>>
htm5新特性(转)
查看>>
Linux-Centos启动流程
查看>>
php 设计模式
查看>>
后端技术精选 - 收藏集 - 掘金
查看>>
Laravel 服务容器
查看>>
mac安装kubernetes并运行echoserver
查看>>
多页架构的前后端分离方案(webpack+express)
查看>>
算法(第4版) Chapter 1
查看>>
前端技术选型的遗憾和经验教训
查看>>
“亲切照料”下的领域驱动设计
查看>>