UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ParticleUtilities.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
5#include "Chaos/Utilities.h"
6
7//
8// These accessors existed to allow us to switch between particles whose transforms are maintained
9// in center of mass space, versus actor space. The should no longer be needed - we have settled on Actor Space.
10// See particle handle methods like GetTransformPQ(), SetTransformPQCom() etc.
11//
12// @todo(chaos): deprecate this file and its contents
13//
14
15#define CHAOS_PARTICLE_ACTORTRANSFORM 1
16
17namespace Chaos
18{
20 {
21 public:
22 template<typename T_PARTICLEHANDLE>
23 static inline FVec3& Position(T_PARTICLEHANDLE Particle) { return Particle->GetX(); }
24 template<typename T_PARTICLEHANDLE>
25 static inline const FVec3& GetPosition(T_PARTICLEHANDLE Particle) { return Particle->GetX(); }
26 template<typename T_PARTICLEHANDLE>
27 UE_DEPRECATED(5.4, "Use Particle->SetR() instead.")
28 static inline FRotation3 Rotation(T_PARTICLEHANDLE Particle) { return Particle->GetR(); }
29 template<typename T_PARTICLEHANDLE>
30 static inline const FRotation3 GetRotation(T_PARTICLEHANDLE Particle) { return Particle->GetR(); }
31
32 static inline const FVec3& Position(TPBDRigidParticles<FReal, 3>& Particles, const int32 Index) { return Particles.GetX(Index); }
33 static inline const FRotation3 Rotation(TPBDRigidParticles<FReal, 3>& Particles, const int32 Index) { return Particles.GetR(Index); }
34 };
35
37 {
38 public:
39 template<typename T_PARTICLEHANDLE>
40 static inline FVec3& Position(T_PARTICLEHANDLE Particle) { return Particle->P(); }
41 template<typename T_PARTICLEHANDLE>
42 static inline const FVec3& GetPosition(T_PARTICLEHANDLE Particle) { return Particle->GetP(); }
43 template<typename T_PARTICLEHANDLE>
44 static inline FRotation3& Rotation(T_PARTICLEHANDLE Particle) { return Particle->GetQ(); }
45 template<typename T_PARTICLEHANDLE>
46 static inline const FRotation3 GetRotation(T_PARTICLEHANDLE Particle) { return Particle->GetQ(); }
47
48 static inline const FVec3& Position(TPBDRigidParticles<FReal, 3>& Particles, const int32 Index) { return Particles.GetP(Index); }
49 static inline FRotation3 Rotation(TPBDRigidParticles<FReal, 3>& Particles, const int32 Index) { return Particles.GetQ(Index); }
50 };
51
56 template <typename TSpatialAccessor>
58 {
59 public:
60 template<typename T_PARTICLEHANDLE>
62 {
63 return FRigidTransform3(TSpatialAccessor::GetPosition(Particle), TSpatialAccessor::GetRotation(Particle));
64 }
65
66 template<typename T_PARTICLEHANDLE>
68 {
69 TSpatialAccessor::Position(Particle) = ActorWorldT.GetTranslation();
70 TSpatialAccessor::Rotation(Particle) = ActorWorldT.GetRotation();
71 }
72
73 template<typename T_PARTICLEHANDLE>
75 {
76 return ActorLocalT;
77 }
78
79 template<typename T_PARTICLEHANDLE>
81 {
82 return ActorWorldT;
83 }
84
85 template<typename T_PARTICLEHANDLE>
87 {
88 return Utilities::ComputeWorldSpaceInertia(TSpatialAccessor::GetRotation(Particle) * Particle->RotationOfMass(), Particle->I());
89 }
90
91 template<typename T_PARTICLEHANDLE>
93 {
94 return Utilities::ComputeWorldSpaceInertia(TSpatialAccessor::GetRotation(Particle) * Particle->RotationOfMass(), Particle->InvI());
95 }
96
100 template<typename T_PARTICLEHANDLE>
101 static inline FVec3 ParticleLocalToCoMLocal(T_PARTICLEHANDLE Particle, const FVec3& P)
102 {
103 return Particle->RotationOfMass().UnrotateVector(P - Particle->CenterOfMass());
104 }
105
109 template<typename T_PARTICLEHANDLE>
111 {
112 return Particle->RotationOfMass().Inverse()* Q;
113 }
114
118 template<typename T_PARTICLEHANDLE>
120 {
121 return FRigidTransform3(ParticleLocalToCoMLocal(Particle, T.GetTranslation()), ParticleLocalToCoMLocal(Particle, T.GetRotation()));
122 }
123
127 template<typename T_PARTICLEHANDLE>
129 {
130 return Particle->V() + FVec3::CrossProduct(Particle->W(), RelPos);
131 }
132
133 template<typename T_PARTICLEHANDLE>
135 {
136 return Particle->PreV() + FVec3::CrossProduct(Particle->PreW(), RelPos);
137 }
138
139 template<typename T_PARTICLEHANDLE>
141 {
142 return TSpatialAccessor::GetPosition(Particle) + TSpatialAccessor::GetRotation(Particle).RotateVector(Particle->CenterOfMass());
143 }
144
146 {
147 return TSpatialAccessor::Position(Particles, Index) + TSpatialAccessor::Rotation(Particles, Index).RotateVector(Particles.CenterOfMass(Index));
148 }
149
150 template<typename T_PARTICLEHANDLE>
152 {
153 return TSpatialAccessor::GetRotation(Particle) * Particle->RotationOfMass();
154 }
155
157 {
158 return TSpatialAccessor::Rotation(Particles, Index) * Particles.RotationOfMass(Index);
159 }
160
161 template<typename T_PARTICLEHANDLE>
163 {
164 return FRigidTransform3(GetCoMWorldPosition(Particle), GetCoMWorldRotation(Particle));
165 }
166
170 template<typename T_PARTICLEHANDLE>
171 static inline void SetCoMWorldTransform(T_PARTICLEHANDLE Particle, const FVec3& PCoM, const FRotation3& QCoM)
172 {
173 const FRotation3 Q = QCoM * Particle->RotationOfMass().Inverse();
174 const FVec3 P = PCoM - Q.RotateVector(Particle->CenterOfMass());
175
176 TSpatialAccessor::Position(Particle) = P;
177 TSpatialAccessor::Rotation(Particle) = Q;
178 }
179
180 static inline void SetCoMWorldTransform(TPBDRigidParticles<FReal, 3>& Particles, const int32 Index, const FVec3& PCoM, const FRotation3& QCoM)
181 {
182 const FRotation3 Q = QCoM * Particles.RotationOfMass(Index).Inverse();
183 const FVec3 P = PCoM - Q.RotateVector(Particles.CenterOfMass(Index));
184
185 TSpatialAccessor::Position(Particles, Index) = P;
186 TSpatialAccessor::Rotation(Particles, Index) = Q;
187 }
188
189 template<typename T_PARTICLEHANDLE>
190 static inline void AddForceAtPositionLocal(T_PARTICLEHANDLE Particle, const FVec3& LocalForce, const FVec3& LocalPosition)
191 {
192 const FRigidTransform3 ParticleTransform = GetActorWorldTransform(Particle);
193 const FVec3 WorldPosition = ParticleTransform.TransformPosition(LocalPosition);
194 const FVec3 WorldForce = ParticleTransform.TransformVector(LocalForce);
195
197 }
198
199 template<typename T_PARTICLEHANDLE>
200 static inline void AddForceAtPositionWorld(T_PARTICLEHANDLE Particle, const FVec3& Force, const FVec3& Position)
201 {
202 const FVec3 WorldCOM = GetCoMWorldPosition(Particle);
203 const FVec3 Torque = FVec3::CrossProduct(Position - WorldCOM, Force);
204
205 Particle->AddForce(Force);
206 Particle->AddTorque(Torque);
207 }
208 };
209
214
215}
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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 ParticleUtilities.h:37
static const FVec3 & GetPosition(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:42
static FVec3 & Position(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:40
static FRotation3 & Rotation(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:44
static const FVec3 & Position(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index)
Definition ParticleUtilities.h:48
static const FRotation3 GetRotation(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:46
static FRotation3 Rotation(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index)
Definition ParticleUtilities.h:49
Definition ParticleUtilities.h:20
static const FRotation3 GetRotation(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:30
static const FVec3 & GetPosition(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:25
static const FVec3 & Position(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index)
Definition ParticleUtilities.h:32
static FVec3 & Position(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:23
static const FRotation3 Rotation(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index)
Definition ParticleUtilities.h:33
Definition ParticleUtilities.h:58
static FRotation3 GetCoMWorldRotation(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:151
static FMatrix33 GetWorldInertia(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:86
static FRigidTransform3 ParticleLocalToCoMLocal(T_PARTICLEHANDLE Particle, const FRigidTransform3 &T)
Definition ParticleUtilities.h:119
static void SetActorWorldTransform(T_PARTICLEHANDLE Particle, const FRigidTransform3 &ActorWorldT)
Definition ParticleUtilities.h:67
static FVec3 ParticleLocalToCoMLocal(T_PARTICLEHANDLE Particle, const FVec3 &P)
Definition ParticleUtilities.h:101
static FRigidTransform3 GetActorWorldTransform(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:61
static FRigidTransform3 GetCoMWorldTransform(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:162
static FMatrix33 GetWorldInvInertia(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:92
static FVec3 GetVelocityAtCoMRelativePosition(T_PARTICLEHANDLE Particle, const FVec3 &RelPos)
Definition ParticleUtilities.h:128
static void AddForceAtPositionWorld(T_PARTICLEHANDLE Particle, const FVec3 &Force, const FVec3 &Position)
Definition ParticleUtilities.h:200
static const FRigidTransform3 & ActorWorldToParticleWorld(T_PARTICLEHANDLE Particle, const FRigidTransform3 &ActorWorldT)
Definition ParticleUtilities.h:80
static void SetCoMWorldTransform(T_PARTICLEHANDLE Particle, const FVec3 &PCoM, const FRotation3 &QCoM)
Definition ParticleUtilities.h:171
static FVec3 GetCoMWorldPosition(T_PARTICLEHANDLE Particle)
Definition ParticleUtilities.h:140
static FRotation3 GetCoMWorldRotation(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index)
Definition ParticleUtilities.h:156
static void SetCoMWorldTransform(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index, const FVec3 &PCoM, const FRotation3 &QCoM)
Definition ParticleUtilities.h:180
static const FRigidTransform3 & ActorLocalToParticleLocal(T_PARTICLEHANDLE Particle, const FRigidTransform3 &ActorLocalT)
Definition ParticleUtilities.h:74
static FRotation3 ParticleLocalToCoMLocal(T_PARTICLEHANDLE Particle, const FRotation3 &Q)
Definition ParticleUtilities.h:110
static FVec3 GetPreviousVelocityAtCoMRelativePosition(T_PARTICLEHANDLE Particle, const FVec3 &RelPos)
Definition ParticleUtilities.h:134
static void AddForceAtPositionLocal(T_PARTICLEHANDLE Particle, const FVec3 &LocalForce, const FVec3 &LocalPosition)
Definition ParticleUtilities.h:190
static FVec3 GetCoMWorldPosition(TPBDRigidParticles< FReal, 3 > &Particles, const int32 Index)
Definition ParticleUtilities.h:145
Definition PBDRigidParticles.h:22
FORCEINLINE const TVector< T, d > & GetP(const int32 index) const
Definition PBDRigidParticles.h:66
FORCEINLINE const TRotation< T, d > GetQ(const int32 index) const
Definition PBDRigidParticles.h:73
const TVector< T, d > & GetX(const int32 Index) const
Definition Particles.h:156
FORCEINLINE const TRotation< T, d > & RotationOfMass(const int32 Index) const
Definition RigidParticles.h:192
FORCEINLINE const TVector< T, d > & CenterOfMass(const int32 Index) const
Definition RigidParticles.h:189
FORCEINLINE const TRotation< T, d > GetR(const int32 Index) const
Definition SimpleGeometryParticles.h:54
FMatrix33 ComputeWorldSpaceInertia(const FRotation3 &CoMRotation, const FMatrix33 &I)
Definition Utilities.h:327
Definition SkeletalMeshComponent.h:307
TRigidTransform< FReal, 3 > FRigidTransform3
Definition Core.h:22
U16 Index
Definition radfft.cpp:71