IK动画全名是Inverse Kinematics 意思是反向动力学,就是子骨骼节点带动父骨骼节点运动。比如跳街舞的少年用手撑着身体在地上转圈,手就是子骨骼,胳膊身体就是它的父骨骼,这时运动手就需要带动胳膊身体来移动。
IK动画可以在3DMAX 或者Maya中制作(不在本篇的讨论范围内),本篇我么说说在程序中如何动态调用IK动画。IK动画需要使用Unity4新版的动画系统,如果对新版的动画系统不是很了解的朋友建议看看上一篇。Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
如下图所示,设置模型的骨骼并且给模型添加AnimatorController控制器。如果不会添加详细请看上一篇文章。
在Unity导航菜单栏中打开Window->Animator打开动画控制器窗口,在这里勾选IK Pass。
代码方面直接使用API中的,我懒得写了,我给大家详细的解释一下。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))]   public class IKCtrl : MonoBehaviour { 	//动画控制 	protected Animator animator; 	//是否开始IK动画 	public bool ikActive = false; 	//右手子节点参考的目标 	public Transform rightHandObj = null; 	void Start ()  	{ 		//得到动画控制对象 		animator = GetComponent<Animator>(); 	}     //a callback for calculating IK     //它是回调访法。     //前提是在Unity导航菜单栏中打开Window->Animator打开动画控制器窗口,在这里必须勾选IK Pass!!! 	void OnAnimatorIK() 	{ 	      if(animator)  	      {             //if the IK is active, set the position and rotation directly to the goal.              //即或IK动画后开始让右手节点寻找参考目标。  			if(ikActive)  			{                //weight = 1.0 for the right hand means position and rotation will be at the IK goal (the place the character wants to grab)                //设置骨骼的权重,1表示完整的骨骼,如果是0.5哪么骨骼权重就是一半呢,可移动或旋转的就是一半,大家可以修改一下参数试试。 			   animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1f); 			   animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1f); 			    //set the position and the rotation of the right hand where the external object is 				if(rightHandObj != null)  				{ 					//设置右手根据目标点而旋转移动父骨骼节点 					animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); 					animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); 				}					 			}             //if the IK is not active, set the position and rotation of the hand back to the original position 			//如果取消IK动画,哪么重置骨骼的坐标。 			else  			{			 				animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); 				animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0);				 			} 		} 	}	   } | 
如下图所示,图中哪个小球就是子节点参考的目标。,在Scene视图中移动哪个小球,你会发现主角的右手开始IK动画。
上面代码中我们IK的是主角的右手,实际上IK动画支持两个手和两个脚。
| 1 2 3 4 5 6 7 8 | 					//	AvatarIKGoal.RightHand 右手 					//	AvatarIKGoal.LeftHand  左手 					//	AvatarIKGoal.LeftFoot  左脚 					//	AvatarIKGoal.RightFoot 右脚 					animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); 					animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); | 
OK!快快用代码来动态的制作你的IK动画吧,欢迎一起讨论技术,如有疑问请留言给我哇咔咔~
- 本文固定链接: https://www.xuanyusong.com/archives/2264
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
                        	捐  赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
                        
                        					







如何把IK同步到网络端呢?? 用的unet
想问这个问题+1,你解决了嘛 
 
雨松这个太666了,能用头带动身体就好了,有解决方法吗?我想把头往下拉的时候,腰能弯曲。
AvatarIKGoal 只有四个类型,那如果我想要控制更精细的控制,比如手指摆个造型呢,有什么办法吗。
雨松,你写的这些我都加上了,为啥模型的右手一点动静都没有啊,也没报错,求解!!! 
 
请问下,IK动画做出的动作是maya或者max里面定义好的吗?还是说虚拟人物的手臂可以跟着球在限定范围做各种不同的动作,比如说屈伸手、抬手、放低手这类的动作
同问
雨松大大,太犀利了。能不能不把这个模型给我试试,我不知道让美工做个什么样的模型给我
绑定之后拖动小球模型啥反应也没有啊
转发!里面的图如果能动起来就好啦 ^_^
momo玩过亡灵杀手没???!!!最近我接到任务,要做一个那样的玩意儿…..头都大了。被以下几点困住了1:一刀过去一群人受伤2:被砍倒地飞天之类的到底是用物理效果还是 itween写代码3:砍的时候 ,每次砍都会往前冲,冲的时候脚边的那道风是咋出来的
图片太猥琐,我就删了 还怕被和谐。你懂得~~我不怎么玩游戏, 平时一般就打打撸啊撸 呵呵
1.用代码写 不用解释2. 怀疑是代码写的 因为 真是的物理放在游戏中可能会不自然。3. 应该是shader
可以把工程文件发出来吗?,谢谢!一个人自学中,
貌似有点意思诶,今天忙晕了。改天再试 哈哈。沙发 沙发 歪歪爽