zoukankan      html  css  js  c++  java
  • Mecanim动画

    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动画:http://www.cnblogs.com/MrZivChu/p/zoom.html

    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

  • 相关阅读:
    Leetcode Substring with Concatenation of All Words
    Leetcode Divide Two Integers
    Leetcode Edit Distance
    Leetcode Longest Palindromic Substring
    Leetcode Longest Substring Without Repeating Characters
    Leetcode 4Sum
    Leetcode 3Sum Closest
    Leetcode 3Sum
    Leetcode Candy
    Leetcode jump Game II
  • 原文地址:https://www.cnblogs.com/MrZivChu/p/ik.html
Copyright © 2011-2022 走看看