UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDSpringConstraintsBase.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Core.h"
6#include "Chaos/Utilities.h"
10#include "Containers/Array.h"
11#include "Templates/EnableIf.h"
12
13namespace Chaos::Softs
14{
15
17{
18public:
19 template<int32 Valence UE_REQUIRES(Valence >= 2 && Valence <= 4)>
21 const FSolverParticlesRange& Particles,
25 bool bTrimKinematicConstraints = false,
27 : Constraints(TrimConstraints(InConstraints,
28 [&Particles, bTrimKinematicConstraints](int32 Index0, int32 Index1)
29 {
30 return bTrimKinematicConstraints && Particles.InvM(Index0) == (FSolverReal)0. && Particles.InvM(Index1) == (FSolverReal)0.;
31 }))
33 , ParticleCount(Particles.GetRangeSize())
34 , Stiffness(
42 MaxStiffness)
43 {
44 // Update distances
46 CalculateRestLengths(Particles.XArray(), Dists);
47 }
48
49 template<int32 Valence UE_REQUIRES(Valence >= 2 && Valence <= 4)>
80
83
84 // Update stiffness values
86
87 // Update stiffness table, as well as the simulation stiffness exponent
88 inline void ApplyProperties(const FSolverReal Dt, const int32 NumIterations) { Stiffness.ApplyPBDValues(Dt, NumIterations); }
89
91
96
97protected:
98 template<typename SolverParticlesOrRange>
99 FSolverVec3 GetDelta(const SolverParticlesOrRange& Particles, const int32 ConstraintIndex, const FSolverReal ExpStiffnessValue) const
100 {
101 const auto& Constraint = Constraints[ConstraintIndex];
102 const int32 i1 = Constraint[0];
103 const int32 i2 = Constraint[1];
104
105 if (Particles.InvM(i2) == (FSolverReal)0. && Particles.InvM(i1) == (FSolverReal)0.)
106 {
107 return FSolverVec3((FSolverReal)0.);
108 }
109 const FSolverReal CombinedMass = Particles.InvM(i2) + Particles.InvM(i1);
110
111 const FSolverVec3& P1 = Particles.P(i1);
112 const FSolverVec3& P2 = Particles.P(i2);
113 FSolverVec3 Direction = P1 - P2;
114 const FSolverReal Distance = Direction.SafeNormalize();
115
116 const FSolverVec3 Delta = (Distance - Dists[ConstraintIndex]) * Direction;
118 }
119
128
129private:
130 template<int32 Valence, typename Predicate UE_REQUIRES(Valence >= 2 && Valence <= 4)>
132 {
134 TrimmedConstraints.Reserve(Valence == 2 ? InConstraints.Num() : InConstraints.Num() * Chaos::Utilities::NChooseR(Valence, 2));
135
137 {
138 for (int32 i = 0; i < Valence - 1; ++i)
139 {
140 for (int32 j = i + 1; j < Valence; ++j)
141 {
142 const int32 IndexI = ConstraintV[i];
143 const int32 IndexJ = ConstraintV[j];
144
146 {
148 }
149 }
150 }
151 }
152 return TrimmedConstraints.Array();
153 }
154
155protected:
161};
162
163} // End namespace Chaos::Softs
#define check(expr)
Definition AssertionMacros.h:314
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
@ Num
Definition MetalRHIPrivate.h:234
uint32 Size
Definition VulkanMemory.cpp:4034
Definition PBDSpringConstraintsBase.h:17
FPBDStiffness Stiffness
Definition PBDSpringConstraintsBase.h:160
void CalculateRestLengths(const TConstArrayView< FSolverVec3 > &Positions, const TArrayView< FSolverReal > &DistsToCompute) const
Definition PBDSpringConstraintsBase.h:120
FSolverVec3 GetDelta(const SolverParticlesOrRange &Particles, const int32 ConstraintIndex, const FSolverReal ExpStiffnessValue) const
Definition PBDSpringConstraintsBase.h:99
const int32 ParticleCount
Definition PBDSpringConstraintsBase.h:159
FPBDSpringConstraintsBase(const FSolverParticlesRange &Particles, const TArray< TVector< int32, Valence > > &InConstraints, const TConstArrayView< FRealSingle > &StiffnessMultipliers, const FSolverVec2 &InStiffness, bool bTrimKinematicConstraints=false, FSolverReal MaxStiffness=FPBDStiffness::DefaultPBDMaxStiffness)
Definition PBDSpringConstraintsBase.h:20
const int32 ParticleOffset
Definition PBDSpringConstraintsBase.h:158
void SetProperties(const FSolverVec2 &InStiffness)
Definition PBDSpringConstraintsBase.h:85
void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
Definition PBDSpringConstraintsBase.h:88
const TArray< TVec2< int32 > > & GetConstraints() const
Definition PBDSpringConstraintsBase.h:90
TArray< FSolverReal > Dists
Definition PBDSpringConstraintsBase.h:157
virtual ~FPBDSpringConstraintsBase()
Definition PBDSpringConstraintsBase.h:81
TArray< TVec2< int32 > > Constraints
Definition PBDSpringConstraintsBase.h:156
void ResetRestLengths(const TConstArrayView< FSolverVec3 > &Positions)
Definition PBDSpringConstraintsBase.h:92
FPBDSpringConstraintsBase(const FSolverParticles &Particles, int32 InParticleOffset, int32 InParticleCount, const TArray< TVector< int32, Valence > > &InConstraints, const TConstArrayView< FRealSingle > &StiffnessMultipliers, const FSolverVec2 &InStiffness, bool bTrimKinematicConstraints=false, FSolverReal MaxStiffness=FPBDStiffness::DefaultPBDMaxStiffness)
Definition PBDSpringConstraintsBase.h:50
Definition PBDStiffness.h:21
void SetWeightedValue(const FSolverVec2 &InWeightedValue, FSolverReal MaxStiffness=DefaultPBDMaxStiffness)
Definition PBDStiffness.h:65
static constexpr FSolverReal DefaultPBDMaxStiffness
Definition PBDStiffness.h:24
void ApplyPBDValues(const FSolverReal Dt, const int32 NumIterations)
Definition PBDStiffness.h:124
static constexpr int32 DefaultTableSize
Definition PBDStiffness.h:26
static constexpr FSolverReal DefaultParameterFitBase
Definition PBDStiffness.h:25
Definition SoftsSolverParticlesRange.h:12
FSolverReal InvM(const int32 Index) const
Definition SoftsSolverParticlesRange.h:56
Definition PBDSoftsSolverParticles.h:20
const T InvM(const int32 Index) const
Definition DynamicParticles.h:48
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition ArrayView.h:139
Definition Array.h:670
void SetNumUninitialized(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2369
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TVector< FSolverReal, 3 > FSolverVec3
Definition PBDSoftsEvolutionFwd.h:33
Definition SkeletalMeshComponent.h:307
U16 Index
Definition radfft.cpp:71