UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TaperedCapsule.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
5#include "Chaos/Core.h"
7
8namespace Chaos
9{
10 struct FTaperedCapsuleSpecializeSamplingHelper;
11
13 {
14 public:
16 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::TaperedCapsule)
17 {
18 this->bIsConvex = true;
19 }
20 FTaperedCapsule(const FVec3& X1, const FVec3& X2, const FReal InRadius1, const FReal InRadius2, const FVec3& SplitXAxis = FVec3::ZeroVector)
21 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::TaperedCapsule)
22 , Origin(X1)
23 , Axis((X2 - X1).GetSafeNormal())
24 , OneSidedPlaneNormal((FVec3f(SplitXAxis) - FVec3f(SplitXAxis).Dot(Axis)*Axis).GetSafeNormal())
25 , Height((FRealSingle)((X2 - X1).Size()))
26 , Radius1((FRealSingle)InRadius1)
27 , Radius2((FRealSingle)InRadius2)
28 , bIsOneSided(!OneSidedPlaneNormal.IsNearlyZero())
29 , LocalBoundingBox(X1, X1)
30 {
31 this->bIsConvex = true;
32 LocalBoundingBox.GrowToInclude(X2);
33 const FRealSingle MaxRadius = FMath::Max(Radius1, Radius2);
34 LocalBoundingBox = FAABB3(LocalBoundingBox.Min() - FVec3(MaxRadius), LocalBoundingBox.Max() + FVec3(MaxRadius));
35 }
37 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::TaperedCapsule)
38 , Origin(Other.Origin)
39 , Axis(Other.Axis)
40 , OneSidedPlaneNormal(Other.OneSidedPlaneNormal)
41 , Height(Other.Height)
42 , Radius1(Other.Radius1)
43 , Radius2(Other.Radius2)
44 , bIsOneSided(Other.bIsOneSided)
45 , LocalBoundingBox(Other.LocalBoundingBox)
46 {
47 this->bIsConvex = true;
48 }
50 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::TaperedCapsule)
51 , Origin(MoveTemp(Other.Origin))
52 , Axis(MoveTemp(Other.Axis))
53 , OneSidedPlaneNormal(MoveTemp(Other.OneSidedPlaneNormal))
54 , Height(Other.Height)
55 , Radius1(Other.Radius1)
56 , Radius2(Other.Radius2)
57 , bIsOneSided(Other.bIsOneSided)
58 , LocalBoundingBox(MoveTemp(Other.LocalBoundingBox))
59 {
60 this->bIsConvex = true;
61 }
63
65
73 TArray<FVec3> ComputeLocalSamplePoints(const int32 NumPoints) const;
74
83 TArray<FVec3> ComputeLocalSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints = 0, const int32 MaxPoints = 1000) const
84 {
85 return ComputeLocalSamplePoints(FMath::Clamp(static_cast<int32>(ceil(PointsPerUnitArea * GetArea(true))), MinPoints, MaxPoints));
86 }
87
95 TArray<FVec3> ComputeSamplePoints(const int32 NumPoints) const;
96
105 TArray<FVec3> ComputeSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints, const int32 MaxPoints) const
106 {
107 const int32 NumPoints = FMath::Clamp(static_cast<int32>(ceil(PointsPerUnitArea * GetArea(true))), MinPoints, MaxPoints);
108 return ComputeSamplePoints(NumPoints);
109 }
110
111 virtual const FAABB3 BoundingBox() const override { return LocalBoundingBox; }
112
113 FReal PhiWithNormal(const FVec3& x, FVec3& OutNormal) const
114 {
115 const FVec3f OriginToX = x - Origin;
117 const FVec3f ClosestPoint = Origin + Axis * DistanceAlongAxis;
118 const FRealSingle Radius = (Height > UE_SMALL_NUMBER) ? FMath::Lerp(Radius1, Radius2, DistanceAlongAxis / Height) : FMath::Max(Radius1, Radius2);
119 OutNormal = (x - ClosestPoint);
120 return OutNormal.SafeNormalize() - Radius;
121 }
122
123 FReal GetRadius1() const { return Radius1; }
124 FReal GetRadius2() const { return Radius2; }
125 FReal GetHeight() const { return Height; }
126 FReal GetSlantHeight() const { const FReal R1mR2 = Radius1-Radius2; return FMath::Sqrt(R1mR2*R1mR2 + Height*Height); }
127 FVec3 GetX1() const { return Origin; }
128 FVec3 GetX2() const { return Origin + Axis * Height; }
130 FVec3 GetOrigin() const { return GetX1(); }
131 const FVec3f& GetOriginf() const { return Origin; }
133 FVec3 GetInsertion() const { return GetX2(); }
134 FVec3 GetCenter() const { return Origin + Axis * (Height * (FRealSingle)0.5); }
135 bool IsOneSided() const { return bIsOneSided; }
136 FVec3 GetOneSidedPlaneNormal() const { return OneSidedPlaneNormal; }
137 const FVec3f& GetOneSidedPlaneNormalf() const { return OneSidedPlaneNormal; }
139 FVec3 GetCenterOfMass() const // centroid
140 {
141 const FReal R1R1 = Radius1 * Radius1;
142 const FReal R2R2 = Radius2 * Radius2;
143 const FReal R1R2 = Radius1 * Radius2;
144 // compute center of mass as a distance along the axis from the origin as the shape as the axis as a symmetry line
145 FReal TaperedSectionCenterOfMass = (Height * (R1R1 + (FReal)2.0 * R1R2 + (FReal)3.0 * R2R2) / (FReal)4.0 * (R1R1 + R1R2 + R2R2));
146 FReal Hemisphere1CenterOfMass = -((FReal)3.0 * Radius1 / (FReal)8.0);
147 FReal Hemisphere2CenterOfMass = (Height + ((FReal)3.0 * Radius2 / (FReal)8.0));
148
149 // we need to combine all 3 using relative volume ratios
150 const FReal TaperedSectionVolume = GetTaperedSectionVolume(Height, Radius1, Radius2);
151 const FReal Hemisphere1Volume = GetHemisphereVolume(Radius1);
152 const FReal Hemisphere2Volume = GetHemisphereVolume(Radius2);
154
156 return FVec3(0,0,1) * TotalCenterOfMassAlongAxis;
157 }
158 FVec3 GetAxis() const { return Axis; }
159
160 FReal GetArea(const bool IncludeEndCaps = true) const { return GetArea(Height, Radius1, Radius2, IncludeEndCaps); }
161 static FReal GetArea(const FReal Height, const FReal Radius1, const FReal Radius2, const bool IncludeEndCaps)
162 {
163 static const FReal TwoPI = UE_PI * 2;
164 FReal AreaNoCaps = (FReal)0.0;
165 if (Radius1 == Radius2)
166 {
167 AreaNoCaps = TwoPI * Radius1 * Height;
168 }
169 else
170 {
171 const FReal R1_R2 = Radius1 - Radius2;
172 AreaNoCaps = UE_PI * (Radius1 + Radius2) * FMath::Sqrt((R1_R2 * R1_R2) + (Height * Height));
173 }
174 if (IncludeEndCaps)
175 {
179 }
180 return AreaNoCaps;
181 }
182
183 FReal GetVolume() const { return GetVolume(Height, Radius1, Radius2); }
184 static FReal GetVolume(const FReal Height, const FReal Radius1, const FReal Radius2)
185 {
186 const FReal TaperedSectionVolume = GetTaperedSectionVolume(Height, Radius1, Radius2);
187 const FReal Hemisphere1Volume = GetHemisphereVolume(Radius1);
188 const FReal Hemisphere2Volume = GetHemisphereVolume(Radius2);
190 }
191
192 FMatrix33 GetInertiaTensor(const FReal Mass) const { return GetInertiaTensor(Mass, Height, Radius1, Radius2); }
193 static FMatrix33 GetInertiaTensor(const FReal Mass, const FReal Height, const FReal Radius1, const FReal Radius2)
194 {
195 // TODO(chaos) : we should actually take hemispheres in account
196 // https://www.wolframalpha.com/input/?i=conical+frustum
197 const FReal R1 = FMath::Min(Radius1, Radius2);
198 const FReal R2 = FMath::Max(Radius1, Radius2);
199 const FReal HH = Height * Height;
200 const FReal R1R1 = R1 * R1;
201 const FReal R1R2 = R1 * R2;
202 const FReal R2R2 = R2 * R2;
203
204 const FReal Num1 = (FReal)2.0 * HH * (R1R1 + (FReal)3.0 * R1R2 + (FReal)6.0 * R2R2); // 2H^2 * (R1^2 + 3R1R2 + 6R2^2)
205 const FReal Num2 = (FReal)3.0 * (R1R1 * R1R1 + R1R1 * R1R2 + R1R2 * R1R2 + R1R2 * R2R2 + R2R2 * R2R2); // 3 * (R1^4 + R1^3R2 + R1^2R2^2 + R1R2^3 + R2^4)
206 const FReal Den1 = UE_PI * (R1R1 + R1R2 + R2R2); // PI * (R1^2 + R1R2 + R2^2)
207
208 const FReal Diag12 = Mass * (Num1 + Num2) / ((FReal)20.0 * Den1);
209 const FReal Diag3 = Mass * Num2 / ((FReal)10.0 * Den1);
210
211 return FMatrix33(Diag12, Diag12, Diag3);
212 }
213
216 {
217 // since the capsule stores an axis and the InertiaTensor is assumed to be along the ZAxis
218 // we need to make sure to return the rotation of the axis from Z
219 return FRotation3::FromRotatedVector(FVec3(0, 0, 1), Axis);
220 }
221
222 virtual uint32 GetTypeHash() const override
223 {
226
228 }
229
230#if INTEL_ISPC
231 // See PerParticlePBDCollisionConstraint.cpp
232 // ISPC code has matching structs for interpreting FImplicitObjects.
233 // This is used to verify that the structs stay the same.
234 struct FISPCDataVerifier
235 {
236 static constexpr int32 OffsetOfOrigin() { return offsetof(FTaperedCapsule, Origin); }
237 static constexpr int32 SizeOfOrigin() { return sizeof(FTaperedCapsule::Origin); }
238 static constexpr int32 OffsetOfAxis() { return offsetof(FTaperedCapsule, Axis); }
239 static constexpr int32 SizeOfAxis() { return sizeof(FTaperedCapsule::Axis); }
240 static constexpr int32 OffsetOfOneSidedPlaneNormal() { return offsetof(FTaperedCapsule, OneSidedPlaneNormal); }
241 static constexpr int32 SizeOfOneSidedPlaneNormal() { return sizeof(FTaperedCapsule::OneSidedPlaneNormal); }
242 static constexpr int32 OffsetOfHeight() { return offsetof(FTaperedCapsule, Height); }
243 static constexpr int32 SizeOfHeight() { return sizeof(FTaperedCapsule::Height); }
244 static constexpr int32 OffsetOfRadius1() { return offsetof(FTaperedCapsule, Radius1); }
245 static constexpr int32 SizeOfRadius1() { return sizeof(FTaperedCapsule::Radius1); }
246 static constexpr int32 OffsetOfRadius2() { return offsetof(FTaperedCapsule, Radius2); }
247 static constexpr int32 SizeOfRadius2() { return sizeof(FTaperedCapsule::Radius2); }
248 static constexpr int32 OffsetOfIsOneSided() { return offsetof(FTaperedCapsule, bIsOneSided); }
249 static constexpr int32 SizeOfIsOneSided() { return sizeof(FTaperedCapsule::bIsOneSided); }
250 };
251 friend FISPCDataVerifier;
252#endif // #if INTEL_ISPC
253
254 private:
255 //Phi is distance from closest point on plane1
256 FReal GetRadiusAtDistance(const FReal& Phi) const
257 {
258 const FReal Alpha = Phi / Height;
259 return FMath::Lerp(Radius1, Radius2, Alpha);
260 }
261
262 static FReal GetHemisphereVolume(const FReal Radius)
263 {
264 return (FReal)2.0 * UE_PI * (Radius * Radius * Radius) / (FReal)3.0;
265 }
266
267 static FReal GetTaperedSectionVolume(const FReal Height, const FReal Radius1, const FReal Radius2)
268 {
269 static const FReal PI_OVER_3 = UE_PI / (FReal)3.0;
270 return PI_OVER_3 * Height * (Radius1 * Radius1 + Radius1 * Radius2 + Radius2 * Radius2);
271 }
272
273 FVec3f Origin, Axis;
274 FVec3f OneSidedPlaneNormal = FVec3f::ZeroVector;
275 FRealSingle Height, Radius1, Radius2;
276 bool bIsOneSided = false;
277 FAABB3 LocalBoundingBox;
278 };
279
281 {
283 TArray<FVec3>& Points, const FTaperedCapsule& Capsule,
284 const int32 NumPoints)
285 {
286 if (NumPoints <= 1 ||
287 (Capsule.GetRadius1() <= UE_KINDA_SMALL_NUMBER &&
288 Capsule.GetRadius2() <= UE_KINDA_SMALL_NUMBER))
289 {
290 const int32 Offset = Points.Num();
291 if (Capsule.GetHeight() <= UE_KINDA_SMALL_NUMBER)
292 {
293 Points.SetNumUninitialized(Offset + 1);
294 Points[Offset] = Capsule.GetCenter();
295 }
296 else
297 {
298 Points.SetNumUninitialized(Offset + 3);
299 Points[Offset + 0] = Capsule.GetOrigin();
300 Points[Offset + 1] = Capsule.GetCenter();
301 Points[Offset + 2] = Capsule.GetInsertion();
302 }
303 return;
304 }
305 ComputeGoldenSpiralPoints(Points, Capsule, NumPoints);
306 }
307
309 {
310 ComputeGoldenSpiralPoints(Points, Capsule.GetOrigin(), Capsule.GetAxis(), Capsule.GetRadius1(), Capsule.GetRadius2(), Capsule.GetHeight(), NumPoints);
311 }
312
335 static /*FORCEINLINE*/ void ComputeGoldenSpiralPoints(
336 TArray<FVec3>& Points,
337 const FVec3& Origin,
338 const FVec3& Axis,
339 const FReal Radius1,
340 const FReal Radius2,
341 const FReal Height,
342 const int32 NumPoints,
343 const int32 SpiralSeed = 0)
344 {
345 // Axis should be normalized.
346 checkSlow(FMath::Abs(Axis.Size() - 1.0) < UE_KINDA_SMALL_NUMBER);
347
348 const int32 Offset = Points.Num();
349 ComputeGoldenSpiralPointsUnoriented(Points, Radius1, Radius2, Height, NumPoints, SpiralSeed);
350
351 // At this point, Points are centered about the origin (0,0,0), built
352 // along the Z axis. Transform them to where they should be.
353 const FReal HalfHeight = Height / 2;
354 const FRotation3 Rotation = FRotation3::FromRotatedVector(FVec3(0, 0, 1), Axis);
355 checkSlow(((Origin + Axis * Height) - (Rotation.RotateVector(FVec3(0, 0, Height)) + Origin)).Size() < UE_KINDA_SMALL_NUMBER);
356 for (int32 i = Offset; i < Points.Num(); i++)
357 {
358 FVec3& Point = Points[i];
359 const FVec3 PointNew = Rotation.RotateVector(Point + FVec3(0, 0, HalfHeight)) + Origin;
360// checkSlow(FMath::Abs(FTaperedCapsule(Origin, Origin + Axis * Height, Radius1, Radius2).SignedDistance(PointNew)) < KINDA_SMALL_NUMBER);
361 Point = PointNew;
362 }
363 }
364
391 static /*FORCEINLINE*/ void ComputeGoldenSpiralPointsUnoriented(
392 TArray<FVec3>& Points,
393 const FReal Radius1,
394 const FReal Radius2,
395 const FReal Height,
396 const int32 NumPoints,
397 int32 SpiralSeed = 0
398 )
399 {
400 // Evenly distribute points between the capsule body and the end caps.
404
405 const FReal Cap1Area = FSphere::GetArea(Radius1) / (FReal)2.;
406 const FReal Cap2Area = FSphere::GetArea(Radius2) / (FReal)2.;
407 const FReal TaperedSectionArea = FTaperedCapsule::GetArea(Height, Radius1, Radius2, /*IncludeEndCaps*/ false);
410 {
411 NumPointsEndCap1 = static_cast<int32>(round(Cap1Area / AllArea * static_cast<FReal>(NumPoints)));
412 NumPointsEndCap2 = static_cast<int32>(round(Cap2Area / AllArea * static_cast<FReal>(NumPoints)));
414 }
415 else
416 {
418 NumPointsEndCap1 = NumPointsEndCap2 = (NumPoints - (NumPoints % 2)) / 2;
419 }
420
422 Points.Reserve(Points.Num() + NumPointsToAdd);
423
424 int32 Offset = Points.Num();
425 const FReal HalfHeight = Height / 2;
426 {
427 // Points vary in Z: [-Radius1-HalfHeight, -HalfHeight]
429 Points, FSphere(FVec3(0, 0, -HalfHeight), Radius1), NumPointsEndCap1, SpiralSeed);
430 SpiralSeed += Points.Num();
431
432 // Points vary in Z: [-HalfHeight, HalfHeight], about the Z axis.
434 Points, Radius1, Radius2, Height, NumPointsTaperedSection, false, SpiralSeed);
435 SpiralSeed += Points.Num();
436
437 // Points vary in Z: [HalfHeight, HalfHeight+Radius2]
439 Points, FSphere(FVec3(0, 0, HalfHeight), Radius2), NumPointsEndCap2, SpiralSeed);
440 SpiralSeed += Points.Num();
441 }
442 }
443 };
444
446 {
447 TArray<FVec3> Points;
449 Points,
450 FTaperedCapsule(Origin, Origin + Axis * Height, GetRadius1(), GetRadius2()),
451 NumPoints);
452 return Points;
453 }
454
456 {
457 TArray<FVec3> Points;
459 return Points;
460 }
461
462 template<class T>
463 using TTaperedCapsule UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FTaperedCapsule instead") = FTaperedCapsule;
464
465 template<class T>
466 using TTaperedCapsuleSpecializeSamplingHelper UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FTaperedCapsuleSpecializeSamplingHelper instead") = FTaperedCapsuleSpecializeSamplingHelper;
467
468} // namespace Chaos
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define checkSlow(expr)
Definition AssertionMacros.h:332
#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
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
#define UE_PI
Definition UnrealMathUtility.h:129
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ImplicitObject.h:111
bool bIsConvex
Definition ImplicitObject.h:572
Definition TaperedCapsule.h:13
static FMatrix33 GetInertiaTensor(const FReal Mass, const FReal Height, const FReal Radius1, const FReal Radius2)
Definition TaperedCapsule.h:193
TArray< FVec3 > ComputeSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints, const int32 MaxPoints) const
Definition TaperedCapsule.h:105
~FTaperedCapsule()
Definition TaperedCapsule.h:62
const FVec3f & GetOriginf() const
Definition TaperedCapsule.h:131
FReal GetRadius1() const
Definition TaperedCapsule.h:123
FVec3 GetInsertion() const
Definition TaperedCapsule.h:133
FVec3 GetCenter() const
Definition TaperedCapsule.h:134
TArray< FVec3 > ComputeSamplePoints(const int32 NumPoints) const
Definition TaperedCapsule.h:455
virtual const FAABB3 BoundingBox() const override
Definition TaperedCapsule.h:111
FTaperedCapsule(const FVec3 &X1, const FVec3 &X2, const FReal InRadius1, const FReal InRadius2, const FVec3 &SplitXAxis=FVec3::ZeroVector)
Definition TaperedCapsule.h:20
FVec3 GetX1() const
Definition TaperedCapsule.h:127
FVec3 GetAxis() const
Definition TaperedCapsule.h:158
FTaperedCapsule(const FTaperedCapsule &Other)
Definition TaperedCapsule.h:36
virtual uint32 GetTypeHash() const override
Definition TaperedCapsule.h:222
FVec3 GetOneSidedPlaneNormal() const
Definition TaperedCapsule.h:136
FReal GetRadius2() const
Definition TaperedCapsule.h:124
FReal PhiWithNormal(const FVec3 &x, FVec3 &OutNormal) const
Definition TaperedCapsule.h:113
const FVec3f & GetOneSidedPlaneNormalf() const
Definition TaperedCapsule.h:137
static FReal GetVolume(const FReal Height, const FReal Radius1, const FReal Radius2)
Definition TaperedCapsule.h:184
FReal GetVolume() const
Definition TaperedCapsule.h:183
FTaperedCapsule()
Definition TaperedCapsule.h:15
FReal GetSlantHeight() const
Definition TaperedCapsule.h:126
TArray< FVec3 > ComputeLocalSamplePoints(const int32 NumPoints) const
Definition TaperedCapsule.h:445
FVec3 GetX2() const
Definition TaperedCapsule.h:128
FRotation3 GetRotationOfMass() const
Definition TaperedCapsule.h:214
FReal GetArea(const bool IncludeEndCaps=true) const
Definition TaperedCapsule.h:160
FMatrix33 GetInertiaTensor(const FReal Mass) const
Definition TaperedCapsule.h:192
static FRotation3 GetRotationOfMass(const FVec3 &Axis)
Definition TaperedCapsule.h:215
static constexpr EImplicitObjectType StaticType()
Definition TaperedCapsule.h:64
bool IsOneSided() const
Definition TaperedCapsule.h:135
FTaperedCapsule(FTaperedCapsule &&Other)
Definition TaperedCapsule.h:49
TArray< FVec3 > ComputeLocalSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints=0, const int32 MaxPoints=1000) const
Definition TaperedCapsule.h:83
static FReal GetArea(const FReal Height, const FReal Radius1, const FReal Radius2, const bool IncludeEndCaps)
Definition TaperedCapsule.h:161
FVec3 GetOrigin() const
Definition TaperedCapsule.h:130
FVec3 GetCenterOfMass() const
Definition TaperedCapsule.h:139
FReal GetHeight() const
Definition TaperedCapsule.h:125
FORCEINLINE const TVector< T, d > & Max() const
Definition AABB.h:596
FORCEINLINE void GrowToInclude(const TVector< T, d > &V)
Definition AABB.h:393
FORCEINLINE const TVector< T, d > & Min() const
Definition AABB.h:595
T GetArea() const
Definition Sphere.h:196
Definition Vector.h:407
static FRealSingle DotProduct(const TVector< FRealSingle, 3 > &V1, const TVector< FRealSingle, 3 > &V2)
Definition Vector.h:446
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
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
@ TaperedCapsule
Definition ImplicitObjectType.h:29
Definition SkeletalMeshComponent.h:307
TSphere< FReal, 3 > FSphere
Definition ImplicitObject.h:36
TVector< FRealSingle, 3 > FVec3f
Definition Core.h:27
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
FRealDouble FReal
Definition Real.h:22
PMatrix< FReal, 3, 3 > FMatrix33
Definition Core.h:20
float FRealSingle
Definition Real.h:14
TVector< FReal, 3 > FVec3
Definition Core.h:17
TAABB< FReal, 3 > FAABB3
Definition ImplicitObject.h:34
uint32 GetTypeHash(const TBox< T > &Box)
Definition Box.h:1008
Definition TaperedCapsule.h:281
static void ComputeGoldenSpiralPoints(TArray< FVec3 > &Points, const FVec3 &Origin, const FVec3 &Axis, const FReal Radius1, const FReal Radius2, const FReal Height, const int32 NumPoints, const int32 SpiralSeed=0)
Definition TaperedCapsule.h:335
static void ComputeGoldenSpiralPointsUnoriented(TArray< FVec3 > &Points, const FReal Radius1, const FReal Radius2, const FReal Height, const int32 NumPoints, int32 SpiralSeed=0)
Definition TaperedCapsule.h:391
static FORCEINLINE void ComputeGoldenSpiralPoints(TArray< FVec3 > &Points, const FTaperedCapsule &Capsule, const int32 NumPoints)
Definition TaperedCapsule.h:308
static FORCEINLINE void ComputeSamplePoints(TArray< FVec3 > &Points, const FTaperedCapsule &Capsule, const int32 NumPoints)
Definition TaperedCapsule.h:282
static void ComputeGoldenSpiralPointsUnoriented(TArray< FVec3 > &Points, const FReal Radius1, const FReal Radius2, const FReal Height, const int32 NumPoints, const bool IncludeEndCaps=true, int32 SpiralSeed=0)
Definition TaperedCylinder.h:487
static constexpr UE_FORCEINLINE_HINT T Lerp(const T &A, const T &B, const U &Alpha)
Definition UnrealMathUtility.h:1116
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
static CORE_API const TVector< FRealSingle > ZeroVector
Definition Vector.h:79