Unity5.x Animator之BlendTree

混合树 (Blend Tree)

游戏动画中的一个常见任务是在两个或更多相似运动之间混合。最佳的已知示例可能是根据角色速度混合行走和奔跑动画。另一个示例是角色在奔跑过程中转弯时向左或向右倾斜。

重要的是区分转换 (Transition) 与混合树 (Blend Tree)。虽然两者都用于创建平滑动画,但是它们用于不同类型的情况。

  • 转换 (Transition) 用于在给定时间量内从一个动画状态 (Animation State) 平滑转换为另一个状态。转换指定为动画状态机 (Animation State Machine) 的一部分。如果转换迅速,则通常可从一个运动很好地转换为完全不同的运动。
  • 混合树 (Blend Tree) 用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画。各个运动参与形成最终效果的量使用混合参数进行控制,该参数只是与动画器控制器 (Animator Controller) 关联的数值动画参数之一。要使混合运动有意义,混合的运动必须具有相似性质和时间。混合树 (Blend Tree) 是动画器控制器 (Animator Controller) 中的特殊状态类型。

相似运动示例可以是各种行走和奔跑动画。要使混合工作良好,片段中的移动必须在相同的规范化时间点发生。例如,行走和奔跑动画可以对齐,以便脚与地面接触的时刻在相同的规范化时间点发生(例如,左脚在 0.0 踏地,而右脚在 0.5 踏地)。因为使用规范化时间,所以片段是否具有不同长度无关紧要。

要开始使用新混合树 (Blend Tree),需要:

  1. 右键单击动动画器控制器窗口 (Animator Controller Window)上的空白空间
  2. 从出现的上下文菜单中选择 创建状态 (Create State) > 从新混合树 (From New Blend Tree)
  3. 双击混合树 (Blend Tree) 以进入混合树图 (Blend Tree Graph)。

动画器控制器窗口 (Animator Controller Window) 现在显示整个混合树 (Blend Tree) 的图形,而检视器 (Inspector) 显示当前选择的节点及其直接子级。


动画器窗口 (Animator Window) 显示整个 混合树 (Blend Tree) 的图形。左侧是仅包含根混合节点 (Blend Node) 的混合树 (Blend Tree)。右侧是包含根混合节点 (Blend Node) 以及以三个动画片段 (Animation Clip) 作为子节点的混合树 (Blend Tree)。

这会为参数值变化时的动画组合方式提供 图形可视化(在拖动滑块时,源自树根的箭头会改变其底纹以显示主要动画片段)。

可以在混合树 (Blend Tree) 图中选择任何节点以在检视器 (Inspector) 中检视它。如果所选节点是动画片段 (Animation Clip),则会显示该动画片段 (Animation Clip) 的检视器 (Inspector)。如果动画是从模型导入,则设置是只读的。如果节点是混合节点 (Blend Node),则会显示混合节点 (Blend Node) 的检视器 (Inspector)。



任何运动之前在 检视器 (Inspector) 中显示的混合节点 (Blend Node) 已添加。

混合类型”(Blend Type) 下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。

一维混合 (1D Blending)

混合节点 (Blend Node) 的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。一维混合 (1D Blending) 根据单个参数混合子运动。

设置混合类型 (Blend Type) 之后,需要执行的第一个操作是选择将控制此混合树 (Blend Tree) 的动画参数 (Animation Parameter)。在此示例中,该参数为方向 (direction),它在 -1.0(左)与 +1.0(右), 其中 0.0 表示笔直运行而不倾斜。

随后可以通过单击 + ->添加运动域 (Add Motion Field) 将动画片段 (Animation Clip) 添加到混合树中,从而添加各个动画。完成后,它应类似于下面这样:


具有三个动画片段 (Animation Clip) 的一维混合 (1D Blend Node)。

顶部的示意图显示随着参数在其最小值与最大值之间变化,各个子运动的影响力。各个运动显示为蓝色小棱锥型(第一个和最后一个仅显示一半),如果单击其中一个并按住鼠标左键,则对应运动会在下面的运动列表中突出显示。各个棱锥型的顶点定义运动具有完全影响力时的参数值,这表示其动画权重为 1,而其他动画的权重为 0。这也称为运动的阈值 (Threshold)


混合节点检视器 (Blend Node Inspector) 顶部的示意图形象地展示各个子运动在参数值范围内的权重。

红色垂直条指示参数 (Parameter) 的值。如果在检视器 (Inspector) 底部的预览 (Preview) 中按播放 (Play) 并在示意图中左右拖动红色条,则可以看到参数的值如何控制不同运动的混合。

参数范围

混合节点 (Blend Node) 使用的参数的范围在示意图下方显示为左侧和右侧的两个数字。可以通过单击数字并使用鼠标向左或向右拖动来更改其中任一数字。请注意,这两个值对应于运动列表中第一个和最后一个运动的阈值。

阈值

可以通过单击运动在示意图中的对应蓝色棱锥型并向左或向右拖动,来更改其阈值。如果"自动化阀值 (Automate Thresholds)" 开关未启用,则还可以通过在阀值 (Threshold) 列的数字字段中键入数字来编辑运动列表中运动的阈值。

运动列表下方是自动化阀值 (Automate Thresholds) 复选框。启用该复选框会将运动的阈值在参数范围内平均分布。例如,如果有五个剪辑并且参数范围为 -90 至 +90,则阈值会按顺序设置为 -90、-45、0、+45 和 +90。

计算阀值 (Compute Thresholds) 下拉菜单会通过从动画片段 (Animation Clip) 中的根运动获取的数据选择来设置阈值。可供选择的数据有速度 (speed)、速率 (velocity) x、速率 (velocity) y 或速率 (velocity) z 以及角速度 (angular speed)(以度或弧度为单位)。如果参数 (parameter) 对应于这些属性之一,则可以使用计算阀值 (Compute Threshold) 下拉菜单计算阈值。

属性: 功能:
速度 (Speed) 根据各个运动的速度(速率的量级)设置其阈值。
速率 X (Velocity X) 根据各个运动的速率 (velocity) x 设置其阈值。
速率 Y (Velocity Y) 根据各个运动的速率 (velocity) y 设置其阈值。
速率 Z (Velocity Z) 根据各个运动的速率 (velocity) z 设置其阈值。
角速度(弧度)(Angular Speed (Rad)) 根据各个运动的角速度(以弧度/秒为单位)设置其阈值。
角速度(度)(Angular Speed (Deg)) 根据各个运动的角速度(以度/秒为单位)设置其阈值。

也就是说,例如您的行走动画每秒行进 1.5 个单位,慢跑动画每秒行进 2.3 个单位,而奔跑动画每秒行进 4 个单位,那么从下拉菜单中选择速度 (Speed) 选项会根据这些值设置三个动画的参数范围和阈值。 因此,如果将速度参数设置为 3.0,则它会混合慢跑和奔跑动画,略偏向于慢跑。

二维混合 (2D Blending)

混合节点 (Blend Node)检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。二维混合 (2D Blending) 类型根据两个参数混合子运动。

不同二维混合 (2D Blend) 类型具有不同的适合用途。它们之间的差异在于计算各个运动影响力的方式。

二维简单方向 (2D Simple Directional)
最适用于运动表示不同方向时,如“向前行走”、“向后行走”、“向左行走”和“向右行走”或是“向上瞄准”、“向下瞄准”、“向左瞄准”和“向右瞄准”。可以选择包括位置 (0, 0) 处的单个运动,如“空闲”或“笔直瞄准”。在简单方向 (Simple Directional) 类型中,相同方向上不应存在多个运动,如“向前行走”和“向前奔跑”。
二维任意方向 (2D Freeform Directional)
此混合类型也在运动表示不同方向时使用,但是可以在相同方向上具有多个运动,例如“向前行走”和“向前奔跑”。在任意方向 (Freeform Directional) 类型中,运动集应始终包括位置 (0, 0) 处的单个运动,如“空闲”。
二维任意笛卡尔 (2D Freeform Cartesian)
最适用于运动不表示不同方向时。使用任意笛卡尔 (Freeform Cartesian) 时,X 参数和 Y 参数可以表示不同概念,如角速度和线速度。示例包括“向前行走而不转弯”、“向前奔跑而不转弯”、“向前行走并右转”、“向前奔跑并右转”等运动。

设置“混合类型” (Blend Type) 之后,需要执行的第一个操作是选择将控制此混合树 (Blend Tree) 的动画参数 (Animation Parameter) 。在此示例中,参数为 velocityX (扫射) 和 velocityZ (向前速度)。

随后可以通过单击 + -> 添加运动区域 (Add Motion Field) 将动画片段 (Animation Clip) 添加到混合树中,从而添加各个动画。完成后,它应类似于下面这样:


具有五个动画片段 (Animation Clip) 的二维混合节点 (2D Blend Node)。

二维混合中的位置类似于一位混合中的阈值,除了存在分别对应于两个参数的两个值,而不是一个值。其沿水平 X 轴上的位置对应于第一个参数,其沿垂直 Y 轴上的位置对应于第二个参数。向前行走动画可能 velocityX 为 0 并且 velocityZ 为 1.5,从而应将这些值键入运动的“位置 X”(Pos X) 和“位置 Y”(Pos Y) 数字字段。

二维混合示意图 (The 2D Blending Diagram)

检视器 (Inspector) 顶部的示意图显示二维混合空间中的子运动位置。这些运动显示为蓝色点。未分配动画片段 (Animation Clip) 或混合树 (Blend Tree) 的运动对混合没有影响力,显示为灰色点。可以通过在示意图中单击其点来选择运动。一旦选择后,该运动对混合空间中每个点的影响力会展示为蓝色区域。该区域在运动位置正下方最明显(其中运动具有完全影响力,这表示其动画权重为 1,而其他动画的权重为 0)。随着距离变远,影响力会下降,同时其他运动的影响力会逐渐占优势。


混合节点检视器 (Blend Node Inspector) 顶部的示意图形象地展示各个子运动在参数值范围内的权重。

红色点指示两个参数的值。如果在检视器 (Inspector) 底部的 预览 (Preview) 中按 播放 (Play) 并在示意图中四处拖动红色点,则可以看到参数值如何控制不同运动的混合。在示意图中,还可以看到各个运动的影响力(表示为围绕各个运动的圆形)。如果将红色点移动到表示运动的蓝色点之一上,则您会看到该运动的圆形会达到其最大半径,而所有其他运动的圆形会缩小为不可见。在介于几个运动之间的位置处,多个附近的运动会对混合具有一定影响力。如果选择其中一个运动以查看该运动的蓝色影响力区域,则可以看到,随着四处移动红色点,运动的圆形大小恰好对应于影响力区域在各个位置处的强度。

未选择任何运动时,示意图显示所有影响力区域的混合,其中单个运动占优势的位置处蓝色较深,许多运动参与混合的位置处蓝色较浅。

位置

可以通过单击运动在示意图中的对应蓝色点并四处拖动,来更改运动的位置。还可以通过在“位置 X”(Pos X) 和“位置 Y”(Pos Y) 列的数字字段中键入数字,在运动列表中编辑运动的位置坐标。

计算位置 (Compute Positions) 下拉菜单会通过从动画片段 (Animation Clip) 中的根运动获取的数据选择来设置位置。可供选择的数据有速度 (speed)、速率 (velocity) x、速率 (velocity) y 或速率 (velocity) z 以及角速度 (angular speed)(以度或弧度为单位)。如果参数 (parameters) 对应于这些属性之一,则可以使用“计算位置”(Compute Positions)下拉菜单计算“位置 X”(Pos X) 和/或“位置 Y”(Pos Y)。

属性: 功能:
速率 XZ (Velocity XZ) 根据各个运动的 velocity.x 设置其“位置 X”(Pos X),并根据其 velocity.z 设置其“位置 Y”(Pos Y)。
速度和角速度 (Speed And Angular Speed) 根据各个运动的角速度(以弧度/秒为单位)设置其“位置 X”(Pos X),并根据其速度设置其“位置 Y”(Pos Y)。

而且可以选择计算位置 (Compute Position) -> X 位置 (X Position From) 和/或 计算位置 (Compute Position) -> Y 位置 (Y Position From) 以便一次仅自动计算其中之一(另一个保持不变),从而进行混合和匹配。

属性: 功能:
速度 (Speed) 根据各个运动的速度(速率的量级)设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
速率 X (Velocity X) 根据各个运动的 velocity.x 设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
速率 Y (Velocity Y) 根据各个运动的 velocity.y 设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
速率 Z (Velocity Z) 根据各个运动的 velocity.z 设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
角速度(弧度)(Angular Speed (Rad)) 根据各个运动的角速度(以弧度/秒为单位)设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
角速度(度) (Angular Speed (Deg)) 根据各个运动的角速度(以度/秒为单位)设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。

也就是说,例如您的参数对应于侧向速率和向前速率,并且有一个平均速率为 (0, 0, 0) 的空闲动画、一个平均速率为 (0, 0, 1.5) 的行走动画以及两个速率分别为 (-1.5, 0, 0) 和 (1.5, 0, 0) 的扫射动画。从下拉菜单中选择速率 XZ (Velocity XZ) 选项会根据这些速率的 X 和 Z 坐标设置运动的位置。

其他混合树 (Blend Tree) 选项

以下选项对一维和二维混合通用。

时间尺度 (Time Scale)

可以使用动画速度数字字段(顶部具有时钟图标的列)改变动画片段 (Animation Clip) 的“自然”速度,从而可以通过使用值 2.0 作为速度,使行走速度是以前的两倍。调整时间尺度 (Adjust Time Scale) > 均匀速度 (Homogeneous Speed) 按钮可重新调整片段的速度,以便它们符合参数的最小值和最大值,但是保持最初具有的相同相对速度。

请注意,仅当所有运动都是动画片段 (Animation Clip) 而不是子混合树 (Blend Tree) 时,调整时间尺度 (Adjust Time Scale) 下拉菜单才可用。

镜像 (Mirroring)

可以通过启用最右侧的镜像开关来镜像运动列表中的任何类人动画片段 (Animation Clip)。此功能使您可以采用原始形式和镜像版本使用相同动画,而无需两次使用内存和空间。


©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值