摘要:IK是Inverse Kinematic的缩写,也就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置。

洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

“大智,昨天你说要给我讲讲IK,趁现在有空,你给我讲讲呗”

“IK你已经明白是什么意思了吧?”

IK是Inverse Kinematic的缩写,也就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置。

“没错,那你能想到一些适用的场景么?”

“嗯。。。我想想:比如角色需要拿各种不同的东西,让角色的手能符合各种不同的东西的握持位置,这样就不用针对每种不同的东西单独制作动画了!

“非常棒!这是IK最常见的一种用途。其他的用途其实还有比如:角色的头的旋转,这样可以和你视角的方向一致。角色的脚的位置,这样可以让角色踩在地面跟贴合。

“对对对,我只想到手了。那还有其他的么?”

“**Unity中IK能设置的部位就是5个,分别是:头、左右手、左右脚。**所以没有其他部位的IK了,我们常见的其实也都是这些。”

设置IK

小新:“那具体如何用呢?”
大智:“那我就用实例来给你演示下IK是如何使用的”

头部IK

小新和大智来到了大智的工作台前。
大智:“我们先来看看如何设置人物的头部根据视角旋转。需要用到这两个API:Animator.SetLookAtPosition和Animator.SetLookAtWeight,对应的方法为:”

public void SetLookAtPosition(Vector3 lookAtPosition);

“这个方法用来设置头部看向的位置,比如看向你左边的窗户,头就会相应的旋转。”
“这个看起来很简单嘛。”
“对,这个方法确实很简单,不过还有另外一个:”

public void SetLookAtWeight(float weight, float bodyWeight = 0.0f, float headWeight = 1.0f, float eyesWeight = 0.0f, float clampWeight = 0.5f);

“这个方法用来**设置IK的权重,这个IK会和原来的动画进行混合。如果权重为1,则完全用IK的位置旋转;如果权重为0,则完全用原来动画中的位置和旋转。**至少要设置第一个参数,后面的几个参数都有默认值,但是你也要了解所有参数的含义:”

  • Weight 全局权重,后面所有参数的系数
  • bodyWeight 身体权重,身体参与LookAt的程度,一般是0
  • headWeight 头部权重,头部参与LookAt的权重,一般是1
  • eyesWeight 眼睛权重,眼睛参与LookAt的权重,一般是0(一般没有眼睛部分的骨骼)
  • clampWeight 权重的限制。0代表没有限制(脖子可能看起来和断了一样),1代表完全限制(头几乎不会动,像是固定住了)。0.5代表可能范围的一半(180度)。

大智:“有了这两个方法你就可以实现头部的IK了,不过还有两点需要注意:”

1、需要勾选对应Layer的IK Pass选项(在Layer的设置里)。
2、代码需要写在OnAnimatorIK这个事件方法里面。

void OnAnimatorIK(int layerIndex)
{_animator.SetLookAtPosition(pos);_animator.SetLookAtWeight(1);
}

上面的代码就是人物的头部看向一个位置的代码。需要注意的是这个OnAnimatorIK方法有一个参数layerIndex,这个就是对应的Layer的序号,只有勾选了IK Pass的layer才会调用到这个方法里,每个勾选了IK Pass的layer调用一次。

小新:“这样我就能实现人物的头跟着视角移动了,哦也”
大智:“是的哦”

手脚IK

小新:“那手脚的IK是不是也跟这个类似的?”
大智:“是的,手脚的IK是和这个类似的,不过API有些不一样,我们来看看”

public void SetIKPosition(AvatarIKGoal goal, Vector3 goalPosition);
public void SetIKRotation(AvatarIKGoal goal, Quaternion goalRotation);

设置头部时,因为头不会移动,所以只需要设置LookAt的位置,头部跟随旋转即可。
但是对于手和脚,需要同时设置位置和旋转。

goal AvatarIKGoal枚举类型,包含:

  • LeftFoot 左脚
  • RightFoot 右脚
  • LeftHand 左手
  • RightHand 右手

goalPosition/goalRotation IK目标位置/旋转

同样还有设置权重的API:

public void SetIKPositionWeight(AvatarIKGoal goal, float value);
public void SetIKRotationWeight(AvatarIKGoal goal, float value);

goal AvatarIKGoal枚举类型
value IK的权重,1代表完全使用IK值,0代表使用原动画的值

常见的设置手部IK的代码是(一般需要4行代码设置一个部位):

void OnAnimatorIK(int layerIndex)
{_animator.SetIKPosition(AvatarIKGoal.LeftHand, position);_animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);_animator.SetIKRotation(AvatarIKGoal.LeftHand, rotation);_animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
}

小新:“谢谢智哥,这样我就明白很多了。我要去改造一下我的人物角色的头部方向和握枪!”
说着小新就跑回了自己的房间。

IK位置/旋转调节小技巧

小新:“大智,这个IK的位置好难调整啊,我想让角色拿枪的手能够贴合这个枪,有没有什么简单的办法?我这调了一个多小时了,还不是特别完美。。。”
大智:“调IK是个慢活,不过呢,确实有一些小技巧在里面。IK相关的代码涉及到位置和旋转,这时候不要傻傻的直接定义一个位置和旋转来手动设置,最好的办法是设置两个参照物,作为IK的位置和旋转的参考,这样只需要调这两个参照物就可以了。”
小新:“对对对,这样的话就不用去修改位置和旋转的值,而是直接修改这俩参照物的位置和旋转就可以了。我来试一下。”

小新:“太棒了,这样我就能在运行时调整这个参考位置,调到一个完美的位置和角度。”

小新三下五除二,就调到了一个合适的位置和角度。

“调好了!”小新高兴地喊道,随即退出了Play状态。

大智:“高兴早了吧?你这么就退出来了,修改的能保存下来么?”

小新:“啊。。。我给忘了,那这怎么办,运行时的修改保存不下来啊。。。”

大智:“快想想,我之前教过你一个小技巧,可以保存运行时的数据,不能这么快就给忘了吧?”

小新:“我有印象你教过我,不过这么久一直没实际用到过,哪能记得清啊”

大智:“那我再教你一遍,这次可得记好了。”

小新:“一定一定,再忘了我就……我就……再问你一遍,哈哈哈哈”

大智:“皮一下很开心?记好了,点击Transform组件右上角的小图标,可以Copy Component,在运行时点击,退出运行后,再点击小图标,选择Paste Component Values,这样就可以将数据粘贴回来了。”

  • 在Inspector的Transform的右上角,点击齿轮小图标,选择Copy Component Values
  • 退出Play模式
  • 在Inspector的Transform的右上角,点击齿轮小图标,选择Paste Component Values

小新:“哦~~我回忆起来了,这次绝对不会再忘记了”

总结

小新:“有了IK,人物就能更符合游戏的需要了,而且可以根据不同的情形动态调整,人物就不会那么呆呆的了。”
“看来小新对IK的理解还是挺深的。”

今日思考题

大智:“给你布置个作业,去用IK把你人物的视角以及拿枪的手部位置实现一下吧”
“收到!我去也!”
“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

扩展阅读

  • Unity动画系统详解1:在Unity中如何制作动画?
  • Unity动画系统详解2:如何导入使用外部的动画?
  • Unity动画系统详解3:如何播放、切换动画?
  • Unity动画系统详解4:如何用代码控制动画?
  • Unity动画系统详解5:BlendTree混合树是什么?
  • Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)
  • 【建议收藏】找不到免费的角色动画?来试试mixamo

【扩展学习】在洪流学堂公众号回复动画可以阅读本系列所有文章,更有视频教程等着你!


呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

我是大智(微信:zhz11235),你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

Unity动画系统详解8:IK是什么?相关推荐

  1. Unity动画系统详解9:Target Matching是什么?

    摘要:在游戏中,经常有这种情况:角色的手或者脚需要在特定时间放在特定的位置.比如角色需要用手撑着跳过一个石头或一堵墙,或者跳起抓住房梁.Target Match就是让动画的特定片段去匹配特定的位置. ...

  2. Unity动画系统详解3:如何播放、切换动画?

    摘要:[长文预警,建议先收藏]有了模型和多个动画以后,在Unity中如何控制它们的播放和切换呢?本文带你一站式解析Unity的Animator模块. 洪流学堂,让你快人几步.你好,我是跟着大智学Uni ...

  3. Unity动画系统详解7:Layer是什么?

    摘要:使用Layer可以用来管理角色的不同身体部位.比如下半身用于行走或跑步,上半身用于射击或投掷物体. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu) ...

  4. Unity动画系统详解10:子状态机是什么?

    摘要:除了使用Layer还有没有更好的组织状态的方式呢?感觉一个Layer里面状态多的时候,还是很显得很乱. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是复(yu)习( ...

  5. Unity动画系统详解5:BlendTree混合树是什么?

    摘要:"Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树." 洪流学堂,让你快人几步.你好,我是跟着大智 ...

  6. Unity动画系统详解4:如何用代码控制动画?

    摘要:通过上一篇咱们知道了播放动画需要使用Animator,那么如何用代码控制动画呢? 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统 ...

  7. Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)

    摘要:Root Transform是body transform在Y平面上的投影,并且是运行时计算的.每一帧Root Transform的变化实时计算.然后Transform的变化会被应用到GameO ...

  8. Unity动画系统详解2:如何导入使用外部的动画?

    摘要:在Unity中只能制作比较简单的动画,要想要复杂的动画,比如人物跳舞的动画,那就得在外部的软件中制作并且导入到Unity中使用,那这个过程是什么呢? 洪流学堂,让你快人几步.你好,我是跟着大智学 ...

  9. Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动.真实.Unity场景中的物体可以通过制作动画,让物体动起来.简单的动画如物体的移动.旋转(比如旋转的风扇.闪烁不定的灯泡等),复杂的动画如游戏中角 ...

最新文章

  1. 教育的本质是人点亮人
  2. Altium Designer修改3D视图时PCB板的颜色
  3. java文件不存在就创建_Java中创建并写文件的5种方式
  4. 活动执行手册_1-200家门店,标准化不等于手册!而是标准+训练+督导,缺一不可!...
  5. Google2012.9.24校园招聘会笔试题
  6. 怎样理解阻塞非阻塞与同步异步的区别?
  7. php 字符串 中文,php 中文字符串截取乱码
  8. 【Matplotlib】详解图像各个部分
  9. 数据部门如何All In AI
  10. VMware下安装Linux,Centos-7-x86_64-NetInstall.iso版本
  11. 25. 二叉树中和为某一个值的路径(C++版本)
  12. IPFS - 可快速索引的版本化的点对点文件系统
  13. 红巨人特效插件套装effects suite mac版
  14. springboot 加载一个properties文件转换为对象、List和Map数据结构
  15. matlab图形黎曼几何,张思容
  16. 英国脱欧给云计算行业带来震动:六大典型场景解析
  17. 记一次投票系统维护以及防止刷票springboot+redis
  18. R语言-模型拟合及预测(新数据集)常见问题及解决方案
  19. 缓存数据库Redis
  20. SAP中国研究院总裁芮祥麟:从千里马到伯乐

热门文章

  1. 2021互联网新年礼盒太变态!好想拥有,网友:伤害不大侮辱性极强
  2. ffmpeg命令分析-t
  3. 将Doc/View 应用程序打造成 ActiveX 控件
  4. 湖南商学院c语言期末试题,(湘潭大学C语言程序设计Ⅱ》课程考试试卷.doc
  5. qq打开网页时提示用浏览器打开html,微信QQ打开网页时提示用浏览器打开
  6. python基础库-python基础库-Pandas
  7. FPGA基于VGA显示字符及图片
  8. java怎么打印星期_java中获取日期是星期几的两种方法
  9. 与外包人员合作时,如何管理代码?
  10. 怎样把c语言软件卸载干净,系统软件怎样操作才能彻底卸载删除干净软件程序...