Unity-IK(反向运动学)

IK是什么?

IK是反向运动学:

大多数动画是通过将骨架中的关节角度旋转到预定值来生成的。子关节的位置根据父关节的旋转而改变,因此可从父关节包含的各个关节的角度和相对位置来确定关节链的终点。这种构建骨架的方法被称为正向动力学。

然而,从相反视角看待构建关节的任务通常很有用:在空间中选择一个位置后,向后找到一种有效的关节定位方法,使终点落在该位置。如果您希望角色触摸位于用户选定位置的对象或让角色的双脚牢牢扎入不平坦的表面,这种方法可能很有用。

设置IK

创建 Animator Controller,使其包含该角色的至少一个动画。然后,在 Animator 窗口的 Layers 面板中,单击层的齿轮设置图标,并选中弹出框中的 IK Pass 复选框。
在这里插入图片描述
将Animation Controller分配给Animator组件
设置脚本
脚本名为ikControl,脚本为角色的右手设置 IK 目标。

using UnityEngine;
using System;
using System.Collections;
public class iKControl : MonoBehaviour {
public Animator animator;
public bool isActive;
public Transform rightHand;
public Transform leftHand;
void Start(){
 	animator=GetComponent<Animator>();
}
 void OnAnimator(){
  if(animator){
	if(isActive){
		  // 设置观察目标位置(如果已分配)
                if(lookObj != null) {
                    animator.SetLookAtWeight(1);
                    animator.SetLookAtPosition(lookObj.position);
                }    

                // 设置右手目标位置和旋转(如果已分配)
                if(rightHandObj != null) {
                    animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
                    animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);  
                    animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
                    animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
                }        
	}
	 // 如果 IK 未处于活动状态,请将手和头部的位置和旋转设置回原始位置
	else {
	animator.SetIKPositionWeight(AvatarIKGoal.rightHand,1);
	animator.SetIKPositionWeight(AvatarIKGoal.lefttHand,1);
	animator.SetLookAtWeight(0);
	}
	
  }
 }
}

调整手的位置,因此在物体下建立一个空物体以确保手在物体上,手的目标是空物体。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值