博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mecanim动画
阅读量:4923 次
发布时间:2019-06-11

本文共 3337 字,大约阅读时间需要 11 分钟。

1、基础

现在Animation编辑器给个模型设计一个动画,都会自动为此模型加上Animator组件,并产生一个controller后缀的控制器和一个相关的anim后缀的动画剪辑, unity根据Animator去播放动画,控制器去管理各个动画重定向(一个动画转到另一个动画),动画剪辑是展示是个什么样的动画效果,可以看出Unity建议我们使用Mecanim动画,而不再去使用老的动画了!

1、如果我们用Animation编辑器给一个Sphere球做一个改变位置的动画,那么unity会自动给此Sphere加上控制器等如上的操作,假如,我想用Animation老的动画,而不用控制器,那么就需要把此控制器删除,然后附加Animation组件,然后把改变位置的动画赋给Animation组件,运行可以发现,动画根本不起作用!只能用控制器!如果给一个胶囊Capsule添加一个Animation组件,并把这个改变位置的动画赋给此Animation,可以发现也是不起作用的!只能为这胶囊附加控制器,然后把此改变位置的动画放入控制器中,才可以正确的播放动画!

2、只有自己制作的模型(fbx)才能进行旧动画和新动画之间的转换,而像系统自带的模型制作的动画(Animation),是无法转换的!

3、如果一个人物模型使用的是老的动画系统,即人物模型的Inspector面板下选择Rig ->Animation Type为Legacy,表示使用老的动画系统,那么人物会使用Animation这个组件去播放动画,但是我们可不可以把上面的改变位置的动画赋给此Animation去使用呢?答案是”不可以“!我们选中人物,打开Animation编辑器,查看人物的Idle动画,可以看到此动画非常复杂,运用到了人物身上的每一个关节,同时自己也是无法再Add Curve添加动画的!可想而知,一个简简单单的站立动画都这么复杂了,那么上面的改变位置的动画必然无法运用到人物模型上!

4、如果一个人物模型使用的是新的动画系统,即人物模型的Inspector面板下选择Rig ->Animation Type为Humanoid,表示使用新的动画系统,那么人物会使用Animator这个组件去播放动画,同样Animator控制器也是无法使用那个改变位置的动画的

5、如果人物使用的是新的动画系统Animator,那么就可以使用其他模型的动画剪辑了,只要把其他模型的动画剪辑拖入此人物的控制器中即可!

6、如果人物使用的是旧的动画系统Animation,那么是无法使用其他模型的动画剪辑的,把其他模型的动画剪辑拖入此人物的Animation组件中,是无法使用的!

7、一般一个模型是由Transform、Renderer渲染、Mesh、动画组成(新的动画系统还包含Avatar):

    

8、在模型的Rig选项下,keep Additonal Bones保持额外的骨骼(有的模型是没有此选项),所谓的额外骨骼就是指模型的辫子,尾巴之类的骨骼!有的模型有optimize Game Objects优化游戏对象此选项

9、在Configuration的Avatar界面中,Mapping有四个选项,clear表示清除所有匹配,Automap自动匹配,Load加载匹配设置文件,Save保存匹配设置文件!如果想使匹配设置文件变的通用,就必须保证命名的规范性!

这篇文章后面也讲了不少Mecanim动画:

2、IK

1、在Animator窗口里勾选IK Pass

2、关键代码

void OnAnimatorIK(int layerIndex) {
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f);//设置权重     animator.SetIKPosition(AvatarIKGoal.RightHand, rightHand.transform.position);//设置右手IK的位置 }

权重值的范围在0~1,值越小,控制力就越弱,反之越强

例:当权重值为0.1,1时分别的效果情况如下

模型源动画: 

权重值为0.1时:

权重值为1时:

可以看出,当权重值为0.1时,和模型原动画差不多,基本上是无法控制模型的右手的,而权重值为1时,模型的右手基本上被牢牢的控制在IK所设置的位置上那了,即小球的位置那,完全上不受其他动画影响!

3、Apply Root Motion

Animator组件中的Apply Root Motion选项如果我们勾选了的话,当播放动画时,是通过动画运动的幅度来改变角色的Transform的,如果我们不勾选,我们就可以用脚本设定此角色的Tranform。

  如果在Animator中我们勾选了Apply Root Motion,我们不必修改角色的Transform,依靠角色的动作本身的设计就能改变角色的Transform。但是如果我们没有勾选它,那我们就只能依靠程序来动态的改变其Transform,就像老式的动画系统一样。

根运动就是物体的整个网格的影响逐渐远离其创造的起点,但运动是由动画本身创建,而不是通过改变Transform的位置。

 详解:

在很多动画当中,模型的位置、旋转往往会发生变化,我们需要决定是否将模型在动画中发生的这些变换应用到实际模型。

例如我播放一个模型的动画,可以看到这个动画影响了此模型的位置和旋转:

Unity中有两个跟这个有关的设置。如下图:

  

1、不勾选右图的Apply Root Motion,就表示模型的位置和旋转不会受动画的影响(此时就和左图的设置没有关系了!)

2、如果勾选了右图的Apply Root Motion,那么就表示模型的位置和旋转受动画的影响,和左图的设置有关系,如下:

3、但有时我们想模型的位置受动画影响,但是旋转不受动画的影响,那么就要勾选右图的Apply Root Motion,并且勾选左图Root Transform Rotation下的Bake Into Pose(Root Transform Position(Y)下的Bake Into Pose不勾选,Root Transform Position(XZ)下的Bake Into Pose不勾选)

效果图如下:

 

同理:

勾选了Root Transform Position(Y)下的Bake Into Pose就表示模型Position的Y坐标不受动画影响

勾选了Root Transform Position(XZ)下的Bake Into Pose就表示模型Position的XZ坐标不受动画影响

另外、还有左图的Based Upon设置,总共有三个,因为有的模型的位置会有偏移,所以我们一般把此项设置成Original,即使模型基于原点!

Rotation下的Based Upon有两个可选值:Original(基于原点),Body Orientation(基于身体方向)

Position(Y)下的Based Upon有三个可选值:Original(基于原点),Center of Mass(基于质量中心),Feet(基于脚)

Position(XZ)下的Based Upon有两个可选值:Original(基于原点),Center of Mass(基于质量中心)

4、设置模型接收光照

有时候把模型放到场景中去,模型整体是暗色调的,这是因为模型没有接收光照的影响,找到们模型的Render组件,勾选User Light Probes即可!

 

参考:http://wiki.ceeger.com/script:unityengine:classes:animator:animator?s[]=ik

        http://www.xuanyusong.com/archives/2264

        http://blog.csdn.net/cubesky/article/details/39478207

转载于:https://www.cnblogs.com/MrZivChu/p/ik.html

你可能感兴趣的文章
LeetCode_Surrounded Regions
查看>>
NLite 更新日志
查看>>
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。...
查看>>
Java 数组基础,java.util.Arrays
查看>>
python笔记六之模块&操作数据库&写入excel
查看>>
Oracle SQL语句
查看>>
Node.js 模块
查看>>
腾讯云短信服务+Node.js给手机发送验证码
查看>>
Android 第三次作业
查看>>
javascript和php
查看>>
SQL SERVER 设置区别大小写
查看>>
PHP 使用reflection时的问题,以及解决方案
查看>>
返回一个二维数组最大矩阵的和
查看>>
实验一质量属性报告
查看>>
PyCharm下的pywin32安装及使用
查看>>
各类有用的神奇网站
查看>>
java配置opencv-在eclipse中
查看>>
nginx 启动脚本
查看>>
地图几何计算
查看>>
共享程序集
查看>>