尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Unity-动画IK控制 - 实践

Unity-动画IK控制 - 实践
📅 发布时间:2026/6/19 10:25:00

什么是 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();}// Update is called once per framevoid Update(){}/// /// 处理IK相关逻辑/// /// 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);}/// /// 如果动画本身有移动,但还想自己写移动逻辑可以在这个函数里操作/// 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();}// 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);}
}

相关新闻

  • 2025年深圳印尼物流专线公司最新推荐榜,聚焦服务品质与线路竞争力深度剖析
  • 深度解析噬菌体展示抗体库:从文库构建到特定抗体筛选的核心逻辑
  • 数据库 单机 / 主备 / 主从 / 多主架构选择

最新新闻

  • 35+ 软件产品经理(PM)简历脱胎换骨指南:从“功能执行者”到“商业操盘手”
  • Libero Soc v11.9 从零部署指南:2024年新版安装与证书激活全流程
  • 2026苏州建筑防水修缮服务适配指南:3家值得关注的本地服务商深度解析 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 杭州靠谱收金商户白名单推荐,全城上门验金称重钱款当场结清 - 奢品小当家
  • Halcon 纹理滤波实战:texture_laws算子参数组合与卷积核尺寸的协同优化策略
  • 昆明全品类贵金属回收指南,金价实时更新,线下靠谱门店汇总清单 - 奢侈品回收评测

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号