Unity——IK动画契合匹配初体验

2023-10-27

学到siki学院的动画系统那一章节的IK动画Siki,顺便作点笔记。

1.什么是IK

IK(Inverse Kinematics)即反向动力学,即可以使用场景中的各种物体来控制和影响角色身体部位的运动,一般来说骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学),而IK则倒过来,由骨骼子节点带动骨骼父节点,具体情况比如人物走路踩到了石头就需要由脚的子节点来带动全身骨骼做出踩到石头的响应。(网上复制的…)

2.目标展示


我们可以看到人物背起木头时,双手和木头的贴合度非常高,不是纯粹的将树木悬置于肩上,而是与双手所绑定,接下来我们一步步还原如何实现上述过程

3.效果还原

(1).添加Log树木

素材里的Log添加到场景中,给其加上Capsule Collider组件,并且勾上Is Trigger和打上标签名Log ,方便我们之后进行触发检测。

树木旋转效果只要给其填上如下代码即可

public class RotateSelf : MonoBehaviour {
    public float rotateSpeed = 90;
	
	void Update () {
        transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime, Space.World);
	}
}
(2).触发检测

在我们的人物脚本中添加触发检测的代码

 public GameObject unityLog;
 private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Log")
        {
            Destroy(other.gameObject);
            CarryLog();
        }
    }
    void CarryLog()
    {
        unityLog.SetActive(true);
    }

代码中 unityLog为素材树木prefeb 将其添加到人物的模型中去,具体位置如图所示(毕竟要抗在肩上)

实际情况中记得将场景中肩上的树木SetActive为false,只有在触发检测成功的时候才会将肩上的树木显示出来。

现在的结果如下图所示:

(3).添加扛起树木的动画和骨骼遮罩AvatarMask
  • 我们首先先要创建一个新的Layer层HoldLog
    在其中添加一个空状态NormalHoldLog动画 其中的转换在之后再细说

  • 然后我们要添加一个AvatarMask,因为扛着木头只需要用到左右手,不需要用到身体其他部位,于是创建如下图所示的AvatarMask并添加到HoldLog层中

(4).添加动画播放的时机
  • 我们首先在Base Layer层中添加一个bool变量 IsHoldLog用来控制播放的时机

  • 然后我们在HoldLog层中的normal状态转换到HoldLog状态的箭头中设置IsHoldLog为true,反过来状态可以设置为false

    相应的我们再添加新的代码

      private int isHoldLogID = Animator.StringToHash("IsHoldLog");
 //StringToHash方法可以有效避免设置变量参数时对其字符串名打错的情况
    void CarryLog()
    {
        unityLog.SetActive(true);
        anim.SetBool(isHoldLogID, true);
    }

此时我们运行完结果如下图

很明显我们可以发现此时人物举起时的双手并没有和木头进行贴合,终于要讲到我们的主题了… IK动画!

(5).IK动画的设置
  • 首先我们先要给木头两旁添加两个合适的点位用来之后的IK动画位置(左手和右手都要设置)
  • 设置完后我们要在之前的HoldLog层中勾选上IK Pass
  • 接着就是添加代码
public Transform leftHand;  //就是之前我们事先设置好的木头两侧位置
public Transform rightHand;
private void OnAnimatorIK(int layerIndex)
    {
        if (layerIndex == 1) //只有勾选了IK Pass才有layerIndex
        {
            int weight = anim.GetBool(isHoldLogID) ? 1 : 0; 
            anim.SetIKPosition(AvatarIKGoal.LeftHand,leftHand.position);
            anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight);//设置目标位置的权重,1表示完美匹配相当于100%
            anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHand.rotation);
            anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight);

            anim.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position);
            anim.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
            anim.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation);
            anim.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);
        }
    }

当然初次运行的时候,我们可能会发现手的位置还是没有完全匹配到木头两侧,这个时候我们就要微调之前的两个坐标位置RightHandLeftHand

运行的时候进行移动和旋转的调试,手会同步的进行改变,记得选择好合适的位置时把Transform里面的数据复制一下(因为我们是处于运行状态时更改的数据,停止运行时数据会初始化)

好了这样我们就大功告成了,再次运行后就是我们最上方的成果的那张GIF了!

4.总结

IK动画主要关键点就是要给Animator中的需要添加IK动画的层上勾选IK Pass这样才能存在LayerMask值,然后通过方法SetIKPosition和SetIKRotation来保持需要匹配的位置和旋转角度(需要事先添加好合适的Transform),其中的SetIKPositionWeight和SetIKRotationWeight就是用来匹配契合程度的,范围是0-1,可以相当于百分比0-100%

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity——IK动画契合匹配初体验 的相关文章

  • Unity—UGUI

    每日一句 读数 学习 去更远的地方 才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例 用户名和密码 Toggle组件 案例 冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容
  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • using UnityEditor引用注意事项

    本文转载自http blog csdn net czlilove article details 19979725 在运行时脚本中使用UnityEditor命名空间 假如该脚本被挂在场景中的物体上 那么 可以这样做 在Unity编辑器中运行
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • c#获取cpu序列号

  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相

随机推荐

  • 【电商专享】聚划算活动海量商品一键报名,省时省力!

    电商专享 聚划算活动海量商品一键秒参与 省时省力 本机器人支持自动登录淘宝账号 输入密码并智能通过验证 将根据表格内容自动填写商品信息完成聚划算活动报名 并支持多款商品上传
  • 又是沙雕的一天-------关于错误关掉任务管理器之后出现的开机黑屏的解决

    沙雕经过 肝了一下午的实验 然后脑子十分不清醒的我 看着自己电脑上N多的窗口 默默的任务栏 gt 右键 gt 任务管理器 gt 任务管理器 gt 结束任务 然后华丽丽的让电脑黑屏了 想起社团大佬的教诲 默默的强制关机 好使 接着登陆界面出现
  • C++11:std::move和std::forward

    标准库函数 std move 既然编译器只对右值引用才能调用转移构造函数和转移赋值函数 而所有的命名对象都只能是左值引用 如果已知一个命名对象不再被使用而想对他调用转移构造函数和转移赋值函数 也就是把一个左值引用当做右值引用来使用 怎么做呢
  • 异步通信起始位正确检测的VHDL实现

    异步通信起始位正确检测的VHDL实现
  • apache做反向代理服务器

    http yahoon blog 51cto com 13184 162922 原创作品 允许转载 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http yahoon blog 51cto com 13
  • 游戏开发unity杂项知识系列:unity可以使用的小技巧

    插眼 总结 个人觉得这些技巧都挺实用的 参考 Unity3d 提升开发效率的小技巧 第一集 哔哩哔哩 bilibili 一共有五集 这是第一集
  • vue项目中获取今天,昨天,明天时间方法

    在项目中有这个需求 就是在时间查询条件了中 需要默认前天的时间 如果你项目中需要使用今天 昨天 明天时间方法同样适用 具体方法如下 1 vue调用说明 比如我是需要前天的时间 this getDay 2 这个是不包括时分秒的 更多例子如下
  • springMVC中两种validation的简单使用

    本文转自 http elf8848 iteye com blog 1299587 Spring 基于注释的校验机制 1 支持JSR303 Bean Validation定义的校验规范 2 支持Spring框架定义的Validator接口定义
  • 首批!八家大模型企业面向全民开放

    Datawhale干货 开放 国产大模型 编辑 司玉鑫 前 言 在科技领域 一项重要的消息引起了广泛关注 8月31日凌晨 首批大模型产品终于获得了正式批准 这一消息不仅令行业内的巨头企业欢欣鼓舞 也使创业公司和科研院校感到振奋 这些获得批准
  • Oracle (内连接)与(外连接)区别

    表t user1 t user2 t user3 各有id name两列 id name 1 10A 2 20A id name 1 10B 3 30B id name 1 10C 4 40C 连接分为两种 内连接与外连接 A 内连接 内连
  • 高版本IAR打开低版本编译的程序出现的问题

    山外KEA程序一打开就出现这个 The project file vcan Kinetis ewp is in an old format Would you like to convert it for use with this ver
  • keil MDK之RTX的消息邮箱的API函数

    一 RTX消息邮箱的API函数 RTX消息邮箱的API函数总共有8个 如下图 下面就将几个这里要用到的函数 1 os mbx declare函数原型 define os mbx declare name Name of the mailbo
  • 深度可分离卷积及其代码实现

    深度可分离卷积 depthwise separable conv 一共两步 第一步先进行逐通道卷积 Depthwise Convolution 第二步进行 逐点卷积 Pointwise Convolution 普通卷积 输入是三个通道 输出
  • acrobat页面显示问题

    最近对着电脑的时间比以前多太多了 每天都用Acrobat看pdf 千万别告诉我你用Adobe Reader 为了保护眼睛 需要更改下页面显示 一 背景颜色 经常对着电脑看文档的人 需要修改下背景颜色 通常默认的背景色都是白色的 阅读时间短倒
  • 【Nginx】常用配置

    一 问题 1 1 环境 电脑环境 Windows 10 开发工具 IntelliJ IDEA 数据库环境 Redis 3 2 100 JDK环境 Jdk1 8 1 2 问题 Nginx 基本配置是什么 二 解答 1 配置 2 检测 3 启动
  • 毕业设计题目

    旅游社交系统 基于Web的学校教室租赁系统 学校在线二手交易平台 基于移动平台的轻博客系统开发 基于web的IT技术论坛 基于Java EE新闻管理系统的设计与实现 网上员工考试培训系统 基于JAVA JSP SSH WEB的简单邮件系统设
  • C++数组

    数组是有序的元素序列 长像 int a 5 1 2 3 4 5 数组名单独使用 等同于指向数组内存首地址的指针 也就是数组名可以当指针使用 Over
  • DedeCMS内容页受统计影响打开速度慢的解决方法

    织梦DedeCMS网站被挂马后解决方案 DedeCMS内容页受统计影响打开速度慢的解决方法 Dedecms文章内容页受统计影响打开速度较慢的解决方法 dedecms文章内容页加载统计的时候会有卡住停顿 如果网速慢干脆就停止下边网页的加载 D
  • [转]基于NXP i.MX8QM的QNX之汽车数位仪表板方案

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 email 174176320 qq com 基于NXP i MX
  • Unity——IK动画契合匹配初体验

    学到siki学院的动画系统那一章节的IK动画Siki 顺便作点笔记 1 什么是IK IK Inverse Kinematics 即反向动力学 即可以使用场景中的各种物体来控制和影响角色身体部位的运动 一般来说骨骼动画都是传统的从父节点到子节