AnimDynamics

介绍如何将Anim Dynamics AnimBP节点用作轻量级物理模拟解决方案,你可以通过该解决方案将基于物理的辅助动画应用于角色。

Choose your operating system:

Windows

macOS

Linux

AnimDynamics动画蓝图节点是一种轻量级的物理模拟解决方案。它能让角色的部分骨骼网格体实现基于物理的附属动画。相比功能更丰富的RigidBody节点,Anim Dynamics节点是一种更加轻量级的物理模拟解决方案。

anim dynamics骨骼控制动画蓝图节点

借助AnimDynamics节点,你可以将物理模拟效果用于角色的项链、手镯、背包、导线、毛发、布料或任何与角色一起运动的物品。

要将Anim Dynamics物理模拟运动施加在角色的骨骼网格体上,你必须首先在Anim Dynamics节点的细节面板中的 边界骨骼(Bound Bone) 属性中定义将构成动态结构的骨骼。之后,你可以设置将施加在角色动画上的行为和约束。

在这个例子中,Anim Dynamics节点用于动态控制角色的天线运动,使其动态响应角色头部动画。

BotDemoOff.gif

BotDemoOn.gif

Anim Dynamics已禁用

Anim Dynamics已启用

概述

AnimDynamics节点是一种在AnimGraph中运行的低开销解算器。为了实现低开销,AnimDynamics节点采用了一些值得留意的近似解算方法:

  • 使用盒体而非定义的动态骨骼来计算各节的惯性。

  • 不计算碰撞。相反,使用约束来限制移动。

AnimDynamics节点支持线性约束、角约束和平面约束,以便模拟基于物理的的运动。线性(Linear)角(Angular) 约束可以受弹簧的驱动,提供更有弹性的感觉,而 平面(Planar) 约束可用于创建对象不会穿过的平面。你可以切换各个约束,并在Anim Dynamics节点的细节面板调整它们的相关属性。

anim dynamics骨骼控制动画蓝图节点约束设置

单体模拟

借助Anim Dynamics节点,你可以将物理模拟运动施加在角色身上的带骨骼对象上。下图是一个会随着角色运动而摆动的鼓。

DrumDemoOff.gif

DrumDemoOnClean.gif

Anim Dynamics已禁用

Anim Dynamics已启用

将鼓的骨骼设置为 边界骨骼(Bound Bone) 后,你可以使用 盒体约束(Box Constraints) 属性定义其边界。局部关节偏移(Local Joint Offset) 是一个偏移量,用于附加约束,并定义枢轴点。如果设为0,你可能看不到任何移动,因为它不知道从哪里旋转。调整此值,直到实现你所需的移动。

此处设置了 边界盒体(Bounding Box)局部关节偏移(Local Joint Offset) 属性,以便包含整个鼓对象。

DrumDemoONDraw.gif

此外还设置了 旋转约束(Rotation Constraints) ,以便鼓可以从静止位置以有限幅度弹动(用绿色角覆层表示),实现更逼真的运动。

ConstraintEx.png

有关使用Anim Dynamics节点创建动态动画的更多信息,请参阅创建动态动画指南。

外部力量

你还可以在模拟主体上施加 外部力(External Forces)。默认情况下,你可以使用AnimGraph中的引脚来施加 外部力(External Force) 向量。

ExternalForces.png

有关通过Anim Dynamics节点使用 外部力 创建动态动画的更多信息,请参阅创建动态动画指南。

链条

Anim Dynamics节点的一种用途是模拟链条的运动。

ChainDemo.gif

相比于单体动态骨骼,链条模拟的开销高得多,因为链接约束现在需要解算,并且需要更多迭代才能正确收敛。迭代计数也可以按节点配置。

通过启用 链(Chain) 属性,并选择 边界骨骼(Bound Bone)链端(Chain End) ,Anim Dynamics将使用两者之间的骨骼生成链。除了 边界骨骼(Bound Bone) 之外,链中的每块骨骼都将在其上方生成一个约束盒体,以模拟与链中其他骨骼的运动和碰撞。这些约束盒体需要手动调整才能实现不错的效果。

ChainSettings.png

重叠约束可能导致效果不理想,如骨骼乱舞和运动行为不受控。如果你遇到这类情况,请确保链约束未重叠。

碰撞模拟

你可以使用 平面(Planer)球体(Spherical) 限制来利用模拟结构启用简单的碰撞模拟。

平面限制

借助平面限制,你可以设置将限制结构移动的平面,确定对象无法跨越的边界,如骨骼网格体的其他部分或地面。

Planer.png

在Anm Dynamic细节面板中,你可以通过 使用平面限制(Use Planer Limits) 属性启用平面限制,然后使用 添加(+)(Add (+)) 索引创建平限制。借助每个索引,你可以将 驱动骨骼(Driving Bone) 设置为平面限制位置的参考点。然后,你可以使用 平面变换(Plane Transform) 属性设置平面限制的 位置(Location)旋转(Rotation)缩放(Scale) 属性,确定Anim Dynamics结构无法跨越的平面边界。

例如,将平面限制添加到角色的 根骨骼 ,可以创建对象无法跨越的地面边界,以防结构看起来穿过了游戏世界的地面。

PlanerSettings.png

球体限制

借助球体限制,你可以设置球体来包围模拟结构上的点,充当简单的碰撞预防,实现更动态的互动。

Sphere.png

在Anim Dynamics细节面板中,启用 使用球体限制(Use Spherical Limits) 属性后,你可以添加索引,创建新的球体限制。对于每个索引,你可以设置 驱动骨骼(Driving Bone) 充当球体位置的参考点,并通过 球体局部偏移(Sphere Local Offset) 属性偏移它在 XYZ 轴上的位置。你还可以设置球体 限制半径(Limit Radius) ,确定球体大小,设置限制类型,并确定球体如何与骨骼网格体交互。

SphereSettings.png

将球体上的 限制类型(Limit Type) 设置为 外部(Outer) ,你可以使用球体限制,通过不允许物体穿过球体,防止结构碰撞。你还可以使用球体限制,通过将 限制类型(Limit Type) 设置为 内部(Inner) 来控制结构。

属性参考

Details.png

此处你可以参考Anim Dynamics属性及其作用的列表。

属性

说明

实时预览(Preview Live)

启用后,将在视口中的网格体上绘制实时物理对象的预览。

显示线性限制(Show Linear Limits)

启用后,将在视口中的网格体上绘制 线性限制(Linear Limits) (棱柱形)预览。

显示角限制(Show Angular Limits)

启用后,将在视口中的网格体上绘制 角限制(Angular Limit) 范围的预览。

显示平面限制(Show Planer Limit)

启用后,将在视口中的网格体上绘制 平面限制(Planer Limit) 信息(实际平面、平面法线)的预览。

显示球体限制(Show Spherical Limit)

启用后,将在视口中的网格体上绘制 球体限制(Spherical Limits) 的预览。

显示碰撞球体(Show Collision Spheres)

如果启用了 平面限制(Planer Limits) 并且 碰撞模式(Collision Mode) 设置为 自定义球体(Custom Sphere)内部球体(Inner Sphere)外部球体(Outer Sphere) ,将在视口中的网格体上绘制代表碰撞球体的预览球体。

重设模拟(Reset Simulation)

重置此节点的模拟。

模拟空间

用于运行模拟的空间。可用选项如下所示:

  • 组件(Component) :模拟原点将使用骨骼网格体组件的位置和方向计算。

  • Actor : 模拟原点将使用包含骨骼网格体组件的actor的位置和方向来计算。

  • 世界(World) : 模拟原点将使用世界原点计算。

不建议使用带有传送角色的 世界(World) 模拟模式。

  • 相对根(Root Relative) : 将使用骨架的根骨骼的位置和方向计算模拟原点。

  • 相对骨骼(Bone Relative) : 将使用 相对空间骨骼(Relative Space Bone) 属性中指定骨骼的位置和方向计算模拟原点。

相对空间骨骼(Relative Space Bone)

模拟空间(Simulation Space) 设置为 相对骨骼(Bone Relative) 时,模拟会将角色骨架中选定的骨骼用作原点参考。

链(Chain)

启用后,节点将使用解算器模拟连接链。

边界骨骼(Bound Bone)

从角色骨架选择要附加物理主体的骨骼。如果启用 链(Chain) 属性,所选骨骼将成为定义链的顶部骨骼(首骨骼)。

链端(Chain End)

启用 链(Chain) 属性后,从角色骨架选择的骨骼将成为定义链的底部或端。禁用 链(Chain) 属性时,忽略此属性。

盒体范围(Box Extents)

设置盒体在 XYZ 上的范围,用于物理模拟。模拟空间(Simulation Space) 上下文中的坐标,与 局部关节偏移(Local Joint Offset) 位置相关。

局部关节偏移(Local Joint Offset)

设置 盒体范围(Box Extent) 从最近关节到 边界骨骼(Bounding Bone) 的位置偏移。

角弹性约束

设置在启用 角弹性(Angular Spring) 属性时使用的弹性常量。值越高,弹性越强。

要查看效果,必须已定义 角目标轴(Angular Target Axis)角目标(Angular Target) 属性。

使用重力覆盖(Use Gravity Override)

启用后,将使用 重力覆盖(Gravity Override) 属性值代替 重力缩放(Gravity Scale) 进行模拟。

重力覆盖(Gravity Override)

当启用 使用重力覆盖(Use Gravity Override) 时,设置向量值覆盖 重力缩放(Gravity Scale)

模拟空间中的重力覆盖(Gravity Override in Sim Space)

启用后,在模拟空间中定义 重力覆盖(Gravity Override) 。禁用后,在世界空间中定义重力覆盖(Gravity Override)。

重力缩放(Gravity Scale)

设置模拟中重力使用的比例。值为1是完全重力重量,而值大于1会增加重力产生的力。

线性弹性(Linear Spring)

启用后,主体会尝试将 线性弹性约束(Linear Spring Constraint) 属性值用作比例弹回其初始位置。

角弹性(Angular Spring)

启用后,主体会尝试将 角弹性约束(Angular Spring Constraint) 属性值用作比例,将自身与指定的角目标对齐。

线性弹性约束(Linear Spring Constraint)

设置计算线性弹性时要使用的弹性常量。值越高,弹性越强。

更新后数字解算器迭代

设置传递的关于 线性(Linear)角(Angular) 限制的更新数量,可在细节(Details)面板的 约束(Constraint) 属性分段找到。更新后(Post Update) 表示设定的在解算器获取主体位置之后发生的更新传递数。

建议设置值应为设置的 更新前解算器迭代数(Number Solver Iterations Pre Update) 属性的四分之一左右。

进行求值(Do Eval)

启用后,节点将执行骨骼变换求值。你可以禁用此属性,以直观地看到默认动画状态,快速将物理模拟与默认动画状态进行比较。

更新前数字解算迭代

设置传递的关于 线性(Linear)角(Angular) 限制的更新数量,可在细节(Details)面板的 约束(Constraint) 属性分段找到。更新前(Pre Update) 表示设定的在解算器获取主体位置之后发生的更新传递数。

建议设置的值应该是设置的 NumSolverIterationsPostUpdate 属性值的四倍左右。

线性阻尼覆盖

设置要在启用 覆盖线性阻尼(Override Linear Damping) 属性时使用的值。

默认值为0.7。值低于0.7不会产生影响。

角阻尼覆盖

设置要在启用 覆盖角阻尼(Override Linear Damping) 属性时使用的值。

默认值为0.7。值低于0.7不会产生影响。

角偏差覆盖

设置要在启用 覆盖角偏差(Override Linear Bias) 属性时使用的值。

角偏差会减少链力的扭转,并默认为保持链条稳定性的值。模拟时,单体角力可能会在网格体的位置出现延迟。如果遇到此问题,你可以将 角偏差覆盖(Angular Bias Override) 的值向1.0f调整,直到问题解决。

进行更新(Do Update)

启用后,节点将执行物理模拟更新。禁用时将显示基础动画姿势。此属性有助于切换节点的效果。

覆盖线性阻尼(Override Linear Damping)

启用后,线性阻尼覆盖(Linear Damping Override) 值将用于应用线性阻尼。

覆盖角偏差

启用后,角偏差覆盖(Angular Bias Override) 值将用于为该节点中的主体应用角偏差。

角偏差会减少链力的扭转,并默认为保持链条稳定性的值。使用单体系统时,有时角力看起来像在网格体的运动中延迟,如果是这种情况,请启用 覆盖角偏差(Override Angular Bias) ,并将 角偏差覆盖(Angular Bias Override) 值向1.0f调整,直到问题解决。

覆盖角阻尼(Override Angular Damping)

启用后,角阻尼覆盖(Angular Damping Override) 值将用于应用角阻尼。

组件线性加速度缩放(Component Linear Acc Scale)

使用非世界空间模拟时,此属性会控制将多少组件的世界空间加速度传递给局部空间模拟。可在 XYZ 轴上使用向量值。

组件线性速度缩放(Component Linear Vel Scale)

当使用非世界空间模拟时,这将根据组件的世界空间速度对局部空间模拟中的主体施加阻力。可在 XYZ 轴上使用向量值。

组件应用线性加速度限制(Component Applied Linear Acc Clamp)

使用非世界空间模拟时,此为从 组件线性加速度缩放(Component Linear Acc Scale)组件线性速度缩放(Component Linear Vel Scale) 属性派生的对加速度的整体限制。

线性XLimit类型(Linear XLimit Type)

选择 限制(Limit) 可限制线性X轴运动。选择 自由(Free) 可禁用所有限制。

线性YLimit类型(Linear YLimit Type)

选择 限制(Limit) 可限制线性Y轴运动。选择 自由(Free) 可禁用所有限制。

线性ZLimit类型(Linear ZLimit Type)

选择 限制(Limit) 可限制线性Z轴运动。选择 自由(Free) 可禁用所有限制。

线性轴最小值(Linear Axes Min)

设置最小值,以允许沿 XYZ 轴作线性移动。

要锁定特定轴上的线性运动,请在 线性轴最小值(Linear Axes Min)线性轴最大值(Linear Axis Max) 属性中将所需轴上的值设置为0。

线性轴最大值(Linear Axes Max)

设置最大值以沿 XYZ 轴作线性移动。

要锁定特定轴上的线性运动,请在 线性轴最小值(Linear Axes Min)线性轴最大值(Linear Axis Max) 属性中将所需轴上的值设置为0。

角约束类型(Angular Constraint Types)

选择约束角运动时要使用的方法。角(Angular) 将根据 角限制最小值(Angular Limits Min)角限制最大值(Angular Limits Max)角目标轴(Angular Target Axis)角目标(Angular Target) 属性中设置的参数限制运动。椎体(Cone) 将限制椎体内的运动,其原点从 边界骨骼(Bound Bone) 的关节向量化,角度在 椎体角度(Cone Angle) 属性中设置。

扭转轴(Twist Axis)

选择在约束角运动时将沿 XYZ 中的哪个轴进行扭转。

椎体角度(Cone Angle)

设置当 角约束类型(Angular Constraint Types) 设置为 椎体(Cone) 时要使用的椎角。

角度限制最小值(Angular Limits Min)

设置 X YZ 每个轴上的最小角度限制,以在 角约束类型(Angular Constraint Types) 设置为角度时使用。

角度限制最大值(Angular Limits Max)

设置 X YZ 每个轴上的最大角度限制,以在 角约束类型(Angular Constraint Types) 设置为角度时使用。

角目标轴

设置 XYZ 轴,角度将用于与 角目标(Angular Target) 对齐。通常,这是指向 边界骨骼(Bound Bone) 的轴。

这受角弹性约束(Angular Spring Constraints)的影响。

角目标

设置对齐 角弹性约束(Angular Spring Constraint) 的轴。考虑对齐时,值为0将禁用轴,值为1将禁用轴。

属性值通常设置为指向骨骼。例如,该属性可能设置为(1.0, 0.0, 0.0),但你可以选择其他值,以将弹簧对齐到不同方向。

外部力量(External Forces)

设置后,可以将外力施加于世界空间中指定的模拟中的所有主体。默认情况下,此属性显示为AnimGraph中节点上的引脚。另请参阅本页中的外部力量分段

碰撞类型

设置在启用 平面限制(Planer Limits) 时使用的分辨率方法。选项包括: CoM(质心) :仅限制穿过平面的质心。 自定义球体(Custom Sphere) :使用指定的球体半径与平面碰撞。 内部球体(Inner Sphere) :使用完全匹配主体范围的最大球体与平面碰撞。 外部球体(Outer Sphere) :使用完全包含主体范围的最小球体与平面碰撞。

球体碰撞半径(Sphere Collision Radius)

碰撞类型(Collision Type) 设置为 自定义球体(Custom Sphere) 时,设置半径以计算球体。

使用球体限制(Use Spherical Limits)

启用后,将对球体限制进行求值。

球体限制

启用 使用球体限制(Use Spherical Limits) 后,你可以向数组添加球体限制。添加元素后,它的属性包括:

驱动骨骼(Driving Bone) :附加球体的骨骼。 球体局部偏移(Sphere Local Offset) :球体的局部偏移,如果没有设置驱动骨骼,则在节点空间中,否则在骨骼空间中。 限制半径(Limit Radius) :设置球体的半径。 限制类型(Limit Type) :是否将主体锁定在球体内(内部)或外(外部)。

使用平面限制(Use Planer Limits)

启用后,将对平面限制求值。

平面限制

启用 使用平面限制(Use Planer Limits) 后,你可以向数组添加平面限制。添加元素后,它的属性包括:

驱动骨骼(Driving Bone) :当使用驱动骨骼时,平面变换将相对于骨骼变换。 平面变换(Planer Transform) :设置平面的变换。如果没有指定 驱动骨骼(Driving Bone) ,则它位于组件空间中,如果存在驱动骨骼,则位于骨骼空间中。设置平面 位置(location)旋转(rotation)缩放(scale) 属性的 XYZ 值。

启用风(Enable Wind)

启用后,此模拟中将考虑风对主体的影响。

风级(Wind Scale)

设置级以在解算器中应用计算的风速。