UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
XPBDAxialSpringConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
6#include "ChaosStats.h"
7
8DECLARE_CYCLE_STAT(TEXT("Chaos XPBD Axial Spring Constraint"), STAT_XPBD_AxialSpring, STATGROUP_Chaos);
9
10namespace Chaos::Softs
11{
12
14{
16
17public:
18 // Stiffness is in kg/s^2
19 static constexpr FSolverReal MinStiffness = (FSolverReal)1e-4; // Stiffness below this will be considered 0 since all of our calculations are actually based on 1 / stiffness.
20 static constexpr FSolverReal MaxStiffness = (FSolverReal)1e7;
21
38
59
60 virtual ~FXPBDAxialSpringConstraints() override {}
61
63
64 void ApplyProperties(const FSolverReal /*Dt*/, const int32 /*NumIterations*/) { Stiffness.ApplyXPBDValues(MaxStiffness); }
65
66 void Init() const { for (FSolverReal& Lambda : Lambdas) { Lambda = (FSolverReal)0.; } }
67
68 template<typename SolverParticlesOrRange>
69 void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt) const
70 {
73 {
76 {
77 return;
78 }
79 for (int32 ConstraintIndex = 0; ConstraintIndex < Constraints.Num(); ++ConstraintIndex)
80 {
81 const TVector<int32, 3>& constraint = Constraints[ConstraintIndex];
82 const int32 i1 = constraint[0];
83 const int32 i2 = constraint[1];
84 const int32 i3 = constraint[2];
85 const FSolverVec3 Delta = GetDelta(Particles, Dt, ConstraintIndex, ExpStiffnessValue);
86 const FSolverReal Multiplier = (FSolverReal)2. / (FMath::Max(Barys[ConstraintIndex], (FSolverReal)1. - Barys[ConstraintIndex]) + (FSolverReal)1.);
87 if (Particles.InvM(i1) > 0)
88 {
89 Particles.P(i1) -= Multiplier * Particles.InvM(i1) * Delta;
90 }
91 if (Particles.InvM(i2) != 0)
92 {
93 Particles.P(i2) += Multiplier * Particles.InvM(i2) * Barys[ConstraintIndex] * Delta;
94 }
95 if (Particles.InvM(i3) != 0)
96 {
97 Particles.P(i3) += Multiplier * Particles.InvM(i3) * ((FSolverReal)1. - Barys[ConstraintIndex]) * Delta;
98 }
99 }
100 }
101 else
102 {
103 for (int32 ConstraintIndex = 0; ConstraintIndex < Constraints.Num(); ++ConstraintIndex)
104 {
105 const FSolverReal ExpStiffnessValue = Stiffness[ConstraintIndex];
106 const TVector<int32, 3>& constraint = Constraints[ConstraintIndex];
107 const int32 i1 = constraint[0];
108 const int32 i2 = constraint[1];
109 const int32 i3 = constraint[2];
110 const FSolverVec3 Delta = GetDelta(Particles, Dt, ConstraintIndex, ExpStiffnessValue);
111 const FSolverReal Multiplier = (FSolverReal)2. / (FMath::Max(Barys[ConstraintIndex], (FSolverReal)1. - Barys[ConstraintIndex]) + (FSolverReal)1.);
112 if (Particles.InvM(i1) > 0)
113 {
114 Particles.P(i1) -= Multiplier * Particles.InvM(i1) * Delta;
115 }
116 if (Particles.InvM(i2) != 0)
117 {
118 Particles.P(i2) += Multiplier * Particles.InvM(i2) * Barys[ConstraintIndex] * Delta;
119 }
120 if (Particles.InvM(i3) != 0)
121 {
122 Particles.P(i3) += Multiplier * Particles.InvM(i3) * ((FSolverReal)1. - Barys[ConstraintIndex]) * Delta;
123 }
124 }
125 }
126 }
127
128private:
129 template<typename SolverParticlesOrRange>
130 FSolverVec3 GetDelta(const SolverParticlesOrRange& Particles, const FSolverReal Dt, const int32 InConstraintIndex, const FSolverReal StiffnessValue) const
131 {
133 const int32 i1 = Constraint[0];
134 const int32 i2 = Constraint[1];
135 const int32 i3 = Constraint[2];
136
137 const FSolverReal Bary = Barys[InConstraintIndex];
138 const FSolverReal PInvMass = Particles.InvM(i3) * ((FSolverReal)1. - Bary) + Particles.InvM(i2) * Bary;
139 if (StiffnessValue < MinStiffness || ( Particles.InvM(i1) == (FSolverReal)0. && PInvMass == (FSolverReal)0.))
140 {
141 return FSolverVec3((FSolverReal)0.);
142 }
143 const FSolverReal CombinedInvMass = PInvMass + Particles.InvM(i1);
145
146 const FSolverVec3& P1 = Particles.P(i1);
147 const FSolverVec3& P2 = Particles.P(i2);
148 const FSolverVec3& P3 = Particles.P(i3);
149 const FSolverVec3 P = (P2 - P3) * Bary + P3;
150
151 const FSolverVec3 Difference = P1 - P;
152 const FSolverReal Distance = Difference.Size();
154 {
155 return FSolverVec3((FSolverReal)0.);
156 }
157 const FSolverVec3 Direction = Difference / Distance;
158 const FSolverReal Offset = (Distance - Dists[InConstraintIndex]);
159
160 FSolverReal& Lambda = Lambdas[InConstraintIndex];
161 const FSolverReal Alpha = (FSolverReal)1 / (StiffnessValue * Dt * Dt);
162
163 const FSolverReal DLambda = (Offset - Alpha * Lambda) / (CombinedInvMass + Alpha);
164 const FSolverVec3 Delta = DLambda * Direction;
165 Lambda += DLambda;
166
167 return Delta;
168 }
169
170protected:
171 using Base::Constraints;
174 using Base::Stiffness;
175
176private:
177 using Base::Barys;
178 using Base::Dists;
179
180 mutable TArray<FSolverReal> Lambdas;
181};
182
184{
185public:
190
205
224
225 virtual ~FXPBDAreaSpringConstraints() override = default;
226
229 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps)
230 {
232 {
235 {
237 Stiffness = FPBDStiffness(
238 WeightedValue,
239 WeightMaps.FindRef(WeightMapName),
241 ParticleOffset,
242 ParticleCount,
246 }
247 else
248 {
249 Stiffness.SetWeightedValue(WeightedValue, MaxStiffness);
250 }
251 }
252 }
253
254private:
259
261};
262
263} // End namespace Chaos::Softs
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UNLIKELY(x)
Definition Platform.h:857
#define DECLARE_CYCLE_STAT(CounterName, StatId, GroupId)
Definition Stats.h:669
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Multiplier
#define SMALL_NUMBER
Definition UnrealMathUtility.h:66
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition CollectionPropertyFacade.h:49
Definition PBDAxialSpringConstraintsBase.h:16
TArray< FSolverReal > Dists
Definition PBDAxialSpringConstraintsBase.h:246
TArray< FSolverReal > Barys
Definition PBDAxialSpringConstraintsBase.h:245
const int32 ParticleCount
Definition PBDAxialSpringConstraintsBase.h:244
TArray< TVec3< int32 > > Constraints
Definition PBDAxialSpringConstraintsBase.h:242
FPBDStiffness Stiffness
Definition PBDAxialSpringConstraintsBase.h:247
const int32 ParticleOffset
Definition PBDAxialSpringConstraintsBase.h:243
Definition PBDStiffness.h:21
void SetWeightedValue(const FSolverVec2 &InWeightedValue, FSolverReal MaxStiffness=DefaultPBDMaxStiffness)
Definition PBDStiffness.h:65
static constexpr int32 DefaultTableSize
Definition PBDStiffness.h:26
void ApplyXPBDValues(const FSolverReal MaxStiffnesss)
Definition PBDStiffness.h:164
static constexpr FSolverReal DefaultParameterFitBase
Definition PBDStiffness.h:25
bool HasWeightMap() const
Definition PBDWeightMap.h:55
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
Definition XPBDAxialSpringConstraints.h:184
virtual ~FXPBDAreaSpringConstraints() override=default
FXPBDAreaSpringConstraints(const FSolverParticles &Particles, int32 ParticleOffset, int32 ParticleCount, const TArray< TVec3< int32 > > &InConstraints, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection, bool bTrimKinematicConstraints)
Definition XPBDAxialSpringConstraints.h:206
void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition XPBDAxialSpringConstraints.h:227
FXPBDAreaSpringConstraints(const FSolverParticlesRange &Particles, const TArray< TVec3< int32 > > &InConstraints, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection, bool bTrimKinematicConstraints)
Definition XPBDAxialSpringConstraints.h:191
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDAxialSpringConstraints.h:186
Definition XPBDAxialSpringConstraints.h:14
void ApplyProperties(const FSolverReal, const int32)
Definition XPBDAxialSpringConstraints.h:64
void Init() const
Definition XPBDAxialSpringConstraints.h:66
static constexpr FSolverReal MinStiffness
Definition XPBDAxialSpringConstraints.h:19
FXPBDAxialSpringConstraints(const FSolverParticlesRange &Particles, const TArray< TVec3< int32 > > &InConstraints, const TConstArrayView< FRealSingle > &StiffnessMultipliers, const FSolverVec2 &InStiffness, bool bTrimKinematicConstraints)
Definition XPBDAxialSpringConstraints.h:22
virtual ~FXPBDAxialSpringConstraints() override
Definition XPBDAxialSpringConstraints.h:60
static constexpr FSolverReal MaxStiffness
Definition XPBDAxialSpringConstraints.h:20
void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt) const
Definition XPBDAxialSpringConstraints.h:69
const int32 ParticleCount
Definition PBDAxialSpringConstraintsBase.h:244
TArray< TVec3< int32 > > Constraints
Definition PBDAxialSpringConstraintsBase.h:242
void SetProperties(const FSolverVec2 &InStiffness)
Definition XPBDAxialSpringConstraints.h:62
FXPBDAxialSpringConstraints(const FSolverParticles &Particles, int32 ParticleOffset, int32 ParticleCount, const TArray< TVec3< int32 > > &InConstraints, const TConstArrayView< FRealSingle > &StiffnessMultipliers, const FSolverVec2 &InStiffness, bool bTrimKinematicConstraints)
Definition XPBDAxialSpringConstraints.h:39
FPBDStiffness Stiffness
Definition PBDAxialSpringConstraintsBase.h:247
const int32 ParticleOffset
Definition PBDAxialSpringConstraintsBase.h:243
Definition Vector.h:1000
Definition Constraints.Build.cs:6
Definition Array.h:670
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TVector< FSolverReal, 3 > FSolverVec3
Definition PBDSoftsEvolutionFwd.h:33
FRealSingle FSolverReal
Definition SolverBody.h:38