UE4物理动画使用
刚体(Rigid Body)
刚体的创建
对重要骨骼创建刚体(Body),确保这些刚体控制的是表现和变化比较大的骨骼。同时,需要为根骨骼(Root)创建刚体并进行绑定,将其设置为运动学(Kinematic)状态且不启用物理模拟。这是因为 UPrimitiveComponent::SyncComponentToRBPhysics 会获取根刚体的位置来同步组件的位置。
刚体的设置
刚体的设置主要影响布娃娃(Ragdoll)效果,以下是各项设置的详细说明:
- 质量(Mass):影响刚体的惯性大小。
- 线性阻尼(LinearDamping):控制刚体线性速度的减缓强度,该值越大,刚体的线性速度减小越快。
- 角速度阻尼(AngularDamping):控制刚体角速度的减缓强度,值越大,角速度减小越快。需要注意的是,如果启用了物理动画配置文件(Physical Animation Profile),一般不再单独设置这两个数值,因为配置文件中的值也会影响该效果。
- 启用重力(Enable Gravity):决定刚体是否受重力影响。关闭此选项后,刚体仅受自身惯性影响。
- 物理类型(Physics Type):
- Default:跟随所有者组件的设置。
- Kinematic:刚体不受物理模拟影响。
- Simulated:刚体受物理模拟影响。
一般情况下,将需要开启物理的刚体设置为
Default而非Simulated。原因是在编辑器调试时,关闭权重后,Default刚体可以正确显示到无物理模拟的情况。 - 碰撞响应(CollisionReponse):控制刚体是否与外部物体发生碰撞。当需要刚体与外部物体(如在人群中穿行或碰撞墙壁)发生碰撞时,应打开此选项。
- 刚体之间的碰撞(Body之间的Collision):
- 相邻刚体之间应设置为无碰撞(CollisionOff),以避免运动时出现怪异的碰撞现象。无碰撞的刚体显示为白色,有碰撞的刚体显示为黄色。
- 若要使刚体之间的碰撞效果生效,需要将组件的碰撞类型(CollisionType)设置为
PhysicsBody,并且确保其与自身(PhysicsBody)发生碰撞,注意不要与胶囊体组件(CapsuleComponent)的Pawn类型发生碰撞。
其余设置暂时使用默认值,碰撞物理材质有待进一步研究。
约束(Limit)的设置
原则上,应根据人体骨骼的活动范围来设置约束,确保所有动作都在约束范围内运动。为了方便操作,可以先将所有约束设置为自由(free),然后通过物理动画配置文件(Physical Animation Profile)进行约束。如果配置文件无法满足需求,再对个别骨骼(如脊椎骨 Spine)的约束进行单独设置。对于根骨骼的约束,盆骨应设置为自由(free)。
物理动画配置文件(Physical Animation Profile)
功能
物理动画配置文件用于全局控制,负责稳定刚体的位置,并使其向动画位置靠近。
原理
对于每个动态刚体(Dynamic Body),会创建一个对应的运动学刚体(Kinematic Body)进行辅助约束。在这两个刚体之间添加关节约束,每帧将运动学刚体的位置设置为当前动画的位置,通过关节约束来限制真实刚体的运动。配置文件中设置的值实际上会影响关节的刚度(Stiffness)和阻尼(Damping)。
相关参数
- 是否局部模拟(IsLocalSimulation):决定在移动运动学刚体时是采用全局坐标还是相对于父刚体的局部坐标。
- 全局的:直接取骨骼的位置。
- 局部的:取父刚体对应的骨骼的相对变换(Relative Transform)乘以父刚体的物理位置。 一般情况下使用全局模式,局部模式的使用场景有待进一步研究。
- 方向强度(Orientation Strength):控制角度的变化强度,值越大,刚体越靠近动画的角度。
- 角速度强度(Angular Velocity Strength):控制角速度的变化强度,值越大,刚体的速度越稳定(向动画靠近)。
- 位置强度(Position Strength):控制位置的变化强度,值越大,刚体越靠近动画的位置。
- 速度强度(Velocity Strength):控制线性速度的变化强度,值越大,刚体的速度越稳定(向动画靠近)。 一般来说,方向强度和位置强度应保持一致。当设置为 1000/100 时,刚体的表现基本和动画一致;而设置为 100/10 时,效果极弱。
- 最大线性力/角力(MaxLinearForce/Angular Force):暂时不进行设置,这些值实际影响的是关节的刚度和阻尼值。
相关代码
ConstraintInstance.SetAngularDriveParams(
PhysAnimData.OrientationStrength * StrengthMultiplyer,
PhysAnimData.AngularVelocityStrength * StrengthMultiplyer,
PhysAnimData.MaxAngularForce * StrengthMultiplyer
);
约束配置文件(Constraint Profile)
功能
约束配置文件用于局部控制,通过关节驱动身体靠近动画的姿势,而不影响刚体的属性。如果仅依靠物理动画配置文件驱动,可能会导致刚体过于僵硬而无法移动,约束配置文件解决了这一问题,但在运动时仍需要物理动画配置文件来稳定刚体的位置(全局控制)。
原理
约束配置文件通过设置约束的电机(Motor),使用 setDrive 驱动关联的两个刚体达到动画的相对旋转(Relative Rotation)。
相关设置
- 骨骼网格组件(SkeletalMeshComponent)需要将
Update Joints From Animation设置为true。 - 角驱动模式(Angular Drive Mode)需要设置为
Twist and Swing,电机才能生效。
相关代码
void USkeletalMeshComponent::UpdateRBJointMotors()
{
// If we found this bone, and a visible bone that is not the root, and its joint is motorised in some way..
if ( (BoneIndex != INDEX_NONE) && (BoneIndex != 0) && (BoneVisibilityStates[BoneIndex] == BVS_Visible) && (CI->IsAngularOrientationDriveEnabled()) )
{
// ...
}
}
bool IsOrientationDriveEnabled() const
{
return TwistDrive.bEnablePositionDrive || SwingDrive.bEnablePositionDrive;
}
相关参数
- 目标方向(Target Orientation):无需手动设置,因为
Update Joints From Animation会从动画中获取并设置该方向。 - 强度(Strength):控制刚体向动画靠近的强度,值越大,刚体越靠近动画,当设置为 10000 时,基本和动画一致。
- 目标速度(Target Velocity):设置为 0 即可,可理解为刚体停下的快慢。后续计划添加
Update Velocity From Animation功能,从动画中获取目标速度。强度值越大,当前速度越靠近目标速度。若目标速度为 0,强度值越大,刚体的移动速度越慢(趋近于 0)。