当前位置: 首页 > news >正文

Unity-动画IK控制

什么是 IK?在骨骼动画中,构建骨骼的方法被称为正向动力学

它的表现形式是,子骨骼(关节)的位置根据父骨骼(关节)的旋转而改变

用我们人体举例子,当我们抬起手臂时,是肩部关节带动的整个手臂的运动,用父子骨骼理解的话就是父带动了子

而 IK 全称是 Inverse Kinematics,翻译过来的意思就是反向动力学的意思

它和正向动力学恰恰相反

它的表现形式是,子骨骼(关节)末端的位置改变会带动自己以及自己的父骨骼(关节)旋转

用我们人体举例子,当我们拿起一个杯子的时候是用手掌去拿,以杯子为参照物,我们移动杯子的位置,手臂会随着杯子一起移动用父子骨骼理解的话就是子带动了父

如何进行 IK 控制

在状态机的层级设置中 开启 IK 通道

继承 MonoBehavior 的类中Unity 定义了一个 IK 回调函数:OnAnimatorIK我们可以在该函数中调用 Unity 提供的 IK 相关 API 来控制 IK

Animator 中的 IK 相关 API

SetLookAtWeight 设置头部 IK 权重

SetLookAtPosition 设置头部 IK 看向位置

SetIKPositionWeight 设置 IK 位置权重

SetIKRotationWeight 设置 IK 旋转权重

SetIKPosition 设置 IK 对应的位置

SetIKRotation 设置 IK 对应的角度

AvatarIKGoal 枚举 四肢末端 IK 枚举

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class lesson16 : MonoBehaviour
{public Transform pos;public Transform rightHandpos;public Transform leftHandpos;public Transform rightFootpos;public Transform leftFootpos;private Animator animator;// Start is called before the first frame updatevoid Start(){animator = GetComponent<Animator>();}// Update is called once per framevoid Update(){}/// <summary>/// 处理IK相关逻辑/// </summary>/// <param name="layerIndex"></param>private void OnAnimatorIK(int layerIndex){//头部IK相关//weight:LookAt全局权重0-1//bodyWeight:LookAt时身体的权重0-1//headWeight:LookAt时头部的权重0-1//eyesWeight:LookAt眼睛的权重0-1//clampWeight:0表示角色运动时不受限制,1表示角色完全固定无法执行LookAt,0.5表示只能够移动范围的一半animator.SetLookAtWeight(1,0.5f,0.5f);animator.SetLookAtPosition(pos.position);//四肢IK相关animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1f);animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f);animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandpos.position);animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandpos.rotation);animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1f);animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1f);animator.SetIKPosition(AvatarIKGoal.RightFoot, rightFootpos.position);animator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootpos.rotation);animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1f);animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1f);animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandpos.position);animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandpos.rotation);animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1f);animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1f);animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootpos.position);animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootpos.rotation);}/// <summary>/// 如果动画本身有移动,但还想自己写移动逻辑可以在这个函数里操作/// </summary>private void OnAnimatorMove(){}
}

关于 OnAnimatorIK 和 OnAnimatorMove 两个函数的理解

我们可以简单理解这两个函数是两个和动画相关的特殊生命周期函数

他们在 Update 之后 LateUpdate 之前调用

他们会在每帧的状态机和动画处理完后调用

OnAnimatorIK 在 OnAnimatorMove 之前调用

OnAnimatorIK 中主要处理 IK 运动相关逻辑

OnAnimatorMove 主要处理 动画移动以修改根运动的回调逻辑

他们存在的目的只是多了一个调用时机,当每帧的动画和状态机逻辑处理完后再调用

鼠标控制角色看向方向

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class lesson15 : MonoBehaviour
{public Transform transformPos;private Animator animator;private float x;private float y;// Start is called before the first frame updatevoid Start(){animator = GetComponent<Animator>();}// Update is called once per framevoid Update(){animator.SetFloat("x",Input.GetAxis("Horizontal"));animator.SetFloat("y", Input.GetAxis("Vertical"));if (Input.GetKeyDown(KeyCode.Space)){animator.SetTrigger("New Trigger");}x += Input.GetAxis("Mouse X");x = Mathf.Clamp(x, -30, 30);y += Input.GetAxis("Mouse Y");y = Mathf.Clamp(y, -30, 30);}private void OnAnimatorIK(int layerIndex){animator.SetLookAtWeight(1, 0.5f, 0.5f);Vector3 pos = Quaternion.AngleAxis(x, Vector3.up) * (transformPos.position + transformPos.forward * 10);pos = Quaternion.AngleAxis(-y, Vector3.right) * pos;animator.SetLookAtPosition(pos);}
}
http://www.dtcms.com/a/409738.html

相关文章:

  • 华天软件Inforcenter PLM uploadFileTolls接口存在任意文件上传漏洞
  • FT2000/4核Linux下GPIO中断调试说明
  • 从后端到react框架
  • 几个Linux系统安装体验: 银河麒麟服务器系统V11
  • 金仓数据库打通电子证照国产化“最后一公里”——福建某地2TB MongoDB无缝迁移实践
  • 宁波网站建设明细报价上海红蚂蚁装潢设计有限公司
  • 罗田企业网站建设在贸易网站怎么做贸易
  • 前端登录加密实战:从原理到落地,守护用户密码安全
  • 公司网站域名申请流程江苏营销型网站建设
  • 做外单网站亚马逊如何做ps4的游戏视频网站
  • 企业门户网站建设特色小程序营销策划方案
  • 网站加ico图标如何登陆网站空间
  • 外贸网站建设 东莞企业信息管理系统登录
  • 天津品牌网站建设推广产品吸引人的句子
  • 网站建设价格标准渠道电商设备网站怎么做
  • 秦皇岛网站制作费用服务器维护费用明细
  • 浙江鼎兴建设有限公司网站加强政协机关网站建设
  • 做视频网站 带宽多少才合适谷歌优化推广
  • 网站设计费用入哪个会计科目宜都市网站建设
  • 建标网seo是指什么职位
  • i深圳网站建设wordpress数据库排序规则
  • 服务器做视频网站江苏省宝应城市建设有限公司网站
  • 网站默认图片北京市建设工程第四检测所网站
  • 安网站建设免费一键logo在线设计
  • 数码产品销售网站建设策划书做外贸需要具备什么条件
  • 空间备案网站cms 网站
  • 欧美网站设计风格深圳家具定制
  • 如何通过建立网站赚钱龙岗南联网站建设
  • win2003做网站软文营销什么意思
  • 网站优化的文章网站建设在windos的设置