我正在编写一个自定义运动组件,并使用
SafeMoveUpdatedComponent
移动我在搅拌机中制作的自定义骨架网格物体。这是代码的主要部分:
const FVector PositionDelta = CalculatePositionDelta(DeltaTime);
const FRotator RotationDelta = CalculateRotationDelta(DeltaTime);
const FQuat NewRotation = UpdatedComponent->GetComponentQuat() * FQuat(RotationDelta);
FHitResult Hit(1.0f);
SafeMoveUpdatedComponent(PositionDelta, NewRotation, true, Hit);
if (Hit.IsValidBlockingHit())
{
HandleImpact(Hit, DeltaTime, PositionDelta);
SlideAlongSurface(PositionDelta, 1.0f - Hit.Time, Hit.Normal, Hit, true);
}
UpdateComponentVelocity();
碰撞的行为就好像网格体的物理资源旋转了 90 度,即使调试碰撞视图显示其方向正确,资源预览看起来也不错。当我将它再旋转 90 度时,它就可以正常工作,但显然有些不对劲。
您可以在此处看到它穿过一个盒子:
这是当我将物理资源的主要部分旋转 90 度时它是如何碰撞的。
当我将此网格体与 Floating Pawn Movement 组件一起使用时,也会出现同样的问题。
编辑:我已经设法确定问题的根源 - 我的骨架网格物体的根骨骼应用了 90 度旋转。让这个问题悬而未决,因为根本问题仍然没有解决 - 如果根骨骼旋转应用于骨架网格物体,为什么它不应用于物理资产?
首先计算动画(姿势),然后物理对其应用单独的变换。
骨骼是物理引擎模型的手柄,但它不是双向的。 物理可以移动模型,但模型无法计算物理或影响引擎。
这与角色以 T 字姿势移动、将四肢戳穿墙壁的错误有关。
物理引擎会使用给定的任何内容,即使存在动画错误。