UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SoftsExternalForces.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
10
11namespace Chaos::Softs
12{
14{
15public:
33
35
36 void Apply(FSolverParticlesRange& Particles, const FSolverReal Dt) const
37 {
39 FSolverVec3* const Acceleration = Particles.GetAcceleration().GetData();
40 const FSolverReal* const InvM = Particles.GetInvM().GetData();
41 const FSolverVec3* const X = Particles.XArray().GetData();
42 const FSolverVec3* const V = Particles.GetV().GetData();
43 const FSolverVec3* const N = Particles.GetConstArrayView(Normals).GetData();
44
45 const bool bHasFictitiousForces = !FictitiousAngularVelocity.IsNearlyZero();
46
52
53 for (int32 Index = 0; Index < Particles.GetRangeSize(); ++Index)
54 {
55 if (InvM[Index] != (FSolverReal)0.)
56 {
60
62 {
63 // Centrifugal force (*InvM to get acceleration)
64 Acceleration[Index] -= FSolverVec3::CrossProduct(FictitiousAngularVelocity, FSolverVec3::CrossProduct(FictitiousAngularVelocity, X[Index] - ReferenceSpaceLocation));
65 }
67 {
69 FSolverVec3 Direction = VelocityDelta;
70 if (Direction.Normalize())
71 {
72 // Scale by angle
73 const FSolverReal DirectionDot = FSolverVec3::DotProduct(Direction, N[Index]);
74 const FSolverReal ScaleFactor = FMath::Min(1.f, FMath::Abs(DirectionDot) * LegacyWindAdaptation);
75 Acceleration[Index] += VelocityDelta * ScaleFactor;
76 }
77 }
78 }
79 }
80 }
81
83 {
84 const FSolverReal* const InvM = Particles.GetInvM().GetData();
85 const FSolverReal* const M = Particles.GetM().GetData();
86 const FSolverVec3* const X = Particles.XArray().GetData();
87 const FSolverVec3* const V = Particles.GetV().GetData();
88 const FSolverVec3* const N = Particles.GetConstArrayView(Normals).GetData();
89
90 const bool bHasFictitiousForces = !FictitiousAngularVelocity.IsNearlyZero();
91
97
98 for (int32 Index = 0; Index < Particles.GetRangeSize(); ++Index)
99 {
100 if (InvM[Index] != (FSolverReal)0.)
101 {
105
107 {
108 // Centrifugal force (*InvM to get acceleration)
109 Force -= FSolverVec3::CrossProduct(FictitiousAngularVelocity, FSolverVec3::CrossProduct(FictitiousAngularVelocity, X[Index] - ReferenceSpaceLocation)) * M[Index];
110 }
112 {
114 FSolverVec3 Direction = VelocityDelta;
115 if (Direction.Normalize())
116 {
117 // Scale by angle
118 const FSolverReal DirectionDot = FSolverVec3::DotProduct(Direction, N[Index]);
119 const FSolverReal ScaleFactor = FMath::Min(1.f, FMath::Abs(DirectionDot) * LegacyWindAdaptation);
120 Force += VelocityDelta * ScaleFactor * M[Index];
121 }
122 }
123 LinearSystem.AddForce(Particles, Force, Index, Dt);
124 }
125 }
126 }
127
129 const FSolverVec3& GetGravity() const { return Gravity; }
138protected:
148};
149
151{
153public:
155 static constexpr FSolverReal DefaultGravityZOverride = (FSolverReal)-980.665f;
156 static constexpr bool bDefaultUseGravityOverride = false;
158 static constexpr bool bDefaultUsePointBasedWindModel = false;
159
160 // We don't have the solver values at the time this is constructed. Need to SetProperties at least once after setting
161 // data from the solver.
164 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
166 : Base(Particles,
169 WeightMaps.FindRef(GetGravityScaleString(PropertyCollection, GravityScaleName.ToString())),
171 )
172 , ParticleCount(Particles.GetRangeSize())
173 , WorldGravityMultiplier((FSolverReal)1.f)
174 , SolverGravity((FSolverReal)0.f, (FSolverReal)0.f, DefaultGravityZOverride)
175 , bPerSoftBodyGravityOverrideEnabled(true)
176 , FictitiousAngularVelocityNoScale(0.f)
182 {}
183
186 {
187 SolverGravity = InSolverGravity;
188 bPerSoftBodyGravityOverrideEnabled = bInPerSoftBodyGravityOverrideEnabled;
189 }
200
230private:
231 void CalculateGravity(bool bUseGravityOverride, const FSolverVec3& GravityOverride)
232 {
233 bApplyGravityScale = !(bPerSoftBodyGravityOverrideEnabled && bUseGravityOverride);
234 Gravity = (bApplyGravityScale ? SolverGravity : GravityOverride) * WorldGravityMultiplier;
235 }
236 const int32 ParticleCount;
237
239 // "World" level properties (this comes from a world-level CVar)
240 FSolverReal WorldGravityMultiplier;
241
242 // "Solver" level properties (set from Solver-level BP)
243 FSolverVec3 SolverGravity;
244 bool bPerSoftBodyGravityOverrideEnabled;
245
247 FSolverVec3 FictitiousAngularVelocityNoScale; // Without Scale parameter applied.
248
254};
255}
#define check(expr)
Definition AssertionMacros.h:314
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
@ 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
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
return true
Definition ExternalRpcRegistry.cpp:601
Definition CollectionPropertyFacade.h:49
Definition SoftsEvolutionLinearSystem.h:45
Definition SoftsExternalForces.h:14
FExternalForcesBase(const FSolverParticlesRange &Particles, const FSolverVec3 &InGravity, const FSolverVec2 &InGravityScale, const TConstArrayView< FRealSingle > &InGravityScaleMultipliers, const TArray< FSolverVec3 > &InNormals)
Definition SoftsExternalForces.h:16
bool bUsePointBasedWindModel
Definition SoftsExternalForces.h:144
bool UsePointBasedWindModel() const
Definition SoftsExternalForces.h:128
const FSolverVec3 & GetReferenceSpaceLocation() const
Definition SoftsExternalForces.h:137
void UpdateLinearSystem(const FSolverParticlesRange &Particles, const FSolverReal Dt, FEvolutionLinearSystem &LinearSystem) const
Definition SoftsExternalForces.h:82
virtual ~FExternalForcesBase()
Definition SoftsExternalForces.h:34
FSolverVec3 Gravity
Definition SoftsExternalForces.h:139
bool HasPerParticleGravity() const
Definition SoftsExternalForces.h:130
void Apply(FSolverParticlesRange &Particles, const FSolverReal Dt) const
Definition SoftsExternalForces.h:36
bool bApplyGravityScale
Definition SoftsExternalForces.h:140
FSolverVec3 FictitiousAngularVelocity
Definition SoftsExternalForces.h:142
const FSolverVec3 & GetGravity() const
Definition SoftsExternalForces.h:129
FSolverVec3 GetScaledGravity(int32 ParticleIndex) const
Definition SoftsExternalForces.h:131
FSolverReal LegacyWindAdaptation
Definition SoftsExternalForces.h:146
FSolverVec3 ReferenceSpaceLocation
Definition SoftsExternalForces.h:143
FPBDFlatWeightMap GravityScale
Definition SoftsExternalForces.h:141
FSolverVec3 PointBasedWind
Definition SoftsExternalForces.h:145
const FSolverVec3 & GetFictitiousAngularVelocity() const
Definition SoftsExternalForces.h:136
const TArray< FSolverVec3 > & Normals
Definition SoftsExternalForces.h:147
Definition SoftsExternalForces.h:151
void SetSolverGravityProperties(const FSolverVec3 &InSolverGravity, bool bInPerSoftBodyGravityOverrideEnabled)
Definition SoftsExternalForces.h:185
void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition SoftsExternalForces.h:202
void SetFictitiousForcesData(const FSolverVec3 &InFictitiousAngularVelocityNoScale, const FSolverVec3 &InReferenceSpaceLocation)
Definition SoftsExternalForces.h:190
static constexpr FSolverReal DefaultGravityScale
Definition SoftsExternalForces.h:154
static constexpr FSolverReal DefaultFictitiousAngularScale
Definition SoftsExternalForces.h:157
void SetWorldGravityMultiplier(FSolverReal InWorldGravityMultiplier)
Definition SoftsExternalForces.h:184
static constexpr bool bDefaultUsePointBasedWindModel
Definition SoftsExternalForces.h:158
FExternalForces(const FSolverParticlesRange &Particles, const TArray< FSolverVec3 > &InNormals, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection)
Definition SoftsExternalForces.h:162
void SetSolverWind(const FSolverVec3 &SolverWind, const FSolverReal InLegacyWindAdaptation)
Definition SoftsExternalForces.h:195
static constexpr bool bDefaultUseGravityOverride
Definition SoftsExternalForces.h:156
static constexpr FSolverReal DefaultGravityZOverride
Definition SoftsExternalForces.h:155
Definition PBDFlatWeightMap.h:98
TConstArrayView< FSolverReal > GetMapValues() const
Definition PBDFlatWeightMap.h:165
FSolverReal GetLow() const
Definition PBDFlatWeightMap.h:156
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDFlatWeightMap.h:142
bool HasWeightMap() const
Definition PBDFlatWeightMap.h:137
const FSolverVec2 & GetOffsetRange() const
Definition PBDFlatWeightMap.h:147
Definition SoftsSolverParticlesRange.h:12
TConstArrayView< FSolverVec3 > GetAcceleration() const
Definition SoftsSolverParticlesRange.h:50
TConstArrayView< FSolverReal > GetM() const
Definition SoftsSolverParticlesRange.h:54
TConstArrayView< FSolverVec3 > GetV() const
Definition SoftsSolverParticlesRange.h:46
TConstArrayView< FSolverVec3 > XArray() const
Definition SoftsSolverParticlesRange.h:71
TConstArrayView< FSolverReal > GetInvM() const
Definition SoftsSolverParticlesRange.h:58
int32 GetRangeSize() const
Definition ParticlesRange.h:89
TConstArrayView< T > GetConstArrayView(const TArray< T > &Array) const
Definition ParticlesRange.h:73
Definition Vector.h:1000
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TVector< FSolverReal, 3 > FSolverVec3
Definition PBDSoftsEvolutionFwd.h:33
@ X
Definition SimulationModuleBase.h:152
FRealSingle FSolverReal
Definition SolverBody.h:38
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71