Description

Soft angular constraints are solving velocity like hard constraints. Instead of swinging back and forth, the affected body just snaps to 45 degrees.
Check the steps to reproduce for more details.
The licensee has pointed out that this was once solved for soft linear limits. The change was made in this commit: https://github.com/EpicGames/UnrealEngine/commit/ed20624aed46b7834eebfceb51d98b1d6169b10c
The licensee has suggested that a similar fix might be necessary on FPBDJointCachedSolver::ApplyAngularVelocityConstraints().
Another licensee has offered, as a workaround, to use motors on the constraint.
I've verified this behavior on 5.6 and 5.7 CL43620315.

 

Steps to Reproduce

In an empty project
Create a static mesh actor (e.g. a Cube), enable simulate physics.
Create a physics constraint actor, set constraint actor 1 to the static mesh, and in the angular limits section: swing 1 motion = limited, advanced > stiffness = 0.1, advanced > damping = 0
In the level blueprint, on beginplay, set physics angular velocity in radians to 0, 0, 10 on the static mesh

Expected behavior: the cube should rotate past the 45 degree limit and spring back
Actual result: the cube just snaps at 45 degrees

Callstack

> UnrealEditor-Chaos.dll!Chaos::FPBDJointCachedSolver::ApplyAngularVelocityConstraints() Line 1682 C++
[Inline Frame] UnrealEditor-Chaos.dll!Chaos::FPBDJointCachedSolver::ApplyVelocityConstraints(const double) Line 331 C++
UnrealEditor-Chaos.dll!Chaos::Private::ApplyVelocityConstraintsImpl<Chaos::FPBDJointCachedSolver>(const Chaos::Private::TPBDJointContainerSolver<Chaos::FPBDJointCachedSolver> & Container, TArray<Chaos::FPBDJointCachedSolver,TSizedDefaultAllocator<32>> & Solvers, const double Dt, const int It, const int NumIts) Line 353 C++
UnrealEditor-Chaos.dll!Chaos::Private::TPBDJointContainerSolver<Chaos::FPBDJointCachedSolver>::ApplyVelocityConstraints(const double Dt, const int It, const int NumIts) Line 363 C++
UnrealEditor-Chaos.dll!Chaos::Private::FPBDConstraintGroupSolver::ApplyVelocityConstraints(const double Dt) Line 245 C++
UnrealEditor-Chaos.dll!Chaos::Private::FPBDIslandGroupManager::SolveGroupConstraints(const int GroupIndex, const double Dt) Line 269 C++
[Inline Frame] UnrealEditor-Chaos.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 471 C++
[Inline Frame] UnrealEditor-Chaos.dll!TFunctionGraphTaskImpl<void __cdecl(void),0>::DoTaskImpl(TUniqueFunction<void __cdecl(void)> & Function, ENamedThreads::Type) Line 1111 C++
[Inline Frame] UnrealEditor-Chaos.dll!TFunctionGraphTaskImpl<void __cdecl(void),0>::DoTask(ENamedThreads::Type) Line 1104 C++
UnrealEditor-Chaos.dll!TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),0>>::ExecuteTask() Line 706 C++
UnrealEditor-Chaos.dll!UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 527 C++
[Inline Frame] UnrealEditor-Chaos.dll!UE::Tasks::Private::FTaskBase::Init::__l2::<lambda_1>::operator()() Line 184 C++
[Inline Frame] UnrealEditor-Chaos.dll!LowLevelTasks::FTask::Init::__l13::<lambda_1>::operator()(const bool) Line 499 C++
[Inline Frame] UnrealEditor-Chaos.dll!Invoke(LowLevelTasks::FTask::Init::__l13::<lambda_1> &) Line 47 C++
[Inline Frame] UnrealEditor-Chaos.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`UE::Tasks::Private::FTaskBase::Init'::`2'::<lambda_1>>'::`13'::<lambda_1>,0>::Call(void *) Line 162 C++
UnrealEditor-Chaos.dll!?CallAndMove@?$TTaskDelegateImpl@V<lambda_1>@?N@???$Init@V<lambda_1>@?1??0FTaskBase@Private@Tasks@UE@@IEAAXPEB_WW4ETaskPriority@LowLevelTasks@@W4EExtendedTaskPriority@45@W4ETaskFlags@45@@Z@@FTask@LowLevelTasks@@QEAAXPEB_WW4ETaskPriority@3@$$QEAV1?1??Init@FTaskBase@Private@Tasks@UE@@IEAAX01W4EExtendedTaskPriority@89@W4ETaskFlags@89@@Z@W4ETaskFlags@3@@Z@$0A@@?$TTaskDelegate@$$A6APEAVFTask@LowLevelTasks@@_N@Z$0DA@@LowLevelTasks@@UEAAPEAVFTask@3@AEAV23@PEAXI_N@Z(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> & Destination, void * InlineData, unsigned int DestInlineSize, bool <Params_0>) Line 171 C++
[Inline Frame] UnrealEditor-Core.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::CallAndMove(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> &) Line 309 C++
UnrealEditor-Core.dll!LowLevelTasks::FTask::ExecuteTask() Line 627 C++
UnrealEditor-Core.dll!LowLevelTasks::FScheduler::ExecuteTask(LowLevelTasks::FTask * InTask) Line 365 C++
[Inline Frame] UnrealEditor-Core.dll!LowLevelTasks::FScheduler::TryExecuteTaskFrom(LowLevelTasks::Private::FWaitEvent *) Line 665 C++
UnrealEditor-Core.dll!LowLevelTasks::FScheduler::WorkerLoop(LowLevelTasks::Private::FWaitEvent * WorkerEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * WorkerLocalQueue, unsigned int WaitCycles, bool bPermitBackgroundWork) Line 724 C++
[Inline Frame] UnrealEditor-Core.dll!LowLevelTasks::FScheduler::WorkerMain(LowLevelTasks::Private::FWaitEvent * WorkerEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * WorkerLocalQueue, unsigned int WaitCycles, bool bPermitBackgroundWork) Line 783 C++
UnrealEditor-Core.dll!LowLevelTasks::FScheduler::CreateWorker::__l2::<lambda>() Line 188 C++
[Inline Frame] UnrealEditor-Core.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 471 C++
UnrealEditor-Core.dll!FThreadImpl::Run() Line 69 C++
UnrealEditor-Core.dll!FRunnableThreadWin::Run() Line 159 C++
UnrealEditor-Core.dll!FRunnableThreadWin::GuardedRun() Line 79 C++
[External Code]

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-305724 in the post.

0
Login to Vote

Unresolved
ComponentUE - Simulation - Physics
Affects Versions5.65.7
CreatedJul 17, 2025
UpdatedSep 11, 2025
View Jira Issue