UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GaussSeidelUnilateralTetConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Utilities.h"
5
6namespace Chaos::Softs
7{
8 template <typename T, typename ParticleType>
10 {
11 public:
13 const ParticleType& Particles,
17 StiffnessArray(InStiffnessArray)
18 {
19 IncidentElements = Chaos::Utilities::ComputeIncidentElements(Constraints, &IncidentElementsLocal);
20 Volumes.SetNumUninitialized(Constraints.Num());
21
22 for (int32 Idx = 0; Idx < Constraints.Num(); ++Idx)
23 {
24 const TVec4<int32>& Constraint = Constraints[Idx];
25 Volumes[Idx] = ComputeVolume(
26 Particles.X(Constraint[0]),
27 Particles.X(Constraint[1]),
28 Particles.X(Constraint[2]),
29 Particles.X(Constraint[3]));
30 StiffnessArray[Idx] /= Volumes[Idx];
31 }
32 };
33
34 static T ComputeVolume(const TVec3<T>& P1, const TVec3<T>& P2, const TVec3<T>& P3, const TVec3<T>& P4)
35 {
36 const TVec3<T> P2P1 = P2 - P1;
37 const TVec3<T> P4P1 = P4 - P1;
38 const TVec3<T> P3P1 = P3 - P1;
40 }
41
42 void AddEnergy(const ParticleType& InParticles, const int32 ConstraintIndex, const T Dt, T& Energy) const
43 {
44 const TVec4<int32>& Constraint = Constraints[ConstraintIndex];
46 InParticles.P(Constraint[0]),
47 InParticles.P(Constraint[1]),
48 InParticles.P(Constraint[2]),
49 InParticles.P(Constraint[3]));
50 Energy += Dt * Dt * StiffnessArray[ConstraintIndex] / (T)2. * (CurrentVol - Volumes[ConstraintIndex]) * (CurrentVol - Volumes[ConstraintIndex]);
51 }
52
53 void AddResidualAndHessian(const ParticleType& InParticles, const int32 ConstraintIndex, const int32 LocalIndex, const T Dt, TVec3<T>& ParticleResidual, Chaos::PMatrix<T, 3, 3>& ParticleHessian) const
54 {
55 const TVec4<int32>& Constraint = Constraints[ConstraintIndex];
56 const int32 Index1 = Constraint[0];
57 const int32 Index2 = Constraint[1];
58 const int32 Index3 = Constraint[2];
59 const int32 Index4 = Constraint[3];
60
61 const TVec3<T>& P1 = InParticles.P(Index1);
62 const TVec3<T>& P2 = InParticles.P(Index2);
63 const TVec3<T>& P3 = InParticles.P(Index3);
64 const TVec3<T>& P4 = InParticles.P(Index4);
65
67 const TVec3<T> P2P1 = P2 - P1;
68 const TVec3<T> P4P1 = P4 - P1;
69 const TVec3<T> P3P1 = P3 - P1;
73 Grads[0] = -(Grads[1] + Grads[2] + Grads[3]);
74
75 const T Volume = ComputeVolume(P1, P2, P3, P4);
76 const T C_Hessian = StiffnessArray[ConstraintIndex] * Dt * Dt;
77 const T C_Residual = (Volume - Volumes[ConstraintIndex]) * C_Hessian;
78 ParticleResidual += C_Residual * Grads[LocalIndex];
80 }
81
94
96 {
97 return Constraints.Num();
98 }
99
100 private:
102 TArray<T> Volumes;
103 TArray<TArray<int32>> IncidentElements;
104 TArray<TArray<int32>> IncidentElementsLocal;
105 TArray<T> StiffnessArray;
106 };
107
108
109}// End namespace Chaos::Softs
int Volume
Definition AndroidPlatformMisc.cpp:380
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
Definition Matrix.h:21
Definition GaussSeidelUnilateralTetConstraints.h:10
TArray< TArray< int32 > > GetStaticConstraintArrays(TArray< TArray< int32 > > &InIncidentElements, TArray< TArray< int32 > > &InIncidentElementsLocal) const
Definition GaussSeidelUnilateralTetConstraints.h:82
void AddResidualAndHessian(const ParticleType &InParticles, const int32 ConstraintIndex, const int32 LocalIndex, const T Dt, TVec3< T > &ParticleResidual, Chaos::PMatrix< T, 3, 3 > &ParticleHessian) const
Definition GaussSeidelUnilateralTetConstraints.h:53
static T ComputeVolume(const TVec3< T > &P1, const TVec3< T > &P2, const TVec3< T > &P3, const TVec3< T > &P4)
Definition GaussSeidelUnilateralTetConstraints.h:34
void AddEnergy(const ParticleType &InParticles, const int32 ConstraintIndex, const T Dt, T &Energy) const
Definition GaussSeidelUnilateralTetConstraints.h:42
int32 NumConstraints() const
Definition GaussSeidelUnilateralTetConstraints.h:95
FGaussSeidelUnilateralTetConstraints(const ParticleType &Particles, TArray< TVector< int32, 4 > > &&InConstraints, TArray< T > InStiffnessArray)
Definition GaussSeidelUnilateralTetConstraints.h:12
Definition Vector.h:1000
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
void SetNumUninitialized(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2369
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TArray< TArray< int > > ComputeIncidentElements(const TArray< TVector< int32, d > > &Mesh, TArray< TArray< int32 > > *LocalIndex=nullptr)
Definition Utilities.h:1013