In AnimNode_RigidBody.cpp, PhysicsSimulation->CreateActor() is being passed World Space transforms, when it should be getting Local Simulation space transforms.
The licensee has reported that FAnimNode_RigidBody::CollectWorldObjects creates a simulation actor for each world object close to the simulation bounds. It passes `OverlapComp->GetComponentTransform()` which is the transform in world space of the world object; but `PhysicsSimulation->CreateActor` should take the transform in local simulation space.
They also noticed that in many cases the transform is overwritten quickly with the correct one: FAnimNode_RigidBody::UpdateWorldObjects sets a kinematic target for the actor to its transform in simulation space, and the simulation moves the actor to its target on the next step, but this can still cause issues, for example if the actor collides with something else on the same step, when it has an incorrect velocity due to the kinematic movement.
That is what makes the SKM actor that is closer to the floor to shoot upward, while the one that is farther away to fall to the floor.
I've found the CreateActor receiving World Space transforms on AnimNode_RigidBody.cpp (UE5.6) lines 1144, 1576, 1636, and 1731.
I've reproduced this behavior on UE versions 5.6 and 5.7 (CL43620315).
The licensee has provided a Repro project and I recommend using it because the setup is complex as it requires a RBAN.
To use the repro, simply Simulate the SimpleRBAN scene and check that the SkeletalMeshActor that is farthest from the floor falls down as expected, while the one that is closer to the floor shoots upward.
The force applied is greater as both RBAN Skeletal Mesh and the floor are closer before the simulation starts.
From scrath:
Create a scene containing an actor animated through an RBAN in the vicinity of another PrimitiveComponent and simulate. The distance is relevant and the effect will increase if they are closer.
> UnrealEditor-Engine.dll!ImmediatePhysics_Chaos::FSimulation::CreateActor(ImmediatePhysics_Chaos::FActorSetup && ActorSetup) Line 450 C++
UnrealEditor-AnimGraphRuntime.dll!FAnimNode_RigidBody::InitPhysics(const UAnimInstance * InAnimInstance) Line 1144 C++
UnrealEditor-Engine.dll!FAnimInstanceProxy::InitializeRootNode(bool bInDeferRootNodeInitialization) Line 331 C++
UnrealEditor-Engine.dll!UAnimInstance::InitializeAnimation(bool bInDeferRootNodeInitialization) Line 322 C++
UnrealEditor-Engine.dll!USkeletalMeshComponent::InitializeAnimScriptInstance(bool bForceReinit, bool bInDeferRootNodeInitialization) Line 1247 C++
UnrealEditor-Engine.dll!USkeletalMeshComponent::InitAnim(bool bForceReinit) Line 1169 C++
UnrealEditor-Engine.dll!USkeletalMeshComponent::OnRegister() Line 949 C++
UnrealEditor-Engine.dll!UActorComponent::ExecuteRegisterEvents(FRegisterComponentContext * Context) Line 2375 C++
UnrealEditor-Engine.dll!UActorComponent::RegisterComponentWithWorld(UWorld * InWorld, FRegisterComponentContext * Context) Line 1918 C++
UnrealEditor-Engine.dll!AActor::IncrementalRegisterComponents(int NumComponentsToRegister, FRegisterComponentContext * Context) Line 6141 C++
UnrealEditor-Engine.dll!ULevel::IncrementalRegisterComponents(FRegisterComponentContext & Context) Line 2001 C++
UnrealEditor-Engine.dll!ULevel::IncrementalUpdateComponents(int NumComponentsToUpdate, bool bRerunConstructionScripts, FRegisterComponentContext * InContext) Line 1865 C++
UnrealEditor-Engine.dll!ULevel::UpdateLevelComponents(bool bRerunConstructionScripts, FRegisterComponentContext * Context) Line 1663 C++
UnrealEditor-Engine.dll!UWorld::UpdateWorldComponents(bool bRerunConstructionScripts, bool bCurrentLevelOnly, FRegisterComponentContext * Context) Line 2804 C++
UnrealEditor-Engine.dll!UWorld::InitializeActorsForPlay(const FURL & InURL, bool bResetTime, FRegisterComponentContext * Context) Line 5734 C++
UnrealEditor-Engine.dll!UGameInstance::StartPlayInEditorGameInstance(ULocalPlayer * LocalPlayer, const FGameInstancePIEParameters & Params) Line 528 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::CreateInnerProcessPIEGameInstance(FRequestPlaySessionParams & InParams, const FGameInstancePIEParameters & InPIEParameters, int InPIEInstanceIndex) Line 3182 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::OnLoginPIEComplete_Deferred(int LocalUserNum, bool bWasSuccessful, FString ErrorString, FPieLoginStruct DataStruct) Line 1627 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::CreateNewPlayInEditorInstance(FRequestPlaySessionParams & InRequestParams, const bool bInDedicatedInstance, const EPlayNetMode InNetMode) Line 1890 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::StartPlayInEditorSession(FRequestPlaySessionParams & InRequestParams) Line 2913 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::StartQueuedPlaySessionRequestImpl() Line 1204 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::StartQueuedPlaySessionRequest() Line 1105 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 2038 C++
UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 533 C++
UnrealEditor.exe!FEngineLoop::Tick() Line 5625 C++
[Inline Frame] UnrealEditor.exe!EngineTick() Line 60 C++
UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) Line 187 C++
UnrealEditor.exe!GuardedMainWrapper(const wchar_t * CmdLine) Line 128 C++
UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 282 C++
UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 339 C++
[External Code]
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-298353 in the post.
0 |
Component | UE - Simulation - Physics |
---|---|
Affects Versions | 5.6, 5.7 |
Target Fix | 5.7 |
Created | Jun 24, 2025 |
---|---|
Updated | Jul 18, 2025 |