UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDJointSolverGaussSeidel.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
6#include "Chaos/DenseMatrix.h"
11#include "Chaos/Utilities.h"
12
13namespace Chaos
14{
15 class FPBDJointSolver;
16
17 UE_DEPRECATED(4.27, "Use FPBDJointSolver")
19
29 {
30 public:
31 static const int32 MaxConstrainedBodies = 2;
32
33 // Access to the SolverBodies that the constraint is operating on.
34 // \note SolverBodies are transient and exist only as long as we are in the Island's constraint solver loop
35 inline FConstraintSolverBody& Body(int32 BodyIndex)
36 {
37 check((BodyIndex >= 0) && (BodyIndex < 2));
38 check(SolverBodies[BodyIndex].IsValid());
39
40 return SolverBodies[BodyIndex];
41 }
42
43 inline const FConstraintSolverBody& Body(int32 BodyIndex) const
44 {
45 check((BodyIndex >= 0) && (BodyIndex < 2));
46 check(SolverBodies[BodyIndex].IsValid());
47
48 return SolverBodies[BodyIndex];
49 }
50
52 {
53 return SolverBodies[0];
54 }
55
56 inline const FConstraintSolverBody& Body0() const
57 {
58 return SolverBodies[0];
59 }
60
62 {
63 return SolverBodies[1];
64 }
65
66 inline const FConstraintSolverBody& Body1() const
67 {
68 return SolverBodies[1];
69 }
70
71 inline const FVec3& X(int BodyIndex) const
72 {
73 return Body(BodyIndex).X();
74 }
75
76 inline const FRotation3& R(int BodyIndex) const
77 {
78 return Body(BodyIndex).R();
79 }
80
81 inline const FVec3 P(int BodyIndex) const
82 {
83 // NOTE: Joints always use the latest post-correction position and rotation. This makes the joint error calculations non-linear and more robust against explosion
84 // but adds a cost because we need to apply the latest correction each time we request the latest transform
85 return Body(BodyIndex).CorrectedP();
86 }
87
88 inline const FRotation3 Q(int BodyIndex) const
89 {
90 // NOTE: Joints always use the latest post-correction position and rotation. This makes the joint error calculations non-linear and more robust against explosion
91 // but adds a cost because we need to apply the latest correction each time we request the latest transform
92 return Body(BodyIndex).CorrectedQ();
93 }
94
95 inline FVec3 V(int BodyIndex) const
96 {
97 return Body(BodyIndex).V();
98 }
99
100 inline FVec3 W(int BodyIndex) const
101 {
102 return Body(BodyIndex).W();
103 }
104
105 inline FReal InvM(int32 BodyIndex) const
106 {
107 return InvMs[BodyIndex];
108 }
109
110 inline FMatrix33 InvI(int32 BodyIndex) const
111 {
112 return InvIs[BodyIndex];
113 }
114
115 inline bool IsDynamic(int32 BodyIndex) const
116 {
117 return (InvM(BodyIndex) > 0);
118 }
119
120 inline const FVec3& GetNetLinearImpulse() const
121 {
122 return NetLinearImpulse;
123 }
124
125 inline const FVec3& GetNetAngularImpulse() const
126 {
127 return NetAngularImpulse;
128 }
129
131 {
132 return LinearViolationSq;
133 }
134
136 {
137 return AngularViolation;
138 }
139
141 {
142 }
143
144 void SetSolverBodies(FSolverBody* SolverBody0, FSolverBody* SolverBody1)
145 {
146 SolverBodies[0] = *SolverBody0;
147 SolverBodies[1] = *SolverBody1;
148 }
149
150 // Called once per frame to initialze the joint solver from the joint settings
151 void Init(
152 const FReal Dt,
153 const FPBDJointSolverSettings& SolverSettings,
154 const FPBDJointSettings& JointSettings,
155 const FRigidTransform3& XL0,
156 const FRigidTransform3& XL1);
157
158 void Deinit();
159
160 // @todo(chaos): this doesn't do much now we have SolverBodies - remove it
161 void Update(
162 const FReal Dt,
163 const FPBDJointSolverSettings& SolverSettings,
164 const FPBDJointSettings& JointSettings);
165
166 void UpdateMasses(
167 const FReal InvMassScale0,
168 const FReal InvMassScale1);
169
170 // Run the position solve for the constraints
171 void ApplyConstraints(
172 const FReal Dt,
174 const FPBDJointSolverSettings& SolverSettings,
175 const FPBDJointSettings& JointSettings);
176
177 // Run the velocity solve for the constraints
178 void ApplyVelocityConstraints(
179 const FReal Dt,
181 const FPBDJointSolverSettings& SolverSettings,
182 const FPBDJointSettings& JointSettings);
183
184 // Apply projection (a position solve where the parent has infinite mass) for the constraints
185 // @todo(chaos): this can be build into the Apply phase when the whole solver is PBD
186 void ApplyProjections(
187 const FReal Dt,
188 const FPBDJointSolverSettings& SolverSettings,
189 const FPBDJointSettings& JointSettings,
190 const bool bLastIteration);
191
192 void SetShockPropagationScales(
193 const FReal InvMScale0,
194 const FReal InvMScale1,
195 const FReal Dt);
196
197 void SetIsBroken(const bool bInIsBroken)
198 {
199 bIsBroken = bInIsBroken;
200 }
201
202 bool IsBroken() const
203 {
204 return bIsBroken;
205 }
206
208 {
209 bIsViolating = bInIsViolating;
210 }
211
212 bool IsViolating() const
213 {
214 return bIsViolating;
215 }
216
217 bool RequiresSolve() const
218 {
219 return !IsBroken() && (IsDynamic(0) || IsDynamic(1));
220 }
221
222 private:
223
224 // Initialize state dependent on particle positions
225 void InitDerivedState();
226
227 // Update state dependent on particle positions (after moving one or both of them)
228 void UpdateDerivedState(const int32 BodyIndex);
229 void UpdateDerivedState();
230
231 void UpdateMass0();
232 void UpdateMass1();
233
234 void ApplyPositionConstraints(
235 const FReal Dt,
236 const FPBDJointSolverSettings& SolverSettings,
237 const FPBDJointSettings& JointSettings);
238
239 void ApplyRotationConstraints(
240 const FReal Dt,
241 const FPBDJointSolverSettings& SolverSettings,
242 const FPBDJointSettings& JointSettings);
243
244 void ApplyPositionDrives(
245 const FReal Dt,
246 const FPBDJointSolverSettings& SolverSettings,
247 const FPBDJointSettings& JointSettings);
248
249 void ApplyRotationDrives(
250 const FReal Dt,
251 const FPBDJointSolverSettings& SolverSettings,
252 const FPBDJointSettings& JointSettings);
253
254 void ApplyLinearVelocityConstraints(
255 const FReal Dt,
256 const FPBDJointSolverSettings& SolverSettings,
257 const FPBDJointSettings& JointSettings);
258
259 void ApplyAngularVelocityConstraints(
260 const FReal Dt,
261 const FPBDJointSolverSettings& SolverSettings,
262 const FPBDJointSettings& JointSettings);
263
264 void ApplyPositionDelta(
265 const int32 BodyIndex,
266 const FVec3& DP);
267
268 void ApplyPositionDelta(
269 const FVec3& DP0,
270 const FVec3& DP1);
271
272 void ApplyRotationDelta(
273 const int32 BodyIndex,
274 const FVec3& DR);
275
276 void ApplyRotationDelta(
277 const FVec3& DR0,
278 const FVec3& DR1);
279
280 void ApplyDelta(
281 const int32 BodyIndex,
282 const FVec3& DP,
283 const FVec3& DR1);
284
285 void ApplyVelocityDelta(
286 const int32 BodyIndex,
287 const FVec3& DV,
288 const FVec3& DW);
289
290 void ApplyVelocityDelta(
291 const FVec3& DV0,
292 const FVec3& DW0,
293 const FVec3& DV1,
294 const FVec3& DW1);
295
296 void ApplyAngularVelocityDelta(
297 const FVec3& DW0,
298 const FVec3& DW1);
299
300 void ApplyPositionConstraint(
301 const FReal JointStiffness,
302 const FVec3& Axis,
303 const FReal Delta,
304 const FVec3& Connector0Correction = FVec3(0),
305 const int32 LinearHardLambdaIndex = -1);
306
307 void ApplyPositionConstraintSoft(
308 const FReal Dt,
309 const FReal JointStiffness,
310 const FReal JointDamping,
311 const bool bAccelerationMode,
312 const FVec3& Axis,
313 const FReal Delta,
314 const FReal TargetVel,
315 const FReal LambdaLimit,
316 FReal& Lambda);
317
318 void ApplyRotationConstraint(
319 const FReal JointStiffness,
320 const FVec3& Axis,
321 const FReal Angle,
322 const int32 AngularHardLambdaIndex = -1);
323
324 void ApplyRotationConstraintKD(
325 const int32 KIndex,
326 const int32 DIndex,
327 const FReal JointStiffness,
328 const FVec3& Axis,
329 const FReal Angle,
330 const int32 AngularHardLambdaIndex = -1);
331
332 void ApplyRotationConstraintDD(
333 const FReal JointStiffness,
334 const FVec3& Axis,
335 const FReal Angle,
336 const int32 AngularHardLambdaIndex = -1);
337
338 void ApplyRotationConstraintSoft(
339 const FReal Dt,
340 const FReal JointStiffness,
341 const FReal JointDamping,
342 const bool bAccelerationMode,
343 const FVec3& Axis,
344 const FReal Angle,
345 const FReal AngVelTarget,
346 const FReal LambdaLimit,
347 FReal& Lambda);
348
349 void ApplyRotationConstraintSoftKD(
350 const int32 KIndex,
351 const int32 DIndex,
352 const FReal Dt,
353 const FReal JointStiffness,
354 const FReal JointDamping,
355 const bool bAccelerationMode,
356 const FVec3& Axis,
357 const FReal Angle,
358 const FReal AngVelTarget,
359 const FReal LambdaLimit,
360 FReal& Lambda);
361
362 void ApplyRotationConstraintSoftDD(
363 const FReal Dt,
364 const FReal JointStiffness,
365 const FReal JointDamping,
366 const bool bAccelerationMode,
367 const FVec3& Axis,
368 const FReal Angle,
369 const FReal AngVelTarget,
370 const FReal LambdaLimit,
371 FReal& Lambda);
372
373 void ApplyLockedRotationConstraints(
374 const FReal Dt,
375 const FPBDJointSolverSettings& SolverSettings,
376 const FPBDJointSettings& JointSettings,
377 const bool bApplyTwist,
378 const bool bApplySwing);
379
380 void ApplyTwistConstraint(
381 const FReal Dt,
382 const FPBDJointSolverSettings& SolverSettings,
383 const FPBDJointSettings& JointSettings,
384 const bool bUseSoftLimit);
385
386 void ApplyConeConstraint(
387 const FReal Dt,
388 const FPBDJointSolverSettings& SolverSettings,
389 const FPBDJointSettings& JointSettings,
390 const bool bUseSoftLimit);
391
392 // One Swing axis is free, and the other locked. This applies the lock: Body1 Twist axis is confined to a plane.
393 void ApplySingleLockedSwingConstraint(
394 const FReal Dt,
395 const FPBDJointSolverSettings& SolverSettings,
396 const FPBDJointSettings& JointSettings,
398 const bool bUseSoftLimit);
399
400 // One Swing axis is free, and the other limited. This applies the limit: Body1 Twist axis is confined to space between two cones.
401 void ApplyDualConeSwingConstraint(
402 const FReal Dt,
403 const FPBDJointSolverSettings& SolverSettings,
404 const FPBDJointSettings& JointSettings,
406 const bool bUseSoftLimit);
407
408 // One swing axis is locked, the other limited or locked. This applies the Limited axis (ApplyDualConeSwingConstraint is used for the locked axis).
409 void ApplySwingConstraint(
410 const FReal Dt,
411 const FPBDJointSolverSettings& SolverSettings,
412 const FPBDJointSettings& JointSettings,
414 const bool bUseSoftLimit);
415
416 void ApplySwingTwistDrives(
417 const FReal Dt,
418 const FPBDJointSolverSettings& SolverSettings,
419 const FPBDJointSettings& JointSettings,
420 const bool bTwistDriveEnabled,
421 const bool bSwing1DriveEnabled,
422 const bool bSwing2DriveEnabled);
423
424 void ApplySLerpDrive(
425 const FReal Dt,
426 const FPBDJointSolverSettings& SolverSettings,
427 const FPBDJointSettings& JointSettings);
428
429 void ApplyPointPositionConstraintKD(
430 const int32 KIndex,
431 const int32 DIndex,
432 const FReal Dt,
433 const FPBDJointSolverSettings& SolverSettings,
434 const FPBDJointSettings& JointSettings);
435
436 void ApplyPointPositionConstraintDD(
437 const FReal Dt,
438 const FPBDJointSolverSettings& SolverSettings,
439 const FPBDJointSettings& JointSettings);
440
441 void ApplySphericalPositionConstraint(
442 const FReal Dt,
443 const FPBDJointSolverSettings& SolverSettings,
444 const FPBDJointSettings& JointSettings);
445
446 void ApplyCylindricalPositionConstraint(
447 const FReal Dt,
448 const int32 AxisIndex,
451 const FPBDJointSolverSettings& SolverSettings,
452 const FPBDJointSettings& JointSettings);
453
454 void ApplyPlanarPositionConstraint(
455 const FReal Dt,
456 const int32 AxisIndex,
458 const FPBDJointSolverSettings& SolverSettings,
459 const FPBDJointSettings& JointSettings);
460
461 void ApplyPositionDrive(
462 const FReal Dt,
463 const int32 AxisIndex,
464 const FPBDJointSolverSettings& SolverSettings,
465 const FPBDJointSettings& JointSettings,
466 const FVec3& Axis,
467 const FReal DeltaPos,
468 const FReal DeltaVel);
469
470 void ApplyPositionProjection(
471 const FReal Dt,
472 const FPBDJointSolverSettings& SolverSettings,
473 const FPBDJointSettings& JointSettings,
474 FVec3& DP1,
475 FVec3& DR1);
476
477 void ApplyRotationProjection(
478 const FReal Dt,
479 const FPBDJointSolverSettings& SolverSettings,
480 const FPBDJointSettings& JointSettings,
481 FVec3& DP1,
482 FVec3& DR1);
483
484 void ApplyPointProjection(
485 const FReal Dt,
486 const FPBDJointSolverSettings& SolverSettings,
487 const FPBDJointSettings& JointSettings,
488 const FReal Alpha,
489 FVec3& NetDP1,
490 FVec3& NetDR1);
491
492 void ApplySphereProjection(
493 const FReal Dt,
494 const FPBDJointSolverSettings& SolverSettings,
495 const FPBDJointSettings& JointSettings,
496 const FReal Alpha,
497 FVec3& NetDP1,
498 FVec3& NetDR1);
499
500 void ApplyTranslateProjection(
501 const FReal Dt,
502 const FPBDJointSolverSettings& SolverSettings,
503 const FPBDJointSettings& JointSettings,
504 const FReal Alpha,
505 FVec3& NetDP1,
506 FVec3& NetDR1);
507
508 void ApplyConeProjection(
509 const FReal Dt,
510 const FPBDJointSolverSettings& SolverSettings,
511 const FPBDJointSettings& JointSettings,
512 const FReal Alpha,
513 const bool bPositionLocked,
514 FVec3& NetDP1,
515 FVec3& NetDR1);
516
517 void ApplySwingProjection(
518 const FReal Dt,
519 const FPBDJointSolverSettings& SolverSettings,
520 const FPBDJointSettings& JointSettings,
522 const FReal Alpha,
523 const bool bPositionLocked,
524 FVec3& NetDP1,
525 FVec3& NetDR1);
526
527 void ApplySingleLockedSwingProjection(
528 const FReal Dt,
529 const FPBDJointSolverSettings& SolverSettings,
530 const FPBDJointSettings& JointSettings,
532 const FReal Alpha,
533 const bool bPositionLocked,
534 FVec3& NetDP1,
535 FVec3& NetDR1);
536
537 void ApplyDoubleLockedSwingProjection(
538 const FReal Dt,
539 const FPBDJointSolverSettings& SolverSettings,
540 const FPBDJointSettings& JointSettings,
541 const FReal Alpha,
542 const bool bPositionLocked,
543 FVec3& NetDP1,
544 FVec3& NetDR1);
545
546 void ApplyDualConeSwingProjection(
547 const FReal Dt,
548 const FPBDJointSolverSettings& SolverSettings,
549 const FPBDJointSettings& JointSettings,
551 const FReal Alpha,
552 const bool bPositionLocked,
553 FVec3& NetDP1,
554 FVec3& NetDR1);
555
556 void ApplyTwistProjection(
557 const FReal Dt,
558 const FPBDJointSolverSettings& SolverSettings,
559 const FPBDJointSettings& JointSettings,
560 const FReal Alpha,
561 const bool bPositionLocked,
562 FVec3& NetDP1,
563 FVec3& NetDR1);
564
565 void ApplyVelocityProjection(
566 const FReal Dt,
567 const FPBDJointSolverSettings& SolverSettings,
568 const FPBDJointSettings& JointSettings,
569 const FReal Alpha,
570 const FVec3& DP1,
571 const FVec3& DR1);
572
573 void ApplyLinearVelocityConstraint(
574 const FReal Stiffness,
575 const FVec3& Axis,
576 const FVec3& Connector0Correction = FVec3(0),
577 const FReal TargetVel = 0);
578
579 void ApplyPointVelocityConstraint(
580 const FReal Dt,
581 const FPBDJointSolverSettings& SolverSettings,
582 const FPBDJointSettings& JointSettings);
583
584 void ApplySphericalVelocityConstraint(
585 const FReal Dt,
586 const FPBDJointSolverSettings& SolverSettings,
587 const FPBDJointSettings& JointSettings);
588
589 void ApplyCylindricalVelocityConstraint(
590 const FReal Dt,
591 const int32 AxisIndex,
594 const FPBDJointSolverSettings& SolverSettings,
595 const FPBDJointSettings& JointSettings);
596
597 void ApplyPlanarVelocityConstraint(
598 const FReal Dt,
599 const int32 AxisIndex,
601 const FPBDJointSolverSettings& SolverSettings,
602 const FPBDJointSettings& JointSettings);
603
604 void ApplyTwistVelocityConstraint(
605 const FReal Dt,
606 const FPBDJointSolverSettings& SolverSettings,
607 const FPBDJointSettings& JointSettings,
608 const bool bUseSoftLimit);
609
610 void ApplyConeVelocityConstraint(
611 const FReal Dt,
612 const FPBDJointSolverSettings& SolverSettings,
613 const FPBDJointSettings& JointSettings,
614 const bool bUseSoftLimit);
615
616 // One Swing axis is free, and the other locked. This applies the lock: Body1 Twist axis is confined to a plane.
617 void ApplySingleLockedSwingVelocityConstraint(
618 const FReal Dt,
619 const FPBDJointSolverSettings& SolverSettings,
620 const FPBDJointSettings& JointSettings,
622 const bool bUseSoftLimit);
623
624 // One Swing axis is free, and the other limited. This applies the limit: Body1 Twist axis is confined to space between two cones.
625 void ApplyDualConeSwingVelocityConstraint(
626 const FReal Dt,
627 const FPBDJointSolverSettings& SolverSettings,
628 const FPBDJointSettings& JointSettings,
630 const bool bUseSoftLimit);
631
632 // One swing axis is locked, the other limited or locked. This applies the Limited axis (ApplyDualConeSwingConstraint is used for the locked axis).
633 void ApplySwingVelocityConstraint(
634 const FReal Dt,
635 const FPBDJointSolverSettings& SolverSettings,
636 const FPBDJointSettings& JointSettings,
638 const bool bUseSoftLimit);
639
640 void ApplyAngularVelocityConstraint(
641 const FReal Stiffness,
642 const FVec3& Axis,
643 const FReal TargetVel = 0.0f);
644
645 void ApplyLockedRotationVelocityConstraints(
646 const FReal Dt,
647 const FPBDJointSolverSettings& SolverSettings,
648 const FPBDJointSettings& JointSettings,
649 const bool bApplyTwist,
650 const bool bApplySwing);
651
652 void CalculateLinearConstraintPadding(
653 const FReal Dt,
654 const FPBDJointSolverSettings& SolverSettings,
655 const FPBDJointSettings& JointSettings,
656 const FReal Restitution,
657 const int32 AxisIndex,
658 const FVec3 Axis,
659 FReal& InOutPos);
660
661 void CalculateAngularConstraintPadding(
662 const FReal Dt,
663 const FPBDJointSolverSettings& SolverSettings,
664 const FPBDJointSettings& JointSettings,
665 const FReal Restitution,
666 const EJointAngularConstraintIndex ConstraintIndex,
667 const FVec3 Axis,
669
670 // Calculate linear velocities along constraint axes based on the constraint type in JointSettings. CV is the relative linear velocity of joint connectors.
671 void CalculateConstraintAxisLinearVelocities(
672 const FPBDJointSettings& JointSettings,
674
675 void CalculateSphericalConstraintAxisLinearVelocities(
676 const FPBDJointSettings& JointSettings,
678 ) const;
679
680 void CalculateCylindricalConstraintAxisLinearVelocities(
681 const int32 AxisIndex,
684 const FPBDJointSettings& JointSettings,
686
687 void CalculatePlanarConstraintAxisLinearVelocities(
688 const int32 AxisIndex,
690 const FPBDJointSettings& JointSettings,
692
693 // Calculate angular velocities along constraint axes based on the constraint type in JointSettings. CW is the relative angular velocity of joint connectors.
694 void CalculateConstraintAxisAngularVelocities(
695 const FPBDJointSolverSettings& SolverSettings,
696 const FPBDJointSettings& JointSettings,
698 ) const;
699
700 void CalculateTwistConstraintAxisAngularVelocities(
701 const FPBDJointSettings& JointSettings,
703
704 void CalculateConeConstraintAxisAngularVelocities(
705 const FPBDJointSettings& JointSettings,
707
708 void CalculateDualConeSwingConstraintAxisAngularVelocities(
709 const FPBDJointSettings& JointSettings,
712
713 void CalculateSwingConstraintAxisAngularVelocities(
714 const FPBDJointSolverSettings& SolverSettings,
715 const FPBDJointSettings& JointSettings,
718
719 // The cached body state on which the joint operates
720 FConstraintSolverBody SolverBodies[MaxConstrainedBodies];
721
722 // Local-space constraint settings
723 FRigidTransform3 LocalConnectorXs[MaxConstrainedBodies]; // Local(CoM)-space joint connector transforms
724
725 // World-space constraint settings
726 FVec3 ConnectorXs[MaxConstrainedBodies]; // World-space joint connector positions
727 FRotation3 ConnectorRs[MaxConstrainedBodies]; // World-space joint connector rotations
728
729 // XPBD Initial iteration world-space body state
730 FVec3 InitConnectorXs[MaxConstrainedBodies]; // World-space joint connector positions
731 FRotation3 InitConnectorRs[MaxConstrainedBodies]; // World-space joint connector rotations
732
733 // Conditioned InvM and InvI
734 FReal InvMScales[MaxConstrainedBodies];
735 FReal ConditionedInvMs[MaxConstrainedBodies];
736 FVec3 ConditionedInvILs[MaxConstrainedBodies]; // Local-space
737 FReal InvMs[MaxConstrainedBodies];
738 FMatrix33 InvIs[MaxConstrainedBodies]; // World-space
739
740 // Accumulated Impulse and AngularImpulse (Impulse * Dt since they are mass multiplied position corrections)
741 FVec3 NetLinearImpulse;
742 FVec3 NetAngularImpulse;
743
744 FReal LinearViolationSq;
745 FReal AngularViolation;
746
747 // Lagrange multipliers of the position constraints.
748 // Currently these are only used in ApplyCylindricalVelocityConstraints
749 FVec3 LinearHardLambda;
750 // Lagrange multipliers of the rotation constraints
751 // Currently these are used in ApplyAngularVelocityConstraints
752 FVec3 AngularHardLambda;
753
754 // XPBD Accumulators (net impulse for each soft constraint/drive)
755 FReal LinearSoftLambda;
756 FReal TwistSoftLambda;
757 FReal SwingSoftLambda;
758 FVec3 LinearDriveLambdas;
759 FVec3 RotationDriveLambdas;
760
761 // Solver stiffness - increased over iterations for stability
762 // \todo(chaos): remove Stiffness from SolverSettings (because it is not a solver constant)
763 FReal SolverStiffness;
764
765 // Tolerances below which we stop solving
766 FReal PositionTolerance; // Distance error below which we consider a constraint or drive solved
767 FReal AngleTolerance; // Angle error below which we consider a constraint or drive solved
768
769 // Tracking whether the solver is resolved
770 FVec3 LastPs[MaxConstrainedBodies]; // Positions at the beginning of the iteration
771 FRotation3 LastQs[MaxConstrainedBodies]; // Rotations at the beginning of the iteration
772 FVec3 InitConstraintAxisLinearVelocities; // Linear velocities along the constraint axes at the begining of the frame, used by restitution
773 FVec3 InitConstraintAxisAngularVelocities; // Angular velocities along the constraint axes at the begining of the frame, used by restitution
774
775 bool bIsBroken;
776 bool bIsViolating;
777 };
778
779}
#define check(expr)
Definition AssertionMacros.h:314
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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 SolverBody.h:543
Definition PBDJointConstraintTypes.h:114
Definition PBDJointConstraintTypes.h:219
Definition PBDJointSolverGaussSeidel.h:29
FConstraintSolverBody & Body(int32 BodyIndex)
Definition PBDJointSolverGaussSeidel.h:35
FVec3 W(int BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:100
FReal GetLinearViolationSq() const
Definition PBDJointSolverGaussSeidel.h:130
FMatrix33 InvI(int32 BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:110
const FRotation3 & R(int BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:76
const FVec3 & GetNetLinearImpulse() const
Definition PBDJointSolverGaussSeidel.h:120
bool IsBroken() const
Definition PBDJointSolverGaussSeidel.h:202
const FConstraintSolverBody & Body(int32 BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:43
void SetIsBroken(const bool bInIsBroken)
Definition PBDJointSolverGaussSeidel.h:197
void SetSolverBodies(FSolverBody *SolverBody0, FSolverBody *SolverBody1)
Definition PBDJointSolverGaussSeidel.h:144
FReal GetAngularViolation() const
Definition PBDJointSolverGaussSeidel.h:135
const FVec3 P(int BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:81
FConstraintSolverBody & Body0()
Definition PBDJointSolverGaussSeidel.h:51
const FVec3 & X(int BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:71
FReal InvM(int32 BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:105
bool IsViolating() const
Definition PBDJointSolverGaussSeidel.h:212
FPBDJointSolver()
Definition PBDJointSolverGaussSeidel.h:140
bool RequiresSolve() const
Definition PBDJointSolverGaussSeidel.h:217
const FConstraintSolverBody & Body0() const
Definition PBDJointSolverGaussSeidel.h:56
void SetIsViolating(const bool bInIsViolating)
Definition PBDJointSolverGaussSeidel.h:207
FVec3 V(int BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:95
const FRotation3 Q(int BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:88
const FVec3 & GetNetAngularImpulse() const
Definition PBDJointSolverGaussSeidel.h:125
FConstraintSolverBody & Body1()
Definition PBDJointSolverGaussSeidel.h:61
const FConstraintSolverBody & Body1() const
Definition PBDJointSolverGaussSeidel.h:66
bool IsDynamic(int32 BodyIndex) const
Definition PBDJointSolverGaussSeidel.h:115
Definition SolverBody.h:99
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
EJointAngularConstraintIndex
Definition PBDJointConstraintTypes.h:48
@ Update
Definition PendingSpatialData.h:19
TVector< FReal, 3 > FVec3
Definition Core.h:17
EJointMotionType
Definition PBDJointConstraintTypes.h:23