UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDTetConstraintsBase.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Array.h"
10
11namespace Chaos::Softs
12{
13
15{
16public:
19 {
20 for (const TVec4<int32>& Constraint : Constraints)
21 {
22 const FSolverVec3& P1 = InParticles.GetX(Constraint[0]);
23 const FSolverVec3& P2 = InParticles.GetX(Constraint[1]);
24 const FSolverVec3& P3 = InParticles.GetX(Constraint[2]);
25 const FSolverVec3& P4 = InParticles.GetX(Constraint[3]);
26 Volumes.Add(FSolverVec3::DotProduct(FSolverVec3::CrossProduct(P2 - P1, P3 - P1), P4 - P1) / (FSolverReal)6.);
27 }
28 }
30
32 {
34 const TVec4<int32>& Constraint = Constraints[i];
35 const FSolverVec3& P1 = InParticles.P(Constraint[0]);
36 const FSolverVec3& P2 = InParticles.P(Constraint[1]);
37 const FSolverVec3& P3 = InParticles.P(Constraint[2]);
38 const FSolverVec3& P4 = InParticles.P(Constraint[3]);
39 const FSolverVec3 P2P1 = P2 - P1;
40 const FSolverVec3 P4P1 = P4 - P1;
41 const FSolverVec3 P3P1 = P3 - P1;
42 Grads[1] = FSolverVec3::CrossProduct(P3P1, P4P1) / (FSolverReal)6.;
43 Grads[2] = FSolverVec3::CrossProduct(P4P1, P2P1) / (FSolverReal)6.;
44 Grads[3] = FSolverVec3::CrossProduct(P2P1, P3P1) / (FSolverReal)6.;
45 Grads[0] = -(Grads[1] + Grads[2] + Grads[3]);
46 return Grads;
47 }
48
50 {
51 const TVec4<int32>& Constraint = Constraints[i];
52 const int32 i1 = Constraint[0];
53 const int32 i2 = Constraint[1];
54 const int32 i3 = Constraint[2];
55 const int32 i4 = Constraint[3];
56 const FSolverVec3& P1 = InParticles.P(i1);
57 const FSolverVec3& P2 = InParticles.P(i2);
58 const FSolverVec3& P3 = InParticles.P(i3);
59 const FSolverVec3& P4 = InParticles.P(i4);
60 const FSolverReal Volume = FSolverVec3::DotProduct(FSolverVec3::CrossProduct(P2 - P1, P3 - P1), P4 - P1) / (FSolverReal)6.;
61 const FSolverReal S = (Volume - Volumes[i]) / (
62 InParticles.InvM(i1) * Grads[0].SizeSquared() +
63 InParticles.InvM(i2) * Grads[1].SizeSquared() +
64 InParticles.InvM(i3) * Grads[2].SizeSquared() +
65 InParticles.InvM(i4) * Grads[3].SizeSquared());
66 return Stiffness * S;
67 }
68
69protected:
71
72private:
73 TArray<FSolverReal> Volumes;
74 FSolverReal Stiffness;
75};
76
77} // 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 PBDTetConstraintsBase.h:15
TArray< TVec4< int32 > > Constraints
Definition PBDTetConstraintsBase.h:70
TVec4< FSolverVec3 > GetGradients(const FSolverParticles &InParticles, const int32 i) const
Definition PBDTetConstraintsBase.h:31
FSolverReal GetScalingFactor(const FSolverParticles &InParticles, const int32 i, const TVec4< FSolverVec3 > &Grads) const
Definition PBDTetConstraintsBase.h:49
FPBDTetConstraintsBase(const FSolverParticles &InParticles, TArray< TVec4< int32 > > &&InConstraints, const FSolverReal InStiffness=(FSolverReal) 1.)
Definition PBDTetConstraintsBase.h:17
virtual ~FPBDTetConstraintsBase()
Definition PBDTetConstraintsBase.h:29
Definition PBDSoftsSolverParticles.h:20
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31