UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
JointSolverConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5
8#include "Chaos/Utilities.h"
9
10namespace Chaos
11{
12 class FPBDJointSolver;
13
14 // The method used to calculate the axis and angle for one of the rotation constraints in the joint
39
44 {
45 public:
46 static const int32 MaxConstrainedBodies = 2;
47
48 void Init(
49 const FPBDJointSolverSettings& SolverSettings,
50 const FPBDJointSettings& JointSettings,
51 const FVec3& PrevP0,
52 const FRotation3& PrevQ0,
53 const FVec3& PrevP1,
54 const FRotation3& PrevQ1,
55 const FReal InvM0,
56 const FVec3& InvIL0,
57 const FReal InvM1,
58 const FVec3& InvIL1,
59 const FRigidTransform3& XL0,
60 const FRigidTransform3& XL1);
61
63 const FVec3& P0,
64 const FRotation3& Q0,
65 const FVec3& P1,
66 const FRotation3& Q1);
67
69
71
73 const FVec3& DP0,
74 const FVec3& DR0,
75 const FVec3& DP1,
76 const FVec3& DR1);
77
79 const FVec3& DR0,
80 const FVec3& DR1);
81
82 // Local-space constraint settings
83 FRigidTransform3 XLs[MaxConstrainedBodies]; // Local-space joint connector transforms
84 FVec3 InvILs[MaxConstrainedBodies]; // Local-space inverse inertias
85 FReal InvMs[MaxConstrainedBodies]; // Inverse masses
86
87 // World-space constraint state
88 FVec3 Xs[MaxConstrainedBodies]; // World-space joint connector positions
89 FRotation3 Rs[MaxConstrainedBodies]; // World-space joint connector rotations
90
91 // World-space body state
92 FVec3 Ps[MaxConstrainedBodies]; // World-space particle CoM positions
93 FRotation3 Qs[MaxConstrainedBodies]; // World-space particle CoM rotations
94 FMatrix33 InvIs[MaxConstrainedBodies]; // World-space inverse inertias
95
96 // XPBD initial world-space body state (start of each tick, not each sub-tick iteration)
97 FVec3 PrevPs[MaxConstrainedBodies]; // World-space particle CoM positions
98 FRotation3 PrevQs[MaxConstrainedBodies]; // World-space particle CoM rotations
99 FVec3 PrevXs[MaxConstrainedBodies]; // World-space joint connector positions
100
103
104 FReal PositionTolerance; // Distance error below which we consider a constraint or drive solved
105 FReal AngleTolerance; // Angle error below which we consider a constraint or drive solved
106 };
107
112 {
113 public:
114 static const int32 MaxConstrainedBodies = 2;
115
117 : DPs{ FVec3(0), FVec3(0) }
118 , DRs{ FVec3(0), FVec3(0) }
119 , Axis(FVec3(0))
120 , Error(0)
121 , Lambda(0)
122 {
123 }
124
125 // Reset state that persists over all iterations, but must be cleared at start of each tick.
126 FORCEINLINE void TickReset();
127
128 // Reset calculated values ready for next iteration. Note: Lambda is not reset here,
129 // it accumulates over the whole timestep.
131
132 // Calculate the error to correct, given the current position and limit
134
135 // Per-Iteration Transient
140
141 // Per-Tick Transient
143 };
144
149 {
150 public:
151 static const int32 MaxConstrainedBodies = 2;
152
165
166 EJointSolverConstraintUpdateType UpdateType; // Method to use to calculate axis, errors, etc.
167 int32 JointIndex; // Index into the outer container's joint array
168 int32 ConstraintIndex; // Context dependent: X,Y,Z or Twist,Swing1,Swing2 for linear and angular rows
169 int32 NumRows; // Number of rows (including this one) to solve simultaneously
170 FReal Stiffness; // PBD or XPBD stiffness
171 FReal Damping; // XPBD damping
175 };
176
177
182 {
183 public:
184 friend class FPBDJointSolver;
185
187
189 {
190 JointIndex = InJointIndex;
191 }
192
194 {
195 return JointIndex;
196 }
197
199 {
200 return LinearRowIndexBegin;
201 }
202
204 {
205 return LinearRowIndexEnd;
206 }
207
209 {
210 return AngularRowIndexBegin;
211 }
212
214 {
215 return AngularRowIndexEnd;
216 }
217
219 {
220 return LinearRowIndexEnd - LinearRowIndexBegin;
221 }
222
224 {
225 return AngularRowIndexEnd - AngularRowIndexBegin;
226 }
227
230 const FPBDJointSolverSettings& SolverSettings,
231 const FPBDJointSettings& JointSettings);
232
235 const FPBDJointSolverSettings& SolverSettings,
236 const FPBDJointSettings& JointSettings);
237
238 // Update the axes and positions of all position constraints
243 const FPBDJointSettings& JointSettings);
244
245 // Update the axes and positions of all rotation constraints
250 const FPBDJointSettings& JointSettings);
251
252 private:
253
254 void AddPointPositionConstraint(
256 const FPBDJointSolverSettings& SolverSettings,
257 const FPBDJointSettings& JointSettings);
258
259 void AddSphericalPositionConstraint(
261 const FPBDJointSolverSettings& SolverSettings,
262 const FPBDJointSettings& JointSettings);
263
264 void AddCylindricalPositionConstraint(
266 const int32 AxisIndex,
269 const FPBDJointSolverSettings& SolverSettings,
270 const FPBDJointSettings& JointSettings);
271
272 void AddPlanarPositionConstraint(
274 const int32 AxisIndex,
276 const FPBDJointSolverSettings& SolverSettings,
277 const FPBDJointSettings& JointSettings);
278
279 void AddPositionDrive(
281 const FPBDJointSolverSettings& SolverSettings,
282 const FPBDJointSettings& JointSettings,
283 const EJointSolverConstraintUpdateType UpdateType,
284 const int32 AxisIndex);
285
286 void AddTwistConstraint(
288 const FPBDJointSolverSettings& SolverSettings,
289 const FPBDJointSettings& JointSettings,
291 const bool bUseSoftLimit);
292
293 void AddSwingConstraint(
295 const FPBDJointSolverSettings& SolverSettings,
296 const FPBDJointSettings& JointSettings,
298 const EJointAngularConstraintIndex ConstraintIndex,
299 const bool bUseSoftLimit);
300
301 void AddTwistDrive(
303 const FPBDJointSolverSettings& SolverSettings,
304 const FPBDJointSettings& JointSettings);
305
306 void AddSwingDrive(
308 const FPBDJointSolverSettings& SolverSettings,
309 const FPBDJointSettings& JointSettings,
311 const EJointAngularConstraintIndex ConstraintIndex);
312
313 void AddSLerpDrive(
315 const FPBDJointSolverSettings& SolverSettings,
316 const FPBDJointSettings& JointSettings);
317
318
319
320 FORCEINLINE int32 UpdatePointPositionConstraint(
321 int32 RowIndex,
324 const FPBDJointSettings& JointSettings,
325 const FVec3& X0,
326 const FVec3& X1);
327
328 FORCEINLINE int32 UpdateSphericalPositionConstraint(
329 int32 RowIndex,
332 const FPBDJointSettings& JointSettings,
333 const FVec3& X0,
334 const FVec3& X1);
335
336 FORCEINLINE int32 UpdateCylindricalPositionConstraint(
337 int32 RowIndex,
340 const FPBDJointSettings& JointSettings,
341 const FRotation3& R0,
342 const FVec3& X0,
343 const FVec3& X1);
344
345 FORCEINLINE int32 UpdatePlanarPositionConstraint(
346 int32 RowIndex,
349 const FPBDJointSettings& JointSettings,
350 const FRotation3& R0,
351 const FVec3& X0,
352 const FVec3& X1);
353
354 FORCEINLINE int32 UpdateSphericalPositionDrive(
355 int32 RowIndex,
358 const FPBDJointSettings& JointSettings,
359 const FRotation3& R0,
360 const FVec3& X0,
361 const FVec3& X1);
362
363 FORCEINLINE int32 UpdateCircularPositionDrive(
364 int32 RowIndex,
367 const FPBDJointSettings& JointSettings,
368 const FRotation3& R0,
369 const FVec3& X0,
370 const FVec3& X1);
371
372 FORCEINLINE int32 UpdateAxialPositionDrive(
373 int32 RowIndex,
376 const FPBDJointSettings& JointSettings,
377 const FRotation3& R0,
378 const FVec3& X0,
379 const FVec3& X1);
380
381 FORCEINLINE void UpdateTwistConstraint(
384 const FPBDJointSettings& JointSettings,
385 const FRotation3& R1,
386 const FRotation3& RTwist);
387
388 FORCEINLINE void UpdateConeSwingConstraint(
391 const FPBDJointSettings& JointSettings,
392 const FRotation3& R0,
393 const FRotation3& RSwing);
394
395 FORCEINLINE void UpdateSingleLockedSwingConstraint(
398 const FPBDJointSettings& JointSettings,
399 const FRotation3& R0,
400 const FRotation3& R1);
401
402 FORCEINLINE void UpdateSingleLimitedSwingConstraint(
405 const FPBDJointSettings& JointSettings,
406 const FRotation3& R0,
407 const FRotation3& RSwing);
408
409 FORCEINLINE void UpdateDualConeSwingConstraint(
412 const FPBDJointSettings& JointSettings,
413 const FRotation3& R0,
414 const FRotation3& R1);
415
416 FORCEINLINE void UpdateTwistDrive(
419 const FPBDJointSettings& JointSettings,
420 const FRotation3& R1,
421 const FRotation3& RTwist);
422
423 FORCEINLINE void UpdateConeSwingDrive(
426 const FPBDJointSettings& JointSettings,
427 const FRotation3& R0,
428 const FRotation3& RSwing);
429
430 FORCEINLINE void UpdateSwingDrive(
433 const FPBDJointSettings& JointSettings,
434 const FRotation3& R0,
435 const FRotation3& RSwing);
436
437 FORCEINLINE void UpdateSLerpDrive(
440 const FPBDJointSettings& JointSettings,
441 const FRotation3& R0,
442 const FRotation3& R1);
443
444 int32 JointIndex;
445 int32 LinearRowIndexBegin;
446 int32 LinearRowIndexEnd;
447 int32 AngularRowIndexBegin;
448 int32 AngularRowIndexEnd;
449 FReal PositionTolerance;
450 FReal AngleTolerance;
451 bool bNeedSwingTwist; // True if any of the constraints need the decomposed swing/twist to calculate angles
452 bool bNeedLockedAxes; // True if any of the constraints need the fixed axes to calculate angles
453 };
454
499}
500
501#include "Chaos/Joint/JointSolverConstraints.inl" // IWYU pragma: export
#define FORCEINLINE
Definition AndroidPlatform.h:140
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
Definition JointSolverConstraints.h:149
FReal Damping
Definition JointSolverConstraints.h:171
int32 NumRows
Definition JointSolverConstraints.h:169
bool bIsSoft
Definition JointSolverConstraints.h:174
int32 JointIndex
Definition JointSolverConstraints.h:167
int32 ConstraintIndex
Definition JointSolverConstraints.h:168
FReal Limit
Definition JointSolverConstraints.h:172
FReal Stiffness
Definition JointSolverConstraints.h:170
bool bIsAccelerationMode
Definition JointSolverConstraints.h:173
static const int32 MaxConstrainedBodies
Definition JointSolverConstraints.h:151
EJointSolverConstraintUpdateType UpdateType
Definition JointSolverConstraints.h:166
FJointSolverConstraintRowData()
Definition JointSolverConstraints.h:153
Definition JointSolverConstraints.h:112
FJointSolverConstraintRowState()
Definition JointSolverConstraints.h:116
FVec3 Axis
Definition JointSolverConstraints.h:138
FVec3 DRs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:137
FVec3 DPs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:136
FReal Error
Definition JointSolverConstraints.h:139
FORCEINLINE void IterationReset()
Definition JointSolverConstraints.inl:157
static const int32 MaxConstrainedBodies
Definition JointSolverConstraints.h:114
FORCEINLINE void CalculateError(FReal Position, FReal Limit)
Definition JointSolverConstraints.inl:168
FORCEINLINE void TickReset()
Definition JointSolverConstraints.inl:150
FReal Lambda
Definition JointSolverConstraints.h:142
Definition JointSolverConstraints.h:182
FORCEINLINE int32 GetAngularRowIndexBegin() const
Definition JointSolverConstraints.h:208
FORCEINLINE int32 NumAngularConstraints() const
Definition JointSolverConstraints.h:223
FORCEINLINE int32 NumLinearConstraints() const
Definition JointSolverConstraints.h:218
void AddPositionConstraints(TArray< FJointSolverConstraintRowData > &RowDatas, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition JointSolverConstraints.cpp:37
FORCEINLINE void SetJointIndex(int32 InJointIndex)
Definition JointSolverConstraints.h:188
void UpdateRotationConstraints(const TArray< FJointSolverConstraintRowData > &RowDatas, TArray< FJointSolverConstraintRowState > &RowStates, const FJointSolverJointState &JointState, const FPBDJointSettings &JointSettings)
Definition JointSolverConstraints.cpp:328
FORCEINLINE int32 GetLinearRowIndexBegin() const
Definition JointSolverConstraints.h:198
FORCEINLINE int32 GetJointIndex() const
Definition JointSolverConstraints.h:193
void AddRotationConstraints(TArray< FJointSolverConstraintRowData > &RowDatas, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition JointSolverConstraints.cpp:204
FORCEINLINE int32 GetLinearRowIndexEnd() const
Definition JointSolverConstraints.h:203
FORCEINLINE int32 GetAngularRowIndexEnd() const
Definition JointSolverConstraints.h:213
void UpdatePositionConstraints(const TArray< FJointSolverConstraintRowData > &RowDatas, TArray< FJointSolverConstraintRowState > &RowStates, const FJointSolverJointState &JointState, const FPBDJointSettings &JointSettings)
Definition JointSolverConstraints.cpp:157
FJointSolverConstraints()
Definition JointSolverConstraints.cpp:24
Definition JointSolverConstraints.h:44
FVec3 PrevPs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:97
FVec3 PrevXs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:99
FVec3 Ps[MaxConstrainedBodies]
Definition JointSolverConstraints.h:92
FRotation3 Rs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:89
FORCEINLINE void UpdateDerivedState()
Definition JointSolverConstraints.inl:77
FORCEINLINE void InitDerivedState()
Definition JointSolverConstraints.inl:55
FVec3 DPs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:101
FVec3 Xs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:88
FVec3 DRs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:102
FRotation3 PrevQs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:98
FORCEINLINE void ApplyDelta(const FVec3 &DP0, const FVec3 &DR0, const FVec3 &DP1, const FVec3 &DR1)
Definition JointSolverConstraints.inl:98
static const int32 MaxConstrainedBodies
Definition JointSolverConstraints.h:46
FReal PositionTolerance
Definition JointSolverConstraints.h:104
FMatrix33 InvIs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:94
FReal AngleTolerance
Definition JointSolverConstraints.h:105
FRotation3 Qs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:93
FORCEINLINE void ApplyRotationDelta(const FVec3 &DR0, const FVec3 &DR1)
Definition JointSolverConstraints.inl:125
FRigidTransform3 XLs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:83
FReal InvMs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:85
FVec3 InvILs[MaxConstrainedBodies]
Definition JointSolverConstraints.h:84
Definition JointSolverConstraints.h:456
static int32 ApplyRotationConstraints(const FReal Dt, TArray< FJointSolverJointState > &JointStates, const TArray< FJointSolverConstraintRowData > &RowDatas, TArray< FJointSolverConstraintRowState > &RowStates, int32 JointIndexBegin, int32 JointIndexEnd, int32 RowIndexBegin, int32 RowIndexEnd)
Definition JointSolverConstraints.cpp:775
static int32 ApplyPositionConstraints(const FReal Dt, TArray< FJointSolverJointState > &JointStates, const TArray< FJointSolverConstraintRowData > &RowDatas, TArray< FJointSolverConstraintRowState > &RowStates, int32 JointIndexBegin, int32 JointIndexEnd, int32 RowIndexBegin, int32 RowIndexEnd)
Definition JointSolverConstraints.cpp:719
Definition PBDJointConstraintTypes.h:114
Definition PBDJointConstraintTypes.h:219
Definition PBDJointSolverGaussSeidel.h:29
Definition Array.h:670
Definition SkeletalMeshComponent.h:307
EJointSolverConstraintUpdateType
Definition JointSolverConstraints.h:16
FRealDouble FReal
Definition Real.h:22
EJointAngularConstraintIndex
Definition PBDJointConstraintTypes.h:48
@ Update
Definition PendingSpatialData.h:19
EJointMotionType
Definition PBDJointConstraintTypes.h:23
@ false
Definition radaudio_common.h:23