IK反向动力学简单理解

选中Player对象,创建空的子对象,做六个小球,分别对应body,leftHand,rightHand,leftFoot,rightFoot,lookat,接着在AnimatorController的Base Layer中勾选IK Pass项,补选的话后面球不会动。
1)创建MyIK脚本,实现IK功能
2)在类MyIK中加入以下变量:

public Transform bodyObj=null;
public Transform leftFootObj=null;
public Transform leftHandObj=null;
public Transform rightHanddObj=null;
public Transform rightFootObj=null;
public Transform lookatObj=null;
private Animator avatar;
private bool ikActive=false;

前面六个变量是对应操作对象,avatar表示角色对象的Animator组件,ikActive表示是否勾选IK选项,在Inspector窗口将这些变量一一赋值。
在函数中Start初始化变量avatar

avatar=GetComponent<Animator>();

在函数Update中加入以下代码:

if(!ikActive)
{
  if(bodyObj!=null)
  {
    bodyObj.position=avatar.bodyPosition;
    bodyObj.rotation=avatar.bodyRotation;
  }
  if(leftFootObj!=null)
  {
    leftFootObj.position=avaatar.GetIKPosition(AvatarIKgoal.LeftFoot);
    leftFootObj.rotation=avaatar.GetIKRotation(AvatarIKgoal.LeftFoot);
  }
  if(looatObj!=null)
  {
    lookatObj.position=avatar.bodyPosition+avatar.bodyRotation*new 
    Vector3(0,0.5f,1);
  }
}

1.这是没有激活IK的状态,控制对象从avatar(角色)上获得
2.角色躯干部分的位置和旋转系数由Animator组件的bodyPosition和bodyRotation来设置
3.在设置角色左手位置时,调用dAnimator类的成员函数GetIKPosition,并指定IK目标为左脚,即AvatarIKgoal.LeftFoot。这样GetIKPosition就会返回IK目标点的旋转量,其返回的是一个Quaternion对象。
4.avatar.bodyPosition+avatar.bodyRotation*new
Vector3(0,0.5f,1);表示将球控制在颈部的控制球在角色前上方。
5.其余部位代码自行添加,一模一样
接着写激活IK的代码
在脚本添加OnAnimatorIK中加入以下代码:

void OnAnimatorIK(int layerIndex)
{
  if(avatar==null) ruturn;
  if(ikActive)
  {
   avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot,1.0f);
   avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot,1.0f);//不设置的话不会动的
  }
  if(leftFootObj!=null)
  {
   avatar.SetIKPosition(AvatarIKGoal.LeftFoot,leftFootObj);
   avatar.SetIKRotation(AvatarIKGoal.LeftFoot,leftFootObj);
  }
  if(lookatObj!=null)
  {
    avatar.SetlookatPosition(lookatObj.position);//视角不会旋转的所以就不用加旋转
  }
  
}
else
{
  avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot,0);
  avatar.SetIKRotationnWeight(AvatarIKGoal.LeftFoot,0);
}

剩下部位代码自行添加,照着做就行。
再加个勾选IK选项的代码:

void OnGUI()
{
  ikActive=GUILayout.Toggle(ikActive,"激活IK")}

所以,使用IK功能时要用到 SetIKPositionWeight(AvatarIKGoal.LeftFoot,1); 设置权值然后再调用 SetIKPosition(AvatarIKGoal.LeftFoot,leftFootObj);
不用IK的话不用权值,接着 GetIKPosition(AvatarIKgoal.LeftFoot);

FK是父骨骼带动子骨骼,IK是子骨骼带动父骨骼。

参考Unity官方案列

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值