动画状态机 Blend Trees

Blend Tree

游戏中,可能需要混合多个动画来实现一些效果。比如,通过角色的移动速度,来混合走和跑。再比如跑的过程中,转弯时,需要向左或向右倾斜。

可以用blend tree来实现该效果。bend tree用来平滑地混合多个同时播放的动画,根据参数确定混合比例。

当用来混合类似走跑时,需要确保2个动画,在归一化时间上,脚接触地面的时间必须要一致。比如在时间0时都是左脚,0.5时,都是右脚。

在Animator Controller编辑窗口中,右键,Create State->From New Blend Tree,来创建Blend tree,然后双击该State,进入Blend tree编辑状态。

点击Inspector的 + 号,添加一个动画

也可以右键点击blend tree 节点,Add Motion

当为blend tree添加好动画,以及控制它们的参数后,Inspector窗口可以显示这些参数如何控制动画混合。

选中一个动画节点,则Inspector会显示动画导入设置,但是是只读的

选择Blend tree 节点,则显示混合控制参数

还可以选择1D或2D混合模式

1D Blending

1D Blending 使用一个参数来混合子动作。

首先要选择一个控制混合的参数(Animator Controller)中定义的float参数。例如,我们可以定义移动方向为-1到1,0表示直线前行,不需要倾斜。

然后点击Motion旁边的 “+” 号来添加动作,像下面这样:

上图展示了参数从最小到最大值,对子动作的影响,每个动作显示为蓝色三角区域。在区域上点击并按住鼠标左键,Motion列表中的对应动画将会高亮显示。区域的尖峰表示在对应的参数值时,动作完全影响混合,即混合因子为1,其它动作的混合因子为0。该峰值也叫做动作 Threshold 阈值。

红色的垂直条表示当前参数值。如果点击Inspector下方的play(播放)按钮,并拖动该条,则能看到参数时控制这些动作混合的效果。

Parameter Range

上图下部的Range of parameter展示了用来控制混合的最小(左)和最大(右)值。可以在图中1st motion和3st motion 中按住鼠标左键,拖动来改变这2个值。但是第一个和最后一个定义了参数范围。

Threshold 阈值

每个区域都可以通过拖动来定义动作最大影响对应的峰值,当Automate Threshold 未被选中时,也可以在Motion List 的 Threshold手动填写这些值,但要注意,第一个是最小值,最后一个最大值,如果将中间的改为最大或最小,动画列表会自动调整顺序,保证最大最小值的有效性。

Threshold 后面的时钟表示改动作播放的速度。

Automate Thresholds 自动分配阈值

动作列表下面是 Automate Thresholds 复选框,启用它,会自动在动作之间平均分配 Threshold,例如参数范围是-90到90,有5个动作,则每个动作的阈值为-90,-45,0,45,90。

Compute Thresholds 计算阈值(根据Root Motion数据)

当不选择 Automate Thresholds 时,还可以选择 Compute Thresholds列表的里的数据来源参数,来从Animation Clip的Root Motion数据中获取阈值。可以选择 Speed, velocity x,y,z,angular speed(角度或弧度)。如果你的参数时根据root motion中的以上属性来确定的话,可以使用Compute Threshold下拉列表中的选项来计算阈值。

属性功能
SpeedRoot Motion 的移动速度
Velocity XRoot Motion 的速度向量的x值
Velocity YRoot Motion 的速度向量的y值
Velocity ZRoot Motion 的速度向量的z值
Angular Speed (Rad)Root Motion 的旋转速度(弧度表示)
Angular Speed (Deg)Root Motion 的旋转速度(角度表示)

比如说,你有一个走的动画,速度为 1.5units/sec,小跑动画速度为 2.3units/sec,跑动画速度为 4units/sec,则可以选择Speed,来从root motion计算阈值。当设置speed 为3时,会播放小跑和跑之间的动画,稍微偏向小跑。

2D Blending

2D Blending 类型,使用2个参数来控制动画混合。这两个参数可以构成一个2D坐标系,当设置不同参数时,得到一个该坐标系下的方向向量。如Position(0,0)表示中心点,可能代表某个动作。Threshold的值,会将该坐标系划分成多个象限(区别于x,y的4象限),动作会在相邻象限之间进行插值计算动作混合因子。注意象限的分界线(Threshold)是一个动作的完全影响因子(weight=1)。

不同的 2D Blend Types 适用于不同情况,它们的不同主要时计算动画混合因子的方式不同。

  • 2D Simple Directional:适用于动画表示不同的方向:向前后左右走,上下左右瞄准,还可以包含一个Position(0,0)表示的动作,比如站立,向前瞄准。使用该类型时,不要在一个方向(2D blending方向)上有多个动作,比如向前走和向前跑。
  • 2D Freedom Directional:同 2D Simple Directional一样适用于不同方向的动作控制,同时允许一个方向上设置多个动作,比如向前走,向前跑。但是该类型要求必须有Position(0,0)的动作,比如站立。
  • 2D Freedom Cartesian:适用于要实现的不是不同方向的控制(区别于Directional),该模式下,参数x,y可以表示不同的概念。比如角速度(angular speed)和线性速度(linear speed)。例如,直线走,直线跑,右转走,右转跑。
  • Direct:用来根据权重直接混合多个动画,通常用来实现表情动画。

选择好类型后,设置2个参数。我们的例子使用velocityX(左右横移速度),velocityZ(前后移动速度),来实现前后移动和左右横移的射击。

然后添加我们的动画,如下图:

图中的Position表示2个参数的值,X轴表示第一个参数,Y轴表示第二个参数。所以向前走的动画,velocityX=0,velocityZ=1.5,对应的阈值为Position(0,1.5)。

2D 混合图

Inspector上部的图,显示了子动画在2D空间中的“位置”。其中,蓝色的点是动画。没有配置动画,或者混合因子是0的动作,显示为灰色。可以在图中点击蓝点来选择动作。选中后,对该动作有影响的位置将会绘制成蓝色,颜色越深,该动作混合因子越大,蓝点处为1,其它的为0。距离越远,混合因子越小,其它动作的混合因子越大。

红色的点是当前参数的“位置”。如果在Inspector面板下方的预览区域点击Play,并在图中拖动红点的位置,可以看到不同参数位置的混合效果。在图中还可以看到每个动作的混合因子,被绘制成围绕动作的点的圆圈。当把红点拖到蓝点上方是,该圆圈的半径会达到最大,而其它动作的圆圈就没有了。在动作之间的位置,会有多个动作参与混合。如果你选中一个动作的点,查看它的混合因子值域图(蓝色区域),你会发现,红点在约深颜色的位置,动作的圆圈半径越大。

当没有动作点被选中时,混合图会混合所有动作的值域图,并且单个动作混合因子越大,颜色越深,影响的动作越多,颜色越浅。

Positions

可以直接拖动蓝色的动作点来改变位置,也可以在下面的动作列表中填写PosX和PosY的值来改变。

可以选择 Compute Position 下拉列表中的项,来指定从动画文件中获取参数及其范围。

可以同时指定2个参数映射

属性功能
VelocityXZPosX=velocityX PosY=velocityZ
Speed and Angular SpeedPosX=AngularSpeedMoveSpeed PosY=MoveSpeed

可以选择PositionX from 和 PositionY from 来选择单独映射参数。这些参数同1D

例如,你的参数对应侧移速度和前移速度,同时有一个站立动画,速度为(0,0,0),行走动画速度(0,0,1.5),侧移动画左右速度分别为(-1.5,0,0),(1.5,0,0)。选择VelocityXZ作为Compute Position的选项,则动画播放就会根据分别各自的速度混合。

Direct Bending

使用 Direct Bending 来直接根据每个动作的权重来混合动画。当需要分别精确的控制每个动作的混合比例时,使用改方法。

添加动作后,需要为每个动作设置其控制参数,来进行控制。

比较常用的是用来实现面部表情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值