分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
1. Unity3D老的动画系统Animation
1.1 基本概念
1.1.1 AnimationClip
通过FBX导入的各个动画对象其实就是一个AnimationClip。此类以关键帧的形式记录了骨骼关节在各个时间点上的位置、旋转信息,根据帧率frameRate和播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。1.1.2 AnimationState
每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的管理者。其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中使用,在简单的动画控制时并不需要对AnimationState进行直接操作。
1.1.3 Animation
Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。1.2 动画播放模式
1.2.1 简单动画播放控制
所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。1.2.2 自定义混合动画控制
1.2.2.1 多动画同时播放的需求
在大多数情况下简单的动画播放控制已经足够,然而当游戏变得复杂时,单动画播放带来的问题就是美术工作量的急剧增加。最为典型的就是第三人称射击(动作)游戏,通常来说游戏中的人物会有各种上身动作如瞄准、射击、换子弹等,而下身则对应站立,行走(通常还是四个方向的行走动作)。这时候如果只能播放一个动作的话就需要美工制作大量的动作(站立瞄准、站立射击、跑步瞄准、跑步射击等等),其工作量可想而知。显然,最为效率的方式是美工分别做出上半身以及下半身的动作,然后由程序根据游戏角色的操作将两者动作混合起来同时播放。而这就涉及到了多动画同时播放的需求。此时简单的CrossFade()方法已经不能满足了,我们需要通过AnimationState来对动画播放进行自定义的控制。
1.2.2.2 使用AnimationState控制动画播放
Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的操作进行了封装。其中主要相关的参数有四个:
1) layer: 该动画片段(AnimationClip)所在的播放层次。
2) weight: 该动画片段在动画混合中所占的权重(0~1)
3) enable: 该动画片段是否进行播放
4) blendMode: 混合方式,有两种Blend和Additive
默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。
1.2.3 局部动画
要在同一个角色上同时播放两个不同的动作使用局部动画即可。1.2.3.1 生成局部动画
在Unity3D中有两种方式实现局部动画,一是使用AnimationState的AddMixingTransform方法,该方法传入一个骨骼节点的Transform,调用后该动画片段AnimationClip便只会影响该节点及其子骨骼,而对其他骨骼关节并不再影响。另一种方法是在动画模型制作时就只对局部的骨骼制作动画,其他骨骼在整个动画片段中都保持不变,这样生成的动画片段AnimationClip中就不会包括对那些不变骨骼的关键帧信息,也就不会对其他骨骼关节进行影响。
1.2.3.4 局部动画的混合
局部动画的混合策略与前述Unity3D动画播放策略相同,只不过只是影响局部骨骼。这也就是说,上半身与下半身的动画无论谁所在的层更高,权重多少都不会影响另外半身的动画播放。但是上层的半身动画会覆盖下层的全身动画或与之混合,而全身动画中不包含在半身动画中的骨骼则完全不受影响。2. Unity3D新的动画系统Mecanim
Mecanim把游戏中的角色设计提高到了一个新的层次,使用Mecanim可以通过Retargeting(重定向)来提高角色动画的重用性。在处理人类角色动画时,用户可以使用动画状态机来处理动画之间的过渡及动画之间的逻辑。
2.1 基本概念
2.1.1 Animation Clip(动画片断)
动画片断包含了动画角色的动画数据,可以是一个简单的动画,如跑、走、静止等,它的类型属于子资源类型。
2.1.2 Avatar (阿凡达)
创建动画的一个基本步骤就是建立一个从Mecanim系统的简化人形骨架结构到用户实际提供的骨架结构的映射,这种映射关系称为Avatar。
2.1.3 Retargeting(重定向)
Retargeting是一种操作,它可把Mecanim所识别的骨骼结构及包含的动画应用到其它的骨骼中。
2.1.4 Rig(骨骼绑定)
主要是在外部软件中根据角色的模型来设定。
2.2 模型文件资源的制作和导出
创建人体模型(humanoid character)的过程包括以下三步:
1)建模(制作蒙皮网格)
建模过程中注意以下几点:
(1)注意建模软件和unity的缩放比,可以将模型导入unity后和一个标准cube(1m)进行大小对照
(2)尽量将角色的根节点放置在脚下
(3)导出模型的时候,检查并删除一些隐藏的点和面
2)搭建骨骼
对于人体模型(humanoid character),至少保证有15根骨骼
3)蒙皮(将网格、骨骼进行绑定)
在软绑定的时候,每个顶点最多受4根骨骼影响,因为这是Unity支持的上限。
2.3 动作文件的导入方式
1)模型中自带动作,即将模型和动作一起导出成为一个fbx文件,这种情况下,如果自带了多个动作,可以在unity中对animation进行分割命名;2)将模型和动作分开导出,并放在同一目录下,遵循“模型名@动作名”的命名规则;
3)制作Mecanim动画
第1步:
动画素材(Animation clips)从外部导入或在Unity中创建。
第2步:
把Animation clips按要求放在Animator Controller的状态中,Animator Controller一个动画窗口中显示其完整视图。在此视图中,状态作为一个节点,且由线连起来。Animator Controller作为Project Window中的一个资产。
2.4 使用人形角色动画
Mecanim动画系统特别适合人形角色动画的制作。人形骨架是在游戏中普遍采用的一种骨架结构,Unity为其提供了一个特别的工作流和一整套扩展的工具集。由于人形骨骼结构的相似性,用户可以实现将动画效果从一个人形骨架映射到另外一个人形骨架上去,从而实现动画重定向功能。除极少数情况之外,人形模型均具有相同的基本结构,即头部、躯干、四肢等。Mecanim正是充分利用了这一特点来简化了骨骼绑定和动画控制过程。2.4.1 创建Avatar
2.4.2 配置Avatar
可选匹配骨骼的运动会根据必须匹配骨骼的状态来自动插值计算。为了方便Mecanim进行骨骼匹配,用户提供的骨架中应包含所有必须匹配的骨骼。为了提高匹配的几率,应尽量通过骨骼代表的部位给骨骼命名(如:左手命名为LeftArm)。
2.4.3 设置Muscle参数
Mecanim使用肌肉(Muscle)来限制不同骨骼的运动范围。一旦Avatar配置完成,Mecanim就能解析其骨骼结构,进而用户可以在Avatar面板的Muscles选项卡中调节相关参数。在此可以调整角色的运动范围,以确保骨骼运动起来真实、自然。2.4.4 Avatar身体遮罩(Body Mask)
Unity可以通过身体遮罩来选择性地控制身体的某一部分是否受动画的影响,用户可以在Model Import Inspector的Animation选项卡中,选中一个Clip,然后下面的Mask->Humanoid,在此Humanoid选择哪些部分不受动画影响(红色部分不受身体影响)。这样就可以控制动画的局部更新,从而满足一些特殊需求。2.4.5 人形动画的重定向
2.4.6 逆向(IK:Inverse Kinematics)运动学功能(Pro Only)
但是,在实际应用中,上述过程的逆过程却非常实用,即给定末端节点的位置,从而逆向推出节点链上所有其他节点的合理位置。这种方法被称为逆向运动学(IK),在Mecanim系统中,任何正确设置了Avatar的人形角色都支持IK功能。
为了给角色模型设置IK,需要知道可能与之进行交互的周边物体,进而设置IK脚本,常用的Animator函数包括:
1) SetIKPosition:设置IK目标位置
2) SetIKPositionWeight:设置平移权重(0 = at the original animation before IK, 1 = at the goal).
3) SetIKRotation:设置IK目标的旋转
4) SetIKRotationWeight:设置IK目标旋转权重(0 = rotation before IK, 1 = rotation at the IK goal).
5) SetLookAtPosition:设置查看位置
6) SetLookAtWeight:设置查看权重
7) bodyPosition:身体中心位置
8) bodyRotation:身体中心旋转
2.5 非人形角色动画
一般动画的启用方法:
1) 在Project视图中选中FBX资源
2) 在Inspector视图中选择Rig标签页
3) 设置Animation Type为Generic
2.6 Animator组件
Animator组件:引用了一个Animator Controller,它被用于为角色设置行为,这里所说的行为包括状态机(StateMachines)、混合树(Blend Trees)以及通过脚本控制的事件(Events),具体包括:
1) Controller:关联到该角色的animator控制器
2) Avatar:该角色的Avatar
3) Apply Root Motion:是使用动画本身还是使用脚本来控制角色的位置
4) Animate Physics: 动画是否与物理交互
5) Culling Mode: 动画的裁剪模式
- Always animate: 总是启用动画,不进行裁剪
- Based on Renderers: 当看不见角色时只有根节点运动,身体的其它部分保持静止
2.7 动画状态机
1) Mecanim状态机
Mecanim的动画状态机提供了一种纵览角色所有动画片断的方法,并且允许通过游戏中的各种事件(如用户输入)来触发不同的动画效果。动画状态机可以通过Animator Controller视图来创建。一般而言,动画状态机包括:
(1) 动画状态 (Animation State)
(2) 动画过渡 (Animation Transition)
(3) 动画事件
(4) 子状态机(复杂的状态机可包含简单的子状态机)
参考:http://blog.csdn.net/sparrowfc/article/details/8240165
http://docs.unity3d.com/Manual/AnimationOverview.html
http://www.narkii.com/club/thread-305414-1.html
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow