Skip to main content

混合树(Blend Trees)

混合树(Blend Trees)是一种将多个动画片段以不同权重组合在一起的方式,基于输入参数。混合树可以有多个子节点,这些子节点可以是动画片段,也可以是其他混合树,它们将根据混合树类型和输入参数以不同方式组合在一起。

要创建混合树(Blend Trees),在动画控制器层视图中右键点击,选择 Create State → From new Blend Tree,并将其分配给新创建的动画状态。

注意:混合树参数必须是浮点型控制器参数,但它们可以与VRChat的布尔/整型表达式参数一起使用。

有关更多详细信息,请参阅表达式参数不匹配页面。

要编辑混合树(Blend Trees),双击 Blend Trees Animator State(混合树的动画状态)以访问 混合树(Blend Trees)编辑器。在这里,您可以修改 混合树(Blend Trees)及其子节点。要返回到层视图,请点击窗口顶部的面包屑菜单。

在混合树编辑器中,基于节点的可视化布局显示了整个混合树结构,包括子节点及其顺序。您可以查看和编辑混合树及其子节点使用的所有参数。

image.png

一个以混合树为运动的动画状态。

编辑混合树(Blend Trees)

混合树(Blend Trees)由一系列 Motions运动)组成,这些运动可以是动画片段或其他混合树,它们混合在一起。

默认情况下,Motions运动)列表为空,但您可以通过点击底部的 + 图标添加新字段。这将打开一个下拉菜单,您可以选择添加运动字段来添加动画片段,或选择新建混合树来创建一个新的子混合树。

通过高亮选中一个子节点并点击 Motions(运动)列表底部的 - 按钮,可以删除子节点。

在混合树检查器的顶部,有0、1或2个参数,您可以从动画控制器中选择或自行填写——仅限于浮点型参数。

对于每个子节点,如果它是动画片段,可以设置动画片段的速度。请注意,动画片段的实际长度现在计算为:

image.png

动画片段的实际长度计算为所有动画片段的常规长度相加,除以单个片段的速度。

image.png

一个默认(空)的混合树。

Motions(运动)的 Thresholds(阈值)默认是均匀分布的。取消勾选 Automate Thresholds自动阈值)以手动编辑它们。请注意,此列表会自动重新排序。禁用此复选框后,您可以基于速度或角速度等值自动计算阈值,尽管这些在实践中很少使用。

混合树类型

Unity中的混合树提供五种类型,每种类型都有其独特的动画片段或其他混合树的混合方法:

1D

一维(1D)混合树基于单个参数混合运动。混合是线性的,每个运动的权重由参数值在运动阈值之间的位置决定。

例如,如果参数在两个阈值之间的80%位置:

  • 最左侧的运动以权重 (1Fraction) = (1 - 0.8) = 0.2 播放

  • 最右侧的运动以权重 Fraction = 0.8播放

请注意,运动列表上方的可视化编辑器可用于设置参数,或通过点击并拖动红线或子节点的阈值来移动运动。

准确地说:如果您有一个动画在时间a将某物动画化为值A,在时间b将某物动画化为值B,那么在时间f的输出值如下:

QianJianTec1741016455716.png

image.png

一个1D混合树的示例。由于值0.3位于第二个运动的60%位置,动画1将以权重0.4播放,动画2将以权重0.6播放。

2D简单方向

二维简单方向(2D简单方向)混合树基于二维参数空间混合运动,运动围绕中心 (0,0) 形成一个多边形。
每个运动的权重由以下方式确定:

  • 找到参数值所在的两个点。

  • 检查该值是否比连接这两个点的线离 (0,0) 更远。

  • 如果是,则使用到这两个点的距离作为权重(归一化)。

  • 如果不是,则使用到这两个点和原点的距离作为权重(归一化)。

  • 如果在 (0,0) 处有一个运动,它将获得第三个权重;否则,此权重将分配给其他运动。
    这对于角色控制器或瞄准控制器有益,但不适用于基于距离的直接动画混合。

image.png

一个2D简单方向混合树的示例。您可以看到,由于2D空间中的点与动画1和动画2等距,它们都获得相同的权重,其余权重平均分配给其他子节点,即子混合树和动画3。

2D自由形式方向 / 2D自由形式笛卡尔

二维自由形式方向(2D自由形式方向)/ 二维自由形式笛卡尔(2D自由形式笛卡尔)的内部工作原理基于以下论文的第6.3和6.3.1章:https://runevision.com/thesis/rune_skovbo_johansen_thesis.pdf。

2D简单方向、2D自由形式方向和2D自由形式笛卡尔之间的主要区别是:

  • 2D简单方向:适合每个方向使用一个运动。

  • 2D自由形式方向:需要在**(0,0)**处有一个运动,适合每个方向需要多个运动的情况。基于方向工作,类似于1D自由形式方向。

  • 2D自由形式笛卡尔:类似于直接的“距离分割 = 权重分割”函数,提供更直接的运动混合方法。

Direct Blend Trees(直接混合树)

直接混合树通过为每个动画片段或混合树分配专用参数,提供了对它们的广泛控制。每个动画的播放权重由其对应参数的值决定。值得注意的是,直接混合树提供了同时播放多个动画的独特能力,因为总权重不受限于1。

这种灵活性对于优化VRChat切换非常有利,可以实现更高效的动画分层。然而,需要注意的是,以小于1的权重播放动画将在默认值和动画值之间进行混合。通常,建议以权重1播放1D混合树,而不是直接播放动画。这避免了对默认值的依赖,并提供了更可控的动画混合过程。有关更多信息,请参阅使用直接混合树组合层

启用 Normalize Blend Values归一化混合值)选项后,动画的输出权重将被归一化。这意味着所有权重将除以总权重和,确保总权重保持为1。

示例:

  • 动画1以权重2播放。

  • 动画2以权重3播放。

  • 启用归一化混合值后,动画1的权重为0.4,动画2的权重为0.6(由总权重2 + 3 = 5归一化)。

注意:关闭写入默认值的直接混合树行为非常不同,通常不应使用。更多信息可以在写入默认值页面找到。

image.png

非常技术性的说明:直接混合树中的片段时间持续时间的工作方式与预期略有不同。当您有多个片段,每个片段都有自己的速度时,每个片段的新长度是其自身长度加上其他片段的长度除以它们的速度,再除以原始片段的速度。因此:

image.png

示例,您有一个长度为1、速度为2的片段,以及另一个长度为5、速度为4的片段,直接混合树中的长度为:

image.png