UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Capsule.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Cylinder.h"
5#include "Chaos/GJKShape.h"
6#include "Chaos/ImplicitFwd.h"
9#include "Chaos/Raycasts.h"
10#include "Chaos/Sphere.h"
11#include "Chaos/Segment.h"
12#include "ChaosArchive.h"
13
14#include "Math/VectorRegister.h"
15
17
18namespace Chaos
19{
20 struct FCapsuleSpecializeSamplingHelper;
21
22 class FCapsule final : public FImplicitObject
23 {
24 public:
27
29 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::Capsule)
30 {}
31 FCapsule(const FVec3& x1, const FVec3& x2, const FReal Radius)
32 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::Capsule)
33 , MSegment(x1, x2)
34 {
35 SetRadius(static_cast<FRealSingle>(Radius));
36 }
37
39 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::Capsule)
40 , MSegment(Other.MSegment)
41 {
42 SetRadius(Other.GetRadiusf());
43 }
44
46 : FImplicitObject(EImplicitObject::FiniteConvex, ImplicitObjectType::Capsule)
47 , MSegment(MoveTemp(Other.MSegment))
48 {
49 SetRadius(Other.GetRadiusf());
50 }
51
53 {
54 this->Type = InSteal.Type;
55 this->bIsConvex = InSteal.bIsConvex;
56 this->bDoCollide = InSteal.bDoCollide;
57 this->bHasBoundingBox = InSteal.bHasBoundingBox;
58
59 MSegment = MoveTemp(InSteal.MSegment);
60 SetRadius(InSteal.GetRadiusf());
61
62 return *this;
63 }
64
66
68
69 static FCapsule NewFromOriginAndAxis(const FVec3& Origin, const FVec3& Axis, const FReal Height, const FReal Radius)
70 {
71 auto X1 = Origin + Axis * Radius;
72 auto X2 = Origin + Axis * (Radius + Height);
73 return FCapsule(X1, X2, Radius);
74 }
75
76 UE_DEPRECATED(5.6, "Please Use GetRadiusf instead.")
77 virtual FReal GetRadius() const override
78 {
79 return static_cast<FReal>(Margin);
80 }
81
82 virtual FRealSingle GetRadiusf() const override
83 {
84 return Margin;
85 }
86
92 TArray<FVec3> ComputeLocalSamplePoints(const int32 NumPoints) const;
93
100 TArray<FVec3> ComputeLocalSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints = 0, const int32 MaxPoints = 1000) const
101 { return ComputeLocalSamplePoints(FMath::Clamp(static_cast<int32>(ceil(PointsPerUnitArea * GetArea())), MinPoints, MaxPoints)); }
102
106 TArray<FVec3> ComputeSamplePoints(const int32 NumPoints) const;
107
114 TArray<FVec3> ComputeSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints = 0, const int32 MaxPoints = 1000) const
115 { return ComputeSamplePoints(FMath::Clamp(static_cast<int32>(ceil(PointsPerUnitArea * GetArea())), MinPoints, MaxPoints)); }
116
117 virtual FReal PhiWithNormal(const FVec3& x, FVec3& Normal) const override
118 {
119 FVec3 xf = x;
123 return Normal.SafeNormalize() - GetRadiusf();
124 }
125
126 virtual const FAABB3 BoundingBox() const override
127 {
128 FAABB3 Box = FAABB3(MSegment.BoundingBox());
129 Box.Thicken(GetRadiusf());
130 return Box;
131 }
132
134 {
135 const FVec3 X1 = Transform.TransformPositionNoScale(FVec3(MSegment.GetX1()));
136 const FVec3 X2 = Transform.TransformPositionNoScale(FVec3(MSegment.GetX2()));
137 const FVec3 MinSegment = X1.ComponentwiseMin(X2);
138 const FVec3 MaxSegment = X1.ComponentwiseMax(X2);
139
140 const FVec3 RadiusV = FVec3(GetRadiusf());
141 return FAABB3(MinSegment - RadiusV, MaxSegment + RadiusV);
142 }
143
144 static bool RaycastFast(FReal MRadius, FReal MHeight, const FVec3& MVector, const FVec3& X1, const FVec3& X2, const FVec3& StartPoint, const FVec3& Dir, const FReal Length, const FReal Thickness, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex)
145 {
146 OutFaceIndex = INDEX_NONE;
147 return Raycasts::RayCapsule(StartPoint, Dir, Length, Thickness, MRadius, MHeight, MVector, X1, X2, OutTime, OutPosition, OutNormal);
148 }
149
150 virtual bool Raycast(const FVec3& StartPoint, const FVec3& Dir, const FReal Length, const FReal Thickness, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex) const override
151 {
152 return RaycastFast(GetRadiusf(), GetHeightf(), GetAxis(), GetX1f(), GetX2f(), StartPoint, Dir, Length, Thickness, OutTime, OutPosition, OutNormal, OutFaceIndex);
153 }
154
155 FORCEINLINE FVec3 Support(const FVec3& Direction, const FReal Thickness, int32& VertexIndex) const
156 {
157 return MSegment.Support(FVec3f(Direction), GetRadiusf() + FRealSingle(Thickness), VertexIndex);
158 }
159
160 FORCEINLINE FVec3f Supportf(const FVec3f& Direction, const FRealSingle Thickness, int32& VertexIndex) const
161 {
162 return MSegment.Support(Direction, GetRadiusf() + Thickness, VertexIndex);
163 }
164
165 FORCEINLINE FVec3 SupportCore(const FVec3& Direction, const FReal InMargin, FReal* OutSupportDelta, int32& VertexIndex) const
166 {
167 // NOTE: Ignores InMargin, assumes Radius
168 return MSegment.SupportCore(FVec3f(Direction), VertexIndex);
169 }
170
172 {
173 // NOTE: Ignores InMargin, assumes Radius
174 return MSegment.SupportCore(Direction, VertexIndex);
175 }
176
178 {
179 // NOTE: Ignores InMargin, assumes Radius
181 VectorStoreFloat3(Direction, &DirectionVec3);
182 int32 VertexIndex = INDEX_NONE;
183 FVec3 SupportVert = MSegment.SupportCore(DirectionVec3, VertexIndex);
185 }
186
187
188 FORCEINLINE FVec3 SupportCoreScaled(const FVec3& Direction, const FReal InMargin, const FVec3& Scale, FReal* OutSupportDelta, int32& VertexIndex) const
189 {
190 // NOTE: Ignores InMargin, assumes Radius
191 // Note: Scaling the direction vector like this, might not seem quite right, but works due to the commutativity of the single dot product that follows
193 const FVec3 Result = SupportCore(Scale * Direction, GetMarginf(), &SupportDeltaSingle, VertexIndex) * Scale;
194 if (OutSupportDelta)
195 {
197 }
198 return Result;
199 }
200
202 {
205 MSegment.Serialize(Ar);
206
207 // Radius is now stored in the base class Margin
209 Ar << ArRadius;
210 SetRadius(ArRadius);
211
213 {
214 FAABB3 DummyBox; //no longer store this, computed on demand
216 }
217 }
218
231
232 virtual FString ToString() const override
233 {
234 return FString::Printf(TEXT("Capsule: Height: %f Radius: %f"), GetHeightf(), GetRadiusf());
235 }
236
238 {
239 return Chaos::FImplicitObjectPtr(new FCapsule(*this));
240 }
241
243 {
245 }
246
247 UE_DEPRECATED(5.6, "Use GetHeightf instead")
248 FReal GetHeight() const { return FReal(MSegment.GetLength()); }
249 FRealSingle GetHeightf() const { return MSegment.GetLength(); }
251 UE_DEPRECATED(5.6, "Use GetOriginf instead")
252 const FVec3 GetOrigin() const { return GetX1f() + GetAxisf() * -GetRadiusf(); }
253 const FVec3f GetOriginf() const { return GetX1f() + GetAxisf() * -GetRadiusf(); }
255 const FVec3f GetInsertion() const { return GetX1f() + GetAxisf() * (GetHeightf() + GetRadiusf()); }
256 UE_DEPRECATED(5.6, "Use GetCenterf instead")
257 FVec3 GetCenter() const { return MSegment.GetCenter(); }
258 FVec3f GetCenterf() const { return MSegment.GetCenter(); }
260 FVec3 GetCenterOfMass() const { return GetCenterf(); }
261 FVec3f GetCenterOfMassf() const { return GetCenterf(); }
262 const FVec3 GetAxis() const { return MSegment.GetAxis(); }
263 UE_DEPRECATED(5.6, "Use GetX1f instead")
264 const FVec3 GetX1() const { return MSegment.GetX1(); }
265 UE_DEPRECATED(5.6, "Use GetX2f instead")
266 FVec3 GetX2() const { return MSegment.GetX2(); }
267 const FVec3f GetAxisf() const { return MSegment.GetAxis(); }
268 const FVec3f GetX1f() const { return MSegment.GetX1(); }
269 FVec3f GetX2f() const { return MSegment.GetX2(); }
271
272 FReal GetArea() const { return GetArea(GetHeightf(), GetRadiusf()); }
273 static FReal GetArea(const FReal Height, const FReal Radius)
274 {
275 static const FReal PI2 = 2.f * UE_PI;
276 return PI2 * Radius * (Height + 2.f * Radius);
277 }
278
280 static FReal GetVolume(const FReal Height, const FReal Radius) { static const FReal FourThirds = 4.0f / 3.0f; return UE_PI * Radius * Radius * (Height + FourThirds * Radius); }
281
283 static FMatrix33 GetInertiaTensor(const FReal Mass, const FReal Height, const FReal Radius)
284 {
285 // https://www.wolframalpha.com/input/?i=capsule&assumption=%7B%22C%22,+%22capsule%22%7D+-%3E+%7B%22Solid%22%7D
286 const FReal R = FMath::Clamp(Radius, (FReal)0., TNumericLimits<FReal>::Max());
287 const FReal H = FMath::Clamp(Height, (FReal)0., TNumericLimits<FReal>::Max());
288 const FReal RR = R * R;
289 const FReal HH = H * H;
290
291 // (5H^3 + 20*H^2R + 45HR^2 + 32R^3) / (60H + 80R)
292 const FReal Diag12 = static_cast<FReal>(Mass * (5.*HH*H + 20.*HH*R + 45.*H*RR + 32.*RR*R) / (60.*H + 80.*R));
293 // (R^2 * (15H + 16R) / (30H +40R))
294 const FReal Diag3 = static_cast<FReal>(Mass * (RR * (15.*H + 16.*R)) / (30.*H + 40.*R));
295
296 return FMatrix33(Diag12, Diag12, Diag3);
297 }
298
301 {
302 // since the capsule stores an axis and the InertiaTensor is assumed to be along the ZAxis
303 // we need to make sure to return the rotation of the axis from Z
304 return FRotation3::FromRotatedVector(FVec3(0, 0, 1), Axis);
305 }
306
307 virtual uint32 GetTypeHash() const override
308 {
310 }
311
313 {
314 FVec3 P0 = GetX1f();
315 FVec3 P1 = GetX2f();
317 return EdgePosition;
318 }
319
320
321 // The number of vertices that make up the corners of the specified face
322 // In the case of a capsule the segment will act as a degenerate face
323 // Used for manifold generation
324 int32 NumPlaneVertices(int32 PlaneIndex) const
325 {
326 return 2;
327 }
328
329 // Returns a winding order multiplier used in the manifold clipping and required when we have negative scales (See ImplicitObjectScaled)
330 // Not used for capsules
331 // Used for manifold generation
333 {
334 ensure(false);
335 return 1.0f;
336 }
337
338 // Get the vertex at the specified index (e.g., indices from GetPlaneVertexs)
339 // Used for manifold generation
340 const FVec3 GetVertex(int32 VertexIndex) const
341 {
342 FVec3 Result(0);
343
344 switch (VertexIndex)
345 {
346 case 0:
347 Result = GetX1f(); break;
348 case 1:
349 Result = GetX2f(); break;
350 }
351
352 return Result;
353 }
354
355 // Get the index of the plane that most opposes the normal
356 // not applicable for capsules
358 {
359 return 0;
360 }
361
363 {
364 return 0;
365 }
366
367 // Get the vertex index of one of the vertices making up the corners of the specified face
368 // Used for manifold generation
370 {
371 return PlaneVertexIndex;
372 }
373
374 // Get the plane at the specified index (e.g., indices from FindVertexPlanes)
379
381 {
382 OutN = FVec3(0);
383 OutX = FVec3(0);
384 }
385
386 // Get an array of all the plane indices that belong to a vertex (up to MaxVertexPlanes).
387 // Returns the number of planes found.
389 {
390 return 0;
391 }
392
393 // Get up to the 3 plane indices that belong to a vertex
394 // Returns the number of planes found.
396 {
397 return 0;
398 }
399
400 // Capsules have no planes
401 // Used for manifold generation
402 int32 NumPlanes() const { return 0; }
403
404#if INTEL_ISPC
405 // See PerParticlePBDCollisionConstraint.cpp
406 // ISPC code has matching structs for interpreting FImplicitObjects.
407 // This is used to verify that the structs stay the same.
408 struct FISPCDataVerifier
409 {
410 static constexpr int32 OffsetOfMSegment() { return offsetof(FCapsule, MSegment); }
411 static constexpr int32 SizeOfMSegment() { return sizeof(FCapsule::MSegment); }
412 };
413 friend FISPCDataVerifier;
414#endif // #if INTEL_ISPC
415
416 private:
417 void SetRadius(FRealSingle InRadius) { SetMargin(InRadius); }
418
419 TSegment<FRealSingle> MSegment;
420 };
421
423 {
424 static FORCEINLINE void ComputeSamplePoints(TArray<FVec3>& Points, const FCapsule& Capsule, const int32 NumPoints)
425 {
426 if (NumPoints <= 1 || Capsule.GetRadiusf() <= UE_SMALL_NUMBER)
427 {
428 const int32 Offset = Points.Num();
429 if (Capsule.GetHeightf() <= UE_SMALL_NUMBER)
430 {
431 Points.SetNumUninitialized(Offset + 1);
432 Points[Offset] = Capsule.GetCenterf();
433 }
434 else
435 {
436 Points.SetNumUninitialized(Offset + 3);
437 Points[0] = Capsule.GetOriginf();
438 Points[1] = Capsule.GetCenterf();
439 Points[2] = Capsule.GetInsertion();
440 }
441 return;
442 }
443 ComputeGoldenSpiralPoints(Points, Capsule, NumPoints);
444 }
445
446 static FORCEINLINE void ComputeGoldenSpiralPoints(TArray<FVec3>& Points, const FCapsule& Capsule, const int32 NumPoints)
447 { ComputeGoldenSpiralPoints(Points, Capsule.GetOriginf(), Capsule.GetAxisf(), Capsule.GetHeightf(), Capsule.GetRadiusf(), NumPoints); }
448
450 TArray<FVec3>& Points,
451 const FVec3& Origin,
452 const FVec3& Axis,
453 const FReal Height,
454 const FReal Radius,
455 const int32 NumPoints)
456 {
457 // Axis should be normalized.
458 checkSlow(FMath::Abs(Axis.Size() - 1.0) < UE_KINDA_SMALL_NUMBER);
459
460 // Evenly distribute points between the capsule body and the end caps.
463 const FReal CapArea = 4 * UE_PI * Radius * Radius;
464 const FReal CylArea = static_cast<FReal>(2.0 * UE_PI * Radius * Height);
466 {
467 const FReal AllArea = CylArea + CapArea;
468 NumPointsCylinder = static_cast<int32>(round(CylArea / AllArea * static_cast<FReal>(NumPoints)));
469 NumPointsCylinder += (NumPoints - NumPointsCylinder) % 2;
470 NumPointsEndCap = (NumPoints - NumPointsCylinder) / 2;
471 }
472 else
473 {
475 NumPointsEndCap = (NumPoints - (NumPoints % 2)) / 2;
476 }
478 Points.Reserve(Points.Num() + NumPointsToAdd);
479
480 const int32 Offset = Points.Num();
481 const FReal HalfHeight = Height / 2;
482 {
483 // Points vary in Z: [-Radius-HalfHeight, -HalfHeight]
485 Points, FSphere(FVec3(0, 0, -HalfHeight), Radius), NumPointsEndCap, Points.Num());
486#if 0
487 {
488 FSphere Sphere(FVec3(0, 0, -HalfHeight), Radius);
489 for(int32 i=Offset; i < Points.Num(); i++)
490 {
491 const FVec3& Pt = Points[i];
492 const FReal Phi = Sphere.SignedDistance(Pt);
493 checkSlow(FMath::Abs(Phi) < KINDA_SMALL_NUMBER);
494 checkSlow(Pt[2] > -Radius - HalfHeight - KINDA_SMALL_NUMBER && Pt[2] < -HalfHeight + KINDA_SMALL_NUMBER);
495 }
496 }
497#endif
498 // Points vary in Z: [-HalfHeight, HalfHeight], about the Z axis.
500 Points, Radius, Height, NumPointsCylinder, false, Points.Num());
501#if 0
502 {
503 TCylinder<FReal> Cylinder(FVec3(0, 0, -HalfHeight), FVec3(0, 0, HalfHeight), Radius);
504 for(int32 i=TmpOffset; i < Points.Num(); i++)
505 {
506 const FVec3& Pt = Points[i];
507 const FReal Phi = Cylinder.SignedDistance(Pt);
508 checkSlow(FMath::Abs(Phi) < KINDA_SMALL_NUMBER);
509 checkSlow(Pt[2] > -HalfHeight - KINDA_SMALL_NUMBER && Pt[2] < HalfHeight + KINDA_SMALL_NUMBER);
510 }
511 }
512#endif
513 // Points vary in Z: [HalfHeight, HalfHeight+Radius]
515 Points, FSphere(FVec3(0, 0, HalfHeight), Radius), NumPointsEndCap, Points.Num());
516#if 0
517 {
518 FSphere Sphere(FVec3(0, 0, HalfHeight), Radius);
519 for(int32 i=TmpOffset; i < Points.Num(); i++)
520 {
521 const FVec3& Pt = Points[i];
522 const FReal Phi = Sphere.SignedDistance(Pt);
523 checkSlow(FMath::Abs(Phi) < KINDA_SMALL_NUMBER);
524 checkSlow(Pt[2] > HalfHeight - KINDA_SMALL_NUMBER && Pt[2] < HalfHeight + Radius + KINDA_SMALL_NUMBER);
525 }
526 }
527#endif
528#if 0
529 {
530 FCapsule(FVec3(0, 0, -HalfHeight), FVec3(0, 0, HalfHeight), Radius);
531 for(int32 i=Offset; i < Points.Num(); i++)
532 {
533 const FVec3& Pt = Points[i];
534 const FReal Phi = Cylinder.SignedDistance(Pt);
535 checkSlow(FMath::Abs(Phi) < KINDA_SMALL_NUMBER);
536 }
537 }
538#endif
539 }
540
541 const FRotation3 Rotation = FRotation3::FromRotatedVector(FVec3(0, 0, 1), Axis);
542 checkSlow(((Origin + Axis * (Height + Radius * 2)) - (Rotation.RotateVector(FVec3(0, 0, Height + Radius * 2)) + Origin)).Size() < UE_KINDA_SMALL_NUMBER);
543 for (int32 i = Offset; i < Points.Num(); i++)
544 {
545 FVec3& Point = Points[i];
546 const FVec3 PointNew = Rotation.RotateVector(Point + FVec3(0, 0, HalfHeight + Radius)) + Origin;
547 checkSlow(FMath::Abs(FCapsule::NewFromOriginAndAxis(Origin, Axis, Height, Radius).SignedDistance(PointNew)) < UE_KINDA_SMALL_NUMBER);
548 Point = PointNew;
549 }
550 }
551 };
552
554 {
555 TArray<FVec3> Points;
556 const FVec3f Mid = GetCenterf();
557 const FCapsule Capsule(GetX1f() - Mid, GetX1f() + (GetAxisf() * GetHeightf()) - Mid, GetRadiusf());
559 return Points;
560 }
561
563 {
564 TArray<FVec3> Points;
566 return Points;
567 }
568
569 template<class T>
570 using TCapsule = FCapsule; // AABB<> is still using TCapsule<> so no deprecation message for now
571
572 template<class T>
573 using TCapsuleSpecializeSamplingHelper UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FCapsuleSpecializeSamplingHelper instead") = FCapsuleSpecializeSamplingHelper;
574
575} // namespace Chaos
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
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
FORCEINLINE VectorRegister4Float MakeVectorRegister(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:195
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloatFromDouble(const VectorRegister4Double &Vec4d)
Definition UnrealMathFPU.h:262
#define UE_PI
Definition UnrealMathUtility.h:129
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
#define KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:67
#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 Capsule.h:23
static constexpr EImplicitObjectType StaticType()
Definition Capsule.h:67
static FReal GetVolume(const FReal Height, const FReal Radius)
Definition Capsule.h:280
FVec3f GetCenterf() const
Definition Capsule.h:258
FORCEINLINE FVec3f SupportCore(const FVec3f &Direction, const FRealSingle InMargin, FRealSingle *OutSupportDelta, int32 &VertexIndex) const
Definition Capsule.h:171
virtual FRealSingle GetRadiusf() const override
Definition Capsule.h:82
FRotation3 GetRotationOfMass() const
Definition Capsule.h:299
int32 GetMostOpposingPlane(const FVec3 &Normal) const
Definition Capsule.h:357
FORCEINLINE FVec3f Supportf(const FVec3f &Direction, const FRealSingle Thickness, int32 &VertexIndex) const
Definition Capsule.h:160
const FVec3 GetX1() const
Definition Capsule.h:264
~FCapsule()
Definition Capsule.h:65
int32 GetPlaneVertex(int32 PlaneIndex, int32 PlaneVertexIndex) const
Definition Capsule.h:369
FCapsule & operator=(FCapsule &&InSteal)
Definition Capsule.h:52
virtual uint32 GetTypeHash() const override
Definition Capsule.h:307
FORCEINLINE VectorRegister4Float SupportCoreSimd(const VectorRegister4Float &Direction, const FReal InMargin) const
Definition Capsule.h:177
TSegment< FReal > GetSegment() const
Definition Capsule.h:270
TArray< FVec3 > ComputeSamplePoints(const int32 NumPoints) const
Definition Capsule.h:562
FORCEINLINE FVec3 Support(const FVec3 &Direction, const FReal Thickness, int32 &VertexIndex) const
Definition Capsule.h:155
virtual const FAABB3 BoundingBox() const override
Definition Capsule.h:126
virtual FReal PhiWithNormal(const FVec3 &x, FVec3 &Normal) const override
Definition Capsule.h:117
TArray< FVec3 > ComputeLocalSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints=0, const int32 MaxPoints=1000) const
Definition Capsule.h:100
const FVec3f GetOriginf() const
Definition Capsule.h:253
int32 NumPlaneVertices(int32 PlaneIndex) const
Definition Capsule.h:324
const FVec3 GetVertex(int32 VertexIndex) const
Definition Capsule.h:340
static FMatrix33 GetInertiaTensor(const FReal Mass, const FReal Height, const FReal Radius)
Definition Capsule.h:283
FCapsule(const FCapsule &Other)
Definition Capsule.h:38
static FReal GetArea(const FReal Height, const FReal Radius)
Definition Capsule.h:273
FVec3 GetCenter() const
Definition Capsule.h:257
int32 FindVertexPlanes(int32 VertexIndex, int32 *OutVertexPlanes, int32 MaxVertexPlanes) const
Definition Capsule.h:388
virtual FString ToString() const override
Definition Capsule.h:232
FReal GetArea() const
Definition Capsule.h:272
virtual Chaos::FImplicitObjectPtr CopyGeometry() const override
Definition Capsule.h:237
FORCEINLINE FVec3 SupportCoreScaled(const FVec3 &Direction, const FReal InMargin, const FVec3 &Scale, FReal *OutSupportDelta, int32 &VertexIndex) const
Definition Capsule.h:188
FCapsule(FCapsule &&Other)
Definition Capsule.h:45
const FVec3f GetInsertion() const
Definition Capsule.h:255
FReal GetHeight() const
Definition Capsule.h:248
virtual FName GetTypeName() const
Definition ImplicitObject.h:414
FVec3f GetCenterOfMassf() const
Definition Capsule.h:261
FVec3f GetX2f() const
Definition Capsule.h:269
FORCEINLINE void SerializeImp(FArchive &Ar)
Definition Capsule.h:201
virtual FReal GetRadius() const override
Definition Capsule.h:77
FORCEINLINE FVec3 SupportCore(const FVec3 &Direction, const FReal InMargin, FReal *OutSupportDelta, int32 &VertexIndex) const
Definition Capsule.h:165
static FRotation3 GetRotationOfMass(const FVec3 &Axis)
Definition Capsule.h:300
TArray< FVec3 > ComputeLocalSamplePoints(const int32 NumPoints) const
Definition Capsule.h:553
virtual bool Raycast(const FVec3 &StartPoint, const FVec3 &Dir, const FReal Length, const FReal Thickness, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex) const override
Definition Capsule.h:150
virtual FAABB3 CalculateTransformedBounds(const FRigidTransform3 &Transform) const override
Definition Capsule.h:133
const FVec3f GetAxisf() const
Definition Capsule.h:267
int32 NumPlanes() const
Definition Capsule.h:402
FVec3 GetCenterOfMass() const
Definition Capsule.h:260
int32 GetMostOpposingPlaneScaled(const FVec3 &Normal, const FVec3 &Scale) const
Definition Capsule.h:362
FORCEINLINE FReal GetWindingOrder() const
Definition Capsule.h:332
static FCapsule NewFromOriginAndAxis(const FVec3 &Origin, const FVec3 &Axis, const FReal Height, const FReal Radius)
Definition Capsule.h:69
FMatrix33 GetInertiaTensor(const FReal Mass) const
Definition Capsule.h:282
virtual void Serialize(FChaosArchive &Ar) override
Definition Capsule.h:219
const TPlaneConcrete< FReal, 3 > GetPlane(int32 FaceIndex) const
Definition Capsule.h:375
const FVec3 GetAxis() const
Definition Capsule.h:262
void GetPlaneNX(const int32 FaceIndex, FVec3 &OutN, FVec3 &OutX) const
Definition Capsule.h:380
TArray< FVec3 > ComputeSamplePoints(const FReal PointsPerUnitArea, const int32 MinPoints=0, const int32 MaxPoints=1000) const
Definition Capsule.h:114
FCapsule()
Definition Capsule.h:28
virtual Chaos::FImplicitObjectPtr CopyGeometryWithScale(const FVec3 &Scale) const override
Definition Capsule.h:242
static bool RaycastFast(FReal MRadius, FReal MHeight, const FVec3 &MVector, const FVec3 &X1, const FVec3 &X2, const FVec3 &StartPoint, const FVec3 &Dir, const FReal Length, const FReal Thickness, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex)
Definition Capsule.h:144
const FVec3f GetX1f() const
Definition Capsule.h:268
const FVec3 GetOrigin() const
Definition Capsule.h:252
FRealSingle GetHeightf() const
Definition Capsule.h:249
FVec3 GetClosestEdgePosition(int32 PlaneIndexHint, const FVec3 &Position) const
Definition Capsule.h:312
FVec3 GetX2() const
Definition Capsule.h:266
FReal GetVolume() const
Definition Capsule.h:279
FCapsule(const FVec3 &x1, const FVec3 &x2, const FReal Radius)
Definition Capsule.h:31
int32 GetVertexPlanes3(int32 VertexIndex, int32 &PlaneIndex0, int32 &PlaneIndex1, int32 &PlaneIndex2) const
Definition Capsule.h:395
Definition ChaosArchive.h:364
Definition ChaosArchive.h:167
Definition ImplicitObject.h:111
bool bHasBoundingBox
Definition ImplicitObject.h:574
CHAOS_API FReal SignedDistance(const FVec3 &x) const
Definition ImplicitObject.cpp:105
FRealSingle Margin
Definition ImplicitObject.h:571
EImplicitObjectType Type
Definition ImplicitObject.h:585
bool bDoCollide
Definition ImplicitObject.h:573
virtual FName GetTypeName() const
Definition ImplicitObject.h:414
CHAOS_API void SerializeImp(FArchive &Ar)
Definition ImplicitObject.cpp:337
void SetMargin(FReal InMargin)
Definition ImplicitObject.h:567
bool bIsConvex
Definition ImplicitObject.h:572
virtual FRealSingle GetMarginf() const
Definition ImplicitObject.h:212
static void SerializeAsAABB(FArchive &Ar, TAABB< T, d > &AABB)
Definition Box.h:467
Definition CorePlane.h:12
Definition CoreSegment.h:10
Definition Vector.h:407
static FRealSingle DotProduct(const TVector< FRealSingle, 3 > &V1, const TVector< FRealSingle, 3 > &V2)
Definition Vector.h:446
FRealSingle Min() const
Definition Vector.h:523
Definition Archive.h:1208
virtual CORE_API void UsingCustomVersion(const struct FGuid &Guid)
Definition Archive.cpp:590
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
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
Definition UniquePtr.h:107
@ Capsule
Definition ImplicitObjectType.h:16
bool RayCapsule(const FVec3 &RayStart, const FVec3 &RayDir, const FReal RayLength, const FReal RayThickness, FReal CapsuleRadius, FReal CapsuleHeight, const FVec3 &CapsuleAxis, const FVec3 &CapsuleX1, const FVec3 &CapsuleX2, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal)
Definition Raycasts.cpp:181
Definition SkeletalMeshComponent.h:307
TSphere< FReal, 3 > FSphere
Definition ImplicitObject.h:36
TVector< FRealSingle, 3 > FVec3f
Definition Core.h:27
TRefCountPtr< FImplicitObject > FImplicitObjectPtr
Definition ImplicitFwd.h:33
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
static FORCEINLINE void ComputeSamplePoints(TArray< FVec3 > &Points, const FCapsule &Capsule, const int32 NumPoints)
Definition Capsule.h:424
static FORCEINLINE void ComputeGoldenSpiralPoints(TArray< FVec3 > &Points, const FVec3 &Origin, const FVec3 &Axis, const FReal Height, const FReal Radius, const int32 NumPoints)
Definition Capsule.h:449
static FORCEINLINE void ComputeGoldenSpiralPoints(TArray< FVec3 > &Points, const FCapsule &Capsule, const int32 NumPoints)
Definition Capsule.h:446
static FORCEINLINE void ComputeGoldenSpiralPointsUnoriented(TArray< FVec3 > &Points, const FReal Radius, const FReal Height, const int32 NumPoints, const bool IncludeEndCaps=true, int32 SpiralSeed=0)
Definition Cylinder.h:368
CORE_API static const FGuid GUID
Definition ExternalPhysicsCustomObjectVersion.h:144
@ CapsulesNoUnionOrAABBs
Definition ExternalPhysicsCustomObjectVersion.h:103
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
static CORE_API UE::Math::TVector< T > ClosestPointOnLine(const UE::Math::TVector< T > &LineStart, const UE::Math::TVector< T > &LineEnd, const UE::Math::TVector< T > &Point)
Definition NumericLimits.h:41
Definition UnrealMathFPU.h:20