UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GaussSeidelSphereRepulsionConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
7#include "ChaosStats.h"
12#include "Chaos/Utilities.h"
15#include "Chaos/Triangle.h"
17#include "Chaos/TriangleMesh.h"
18#include <unordered_map>
21
22namespace Chaos::Softs
23{
24 using Chaos::TVec3;
25 template <typename T, typename ParticleType>
27 {
28 public:
29 //TODO(Yushan): Add unit tests for Gauss Seidel Sphere Repulsion Constraints
31 {
32 const TArrayCollectionArray<FPAndInvM>& PAndInvM = InParticles.GetPAndInvM();
33 ReferencePositions.SetNum(PAndInvM.Num());
34 for (int32 i = 0; i < PAndInvM.Num(); ++i)
35 {
36 ReferencePositions[i] = PAndInvM[i].P;
37 }
38 }
39
41
42 //Energy = k/2*(2r-d)^2
43 //Residual = de/dx = -force = -k*(2r-d)*dd/dx
44 //Hessian = de2/dx2 = k*dd/dx*dd/dx-k*(2r-d)*(-dd/dx*dd/dx^T+I)/d
45 void AddSphereRepulsionResidual(const ParticleType& InParticles, const int32 p, const T Dt, TVec3<T>& res)
46 {
47
48 }
49
54
55 void AddSphereRepulsionResidualAndHessian(const ParticleType& InParticles, const int32 ConstraintIndex, const int32 LocalIndex, const T Dt, TVec3<T>& ParticleResidual, Chaos::PMatrix<T, 3, 3>& ParticleHessian)
56 {
57 Chaos::TVec3<T> x0 = InParticles.P(Constraints[ConstraintIndex][0]);
58 Chaos::TVec3<T> x1 = InParticles.P(Constraints[ConstraintIndex][1]);
59 Chaos::TVec3<T> normal = (x1 - x0).GetSafeNormal();
60 normal = (LocalIndex ? normal : -normal); //dd/dx
61 T dist = (x1 - x0).Size();
62 FSolverReal penetration = 2 * Radius - dist; //2r-d
63
64 if (penetration > T(0)) {
65 T dist_inv = T(1) / (dist+T(1e-12));
68 ParticleHessian += Dt * Dt * ConstraintStiffness[ConstraintIndex] * (outer - penetration * A);
69 ParticleResidual += -Dt * Dt * penetration * ConstraintStiffness[ConstraintIndex] * normal;
70 }
71 }
72
73 void VisualizeAllBindings(const FSolverParticles& InParticles, const T Dt) const
74 {
75#if WITH_EDITOR
76 auto DoubleVert = [](Chaos::TVec3<T> V) { return FVector3d(V.X, V.Y, V.Z); };
77 for (int32 i = 0; i < Constraints.Num(); i++)
78 {
81
82 float ParticleThickness = DebugDrawParams.DebugParticleWidth;
83 float LineThickness = DebugDrawParams.DebugLineWidth;
84
85 Chaos::FDebugDrawQueue::GetInstance().DrawDebugPoint(SourcePos, FColor::Red, false, Dt, 0, ParticleThickness);
86 Chaos::FDebugDrawQueue::GetInstance().DrawDebugPoint(TargetPos, FColor::Red, false, Dt, 0, ParticleThickness);
87 Chaos::FDebugDrawQueue::GetInstance().DrawDebugLine(SourcePos, TargetPos, FColor::Green, false, Dt, 0, LineThickness);
88 }
89#endif
90 }
91
92 void Init(const FSolverParticles& InParticles, const T Dt) const
93 {
94 if (DebugDrawParams.bVisualizeBindings)
95 {
97 }
98
99 }
100
102 {
104 Constraints.Reset();
106 if (SurfaceVertices.Num() == 0)
107 {
108 return;
109 }
110
111 // Build Spatial
113 const FSolverReal Diameter = 2.f * Radius;
114 TConstArrayView<FSolverVec3> Points = Particles.XArray();
115
116 Entries.Reset(SurfaceVertices.Num());
117 for (int32 Index = 0; Index < SurfaceVertices.Num(); ++Index)
118 {
119 Entries.Add({ &Points, SurfaceVertices[Index]});
120 }
121
122 TSpatialHashGridPoints<int32, FSolverReal> SpatialHash(Diameter);
123 SpatialHash.InitializePoints(Entries);
124
125 const FSolverReal DiamSq = FMath::Square(Diameter);
126 constexpr int32 CellRadius = 1; // We set the cell size of the spatial hash such that we only need to look 1 cell away to find proximities.
129
131 [this, &Particles, DiamSq, &ComponentIndex](const int32 i1, const int32 i2)
132 {
133 if (ComponentIndex[i1] == ComponentIndex[i2])
134 {
135 return false;
136 }
137 const FSolverReal CombinedMass = Particles.InvM(i1) + Particles.InvM(i2);
138 if (CombinedMass < (FSolverReal)1e-7)
139 {
140 return false;
141 }
142 if (FSolverVec3::DistSquared(this->ReferencePositions[i1], this->ReferencePositions[i2]) < DiamSq)
143 {
144 return false;
145 }
146 return true;
147 }
148 );
149
151 {
152 T TotalMass = T(0);
153 if (Particles.InvM(CollisionPair[0]) > (FSolverReal)1e-7)
154 {
155 TotalMass += Particles.M(CollisionPair[0]);
156 }
157 if (Particles.InvM(CollisionPair[1]) > (FSolverReal)1e-7)
158 {
159 TotalMass += Particles.M(CollisionPair[1]);
160 }
162 }
163 }
164
176
177 protected:
182 private:
183 struct FSphereSpatialEntry
184 {
185 const TConstArrayView<FSolverVec3>* Points;
186 int32 Index;
187
188 FSolverVec3 X() const
189 {
190 return (*Points)[Index];
191 }
192
193 template<typename TPayloadType>
194 int32 GetPayload(int32) const
195 {
196 return Index;
197 }
198 };
199 TArray<FSolverVec3> ReferencePositions;
201 };
202
203
204}// End namespace Chaos::Softs
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
#define X(Name, Desc)
Definition FormatStringSan.h:47
UE::Math::TVector< double > FVector3d
Definition MathFwd.h:60
uint32 Size
Definition VulkanMemory.cpp:4034
Definition Matrix.h:21
Definition GaussSeidelSphereRepulsionConstraints.h:27
virtual ~FGaussSeidelSphereRepulsionConstraints()
Definition GaussSeidelSphereRepulsionConstraints.h:40
void ReturnSphereRepulsionConstraints(TArray< TArray< int32 > > &ExtraConstraints, TArray< TArray< int32 > > &ExtraIncidentElements, TArray< TArray< int32 > > &ExtraIncidentElementsLocal)
Definition GaussSeidelSphereRepulsionConstraints.h:165
void AddSphereRepulsionResidual(const ParticleType &InParticles, const int32 p, const T Dt, TVec3< T > &res)
Definition GaussSeidelSphereRepulsionConstraints.h:45
FGaussSeidelSphereRepulsionConstraints(FSolverReal InRadius, FSolverReal InStiffness, const ParticleType &InParticles, const FDeformableXPBDWeakConstraintParams &InParams)
Definition GaussSeidelSphereRepulsionConstraints.h:30
void UpdateSphereRepulsionConstraints(const FSolverParticles &Particles, const TArray< int32 > &SurfaceVertices, const TArray< int32 > &ComponentIndex)
Definition GaussSeidelSphereRepulsionConstraints.h:101
FSolverReal Radius
Definition GaussSeidelSphereRepulsionConstraints.h:179
void AddSphereRepulsionHessian(const int32 p, const T Dt, Chaos::PMatrix< T, 3, 3 > &ParticleHessian)
Definition GaussSeidelSphereRepulsionConstraints.h:50
void VisualizeAllBindings(const FSolverParticles &InParticles, const T Dt) const
Definition GaussSeidelSphereRepulsionConstraints.h:73
TArray< T > ConstraintStiffness
Definition GaussSeidelSphereRepulsionConstraints.h:181
FSolverReal Stiffness
Definition GaussSeidelSphereRepulsionConstraints.h:180
TArray< TVec2< int32 > > Constraints
Definition GaussSeidelSphereRepulsionConstraints.h:178
void AddSphereRepulsionResidualAndHessian(const ParticleType &InParticles, const int32 ConstraintIndex, const int32 LocalIndex, const T Dt, TVec3< T > &ParticleResidual, Chaos::PMatrix< T, 3, 3 > &ParticleHessian)
Definition GaussSeidelSphereRepulsionConstraints.h:55
void Init(const FSolverParticles &InParticles, const T Dt) const
Definition GaussSeidelSphereRepulsionConstraints.h:92
Definition PBDSoftsSolverParticles.h:20
Definition ArrayCollectionArray.h:15
const T M(const int32 Index) const
Definition DynamicParticles.h:43
const T InvM(const int32 Index) const
Definition DynamicParticles.h:48
const TArrayCollectionArray< TVector< T, d > > & XArray() const
Definition Particles.h:134
Definition HierarchicalSpatialHash.h:484
TArray< TVec2< PayloadType > > FindAllSelfProximities(int32 CellRadius, int32 MaxNumExpectedConnections, TFunctionRef< bool(const int32 Payload0, const int32 Payload1)> NarrowTest, bool bForceSingleThreaded=false) const
Definition HierarchicalSpatialHash.h:527
void InitializePoints(const ParticlesType &Particles, bool bForceSingleThreaded=false)
Definition HierarchicalSpatialHash.h:504
Definition Vector.h:1000
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TArray< TArray< int > > ComputeIncidentElements(const TArray< TVector< int32, d > > &Mesh, TArray< TArray< int32 > > *LocalIndex=nullptr)
Definition Utilities.h:1013
U16 Index
Definition radfft.cpp:71
Definition XPBDWeakConstraints.h:25
bool bVisualizeBindings
Definition XPBDWeakConstraints.h:28
float DebugLineWidth
Definition XPBDWeakConstraints.h:26
float DebugParticleWidth
Definition XPBDWeakConstraints.h:27
static CORE_API const FColor Red
Definition Color.h:752
static CORE_API const FColor Green
Definition Color.h:753
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578