UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
FAnimPhys Class Reference

#include <AnimPhysicsSolver.h>

Static Public Member Functions

static ENGINE_API float CalculateVolume (const TArray< FVector > &InVertices, const TArray< FIntVector > &InTriangles)
 
static ENGINE_API float CalculateVolume (const TArray< FAnimPhysShape > &InShapes)
 
static ENGINE_API FVector CalculateCenterOfMass (const TArray< FVector > &InVertices, const TArray< FIntVector > &InTriangles)
 
static ENGINE_API FVector CalculateCenterOfMass (const TArray< FAnimPhysShape > &InShapes)
 
static ENGINE_API FMatrix CalculateInertia (const TArray< FVector > &InVertices, const TArray< FIntVector > &InTriangles, const FVector &InCenterOfMass)
 
static ENGINE_API FMatrix CalculateInertia (const TArray< FAnimPhysShape > &InShapes, const FVector &InCenterOfMass)
 
static ENGINE_API void ScaleRigidBodyMass (FAnimPhysRigidBody *InOutRigidBody, float Scale)
 
static ENGINE_API void ApplyImpulse (FAnimPhysRigidBody *InOutRigidBody, const FVector &InWorldOrientedImpactPoint, const FVector &InImpulse)
 
static ENGINE_API void PhysicsUpdate (float DeltaTime, TArray< FAnimPhysRigidBody * > &Bodies, TArray< FAnimPhysLinearLimit > &LinearLimits, TArray< FAnimPhysAngularLimit > &AngularLimits, TArray< FAnimPhysSpring > &Springs, const FVector &GravityDirection, const FVector &ExternalForce, const FVector &ExternalLinearAcc, const FVector &ExternalAngularAcc, const FVector &ExternalAngularVelocity, int32 NumPreIterations=8, int32 NumPostIterations=2)
 
static ENGINE_API void ConstrainAlongDirection (float DeltaTime, TArray< FAnimPhysLinearLimit > &LimitContainer, FAnimPhysRigidBody *FirstBody, const FVector &FirstPosition, FAnimPhysRigidBody *SecondBody, const FVector &SecondPosition, const FVector &AxisToConstrain, const FVector2D Limits, float MinimumForce=-MAX_flt, float MaximumForce=MAX_flt)
 
static ENGINE_API void ConstrainPositionNailed (float DeltaTime, TArray< FAnimPhysLinearLimit > &LimitContainer, FAnimPhysRigidBody *FirstBody, const FVector &FirstPosition, FAnimPhysRigidBody *SecondBody, const FVector &SecondPosition)
 
static ENGINE_API void ConstrainPositionPrismatic (float DeltaTime, TArray< FAnimPhysLinearLimit > &LimitContainer, FAnimPhysRigidBody *FirstBody, const FVector &FirstPosition, FAnimPhysRigidBody *SecondBody, const FVector &SecondPosition, const FQuat &PrismRotation, const FVector &LimitsMin, const FVector &LimitsMax)
 
static ENGINE_API void ConstrainAngularRange (float DeltaTime, TArray< FAnimPhysAngularLimit > &LimitContainer, FAnimPhysRigidBody *FirstBody, FAnimPhysRigidBody *SecondBody, const FQuat &JointFrame, AnimPhysTwistAxis TwistAxis, const FVector &JointLimitMin, const FVector &JointLimitMax, float InJointBias)
 
static ENGINE_API void ConstrainConeAngle (float DeltaTime, TArray< FAnimPhysAngularLimit > &LimitContainer, FAnimPhysRigidBody *FirstBody, const FVector &Normal0, FAnimPhysRigidBody *SecondBody, const FVector &Normal1, float LimitAngle, float InJointBias)
 
static ENGINE_API void ConstrainPlanar (float DeltaTime, TArray< FAnimPhysLinearLimit > &LimitContainer, FAnimPhysRigidBody *Body, const FTransform &PlaneTransform)
 
static ENGINE_API void ConstrainSphericalInner (float DeltaTime, TArray< FAnimPhysLinearLimit > &LimitContainer, FAnimPhysRigidBody *Body, const FTransform &SphereTransform, float SphereRadius)
 
static ENGINE_API void ConstrainSphericalOuter (float DeltaTime, TArray< FAnimPhysLinearLimit > &LimitContainer, FAnimPhysRigidBody *Body, const FTransform &SphereTransform, float SphereRadius)
 
static ENGINE_API void CreateSpring (TArray< FAnimPhysSpring > &SpringContainer, FAnimPhysRigidBody *Body0, FVector Position0, FAnimPhysRigidBody *Body1, FVector Position1)
 

Static Public Attributes

static ENGINE_API bool bEnableDetailedStats = false
 
static ENGINE_API float CoriolisAlpha = 0.5f
 
static ENGINE_API float CentrifugalAlpha = 1.0f
 
static ENGINE_API float EulerAlpha = 1.0f
 
static constexpr float AngularAccelerationAlpha = 1.0f
 

Detailed Description

Lightweight rigid body motion solver (no collision) used for cosmetic secondary motion in an animation graph without invoking something heavier like using PhysX to simulate constraints which could be cost prohibitive

Member Function Documentation

◆ ApplyImpulse()

void FAnimPhys::ApplyImpulse ( FAnimPhysRigidBody InOutRigidBody,
const FVector InWorldOrientedImpactPoint,
const FVector InImpulse 
)
static

Apply an impulse to a body

Parameters
InOutRigidBodyBody to apply the impulse to
InWorldOrientedImpactPointLocation of the impulse
InImpulseImpulse to apply

◆ CalculateCenterOfMass() [1/2]

FVector FAnimPhys::CalculateCenterOfMass ( const TArray< FAnimPhysShape > &  InShapes)
static

Calculates the centre of mass of a collection of shapes

Parameters
InShapesCollection of shapes to use

◆ CalculateCenterOfMass() [2/2]

FVector FAnimPhys::CalculateCenterOfMass ( const TArray< FVector > &  InVertices,
const TArray< FIntVector > &  InTriangles 
)
static

Calculates the center of mass of a shape

Parameters
InVerticesVerts in the shape
InTrianglesTriangles represented in InVertices

◆ CalculateInertia() [1/2]

FMatrix FAnimPhys::CalculateInertia ( const TArray< FAnimPhysShape > &  InShapes,
const FVector InCenterOfMass 
)
static

Calculate the inertia tensor of a collection of shapes

Parameters
InShapesShapes to use
InCenterOfMassCenter of mass of the collection

◆ CalculateInertia() [2/2]

FMatrix FAnimPhys::CalculateInertia ( const TArray< FVector > &  InVertices,
const TArray< FIntVector > &  InTriangles,
const FVector InCenterOfMass 
)
static

Calculate the inertia tensor of a shape

Parameters
InVerticesVerts in the shape
InTrianglesTriangles represented in InVertices
InCenterOfMassCenter of mass of the shape

◆ CalculateVolume() [1/2]

float FAnimPhys::CalculateVolume ( const TArray< FAnimPhysShape > &  InShapes)
static

Calculates the volume of a collection of shapes

Parameters
InShapesCollection of shapes to use

◆ CalculateVolume() [2/2]

float FAnimPhys::CalculateVolume ( const TArray< FVector > &  InVertices,
const TArray< FIntVector > &  InTriangles 
)
static

Calculates the volume of a shape

Parameters
InVerticesVerts in the shape
InTrianglesTriangles represented in InVertices

◆ ConstrainAlongDirection()

void FAnimPhys::ConstrainAlongDirection ( float  DeltaTime,
TArray< FAnimPhysLinearLimit > &  LimitContainer,
FAnimPhysRigidBody FirstBody,
const FVector FirstPosition,
FAnimPhysRigidBody SecondBody,
const FVector SecondPosition,
const FVector AxisToConstrain,
const FVector2D  Limits,
float  MinimumForce = -MAX_flt,
float  MaximumForce = MAX_flt 
)
static

Constrain bodies along a provided axis

Parameters
LimitContainerContainer to add limits to
FirstBodyFirst body in constraint (or nullptr for world)
FirstPositionLocal position on first body to apply constraint
SecondBodySecond body in constraint
SecondPositionLocal position on second body to apply constraint
AxisToConstrainAxis to constrain between bodies
LimitsLimit on the provided axis so that Limits.X(min) < Final Position < Limits.Y(max)
MinimumForceMinimum force that can be applied to satisfy the maximum limit (default -MAX_flt)
MaximumForceMaximum force that can be applied to satisfy the minimum limit (default MAX_flt)

◆ ConstrainAngularRange()

void FAnimPhys::ConstrainAngularRange ( float  DeltaTime,
TArray< FAnimPhysAngularLimit > &  LimitContainer,
FAnimPhysRigidBody FirstBody,
FAnimPhysRigidBody SecondBody,
const FQuat JointFrame,
AnimPhysTwistAxis  TwistAxis,
const FVector JointLimitMin,
const FVector JointLimitMax,
float  InJointBias 
)
static

Constraint two bodies together with angular limits, limiting the relative rotation between them. Note that this allows TWO axes to rotate, the twist axis will always be locked

Parameters
LimitContainerContainer to add limits to
FirstBodyFirst body in the constraint (or nullptr for world)
SecondBodySecond body in constraint
JointFrameFrame/Rotation of the joint
TwistAxisThe axis to regard as the twist axis
JointLimitMinMinimum limits along each axis (twist axis ignored)
JointLimitMaxMaximum limits along each axis (twist axis ignored)
InJointBiasBias towards second body's forces (1.0f = 100%)

◆ ConstrainConeAngle()

void FAnimPhys::ConstrainConeAngle ( float  DeltaTime,
TArray< FAnimPhysAngularLimit > &  LimitContainer,
FAnimPhysRigidBody FirstBody,
const FVector Normal0,
FAnimPhysRigidBody SecondBody,
const FVector Normal1,
float  LimitAngle,
float  InJointBias 
)
static

Constraints the rotation between two bodies into a cone

Parameters
LimitContainerContainer to add limits to
FirstBodyFirst body in the constraint (or nullptr for world)
Normal0Normal for the first side of the constraint
SecondBodySecond body in the constraint
Normal1Normal for the second side of the constraint
LimitAngleAngle to limit the cone to
InJointBiasBias towards second body's forces (1.0f = 100%)

◆ ConstrainPlanar()

void FAnimPhys::ConstrainPlanar ( float  DeltaTime,
TArray< FAnimPhysLinearLimit > &  LimitContainer,
FAnimPhysRigidBody Body,
const FTransform PlaneTransform 
)
static

Constrains the position of a body to one side of a plane placed at PlaneTransform (plane normal is Z axis)

Parameters
LimitContainerContainer to add limits to
BodyThe body to constrain to the plane
PlaneTransformTransform of the plane, with the normal facing along the Z axis of the orientation

◆ ConstrainPositionNailed()

void FAnimPhys::ConstrainPositionNailed ( float  DeltaTime,
TArray< FAnimPhysLinearLimit > &  LimitContainer,
FAnimPhysRigidBody FirstBody,
const FVector FirstPosition,
FAnimPhysRigidBody SecondBody,
const FVector SecondPosition 
)
static

Constrain bodies together as if fixed or nailed (linear only, bodies can still rotate)

Parameters
LimitContainerContainer to add limits to
FirstBodyFirst body in constraint (or nullptr for world)
FirstPositionLocal position on first body to apply constraint
SecondBodySecond body in constraint
SecondPositionLocal position on second body to apply constraint

◆ ConstrainPositionPrismatic()

void FAnimPhys::ConstrainPositionPrismatic ( float  DeltaTime,
TArray< FAnimPhysLinearLimit > &  LimitContainer,
FAnimPhysRigidBody FirstBody,
const FVector FirstPosition,
FAnimPhysRigidBody SecondBody,
const FVector SecondPosition,
const FQuat PrismRotation,
const FVector LimitsMin,
const FVector LimitsMax 
)
static

Constrain bodies together with linear limits forming a box or prism around the constraint

Parameters
LimitContainerContainer to add limits to
FirstBodyFirst body in the constraint (or nullptr for world)
FirstPositionLocal position on first body to apply constraint
SecondBodySecond body in the constraint
SecondPositionLocal position on the second body to apply constraint
PrismRotationRotation to apply to the prism axes, only necessary when constraining to world, otherwise the rotation of the first body is used
LimitsMinMinimum limits along axes
LimitsMaxMaximum limits along axes

◆ ConstrainSphericalInner()

void FAnimPhys::ConstrainSphericalInner ( float  DeltaTime,
TArray< FAnimPhysLinearLimit > &  LimitContainer,
FAnimPhysRigidBody Body,
const FTransform SphereTransform,
float  SphereRadius 
)
static

Constrains the position of a body within the requested sphere

◆ ConstrainSphericalOuter()

void FAnimPhys::ConstrainSphericalOuter ( float  DeltaTime,
TArray< FAnimPhysLinearLimit > &  LimitContainer,
FAnimPhysRigidBody Body,
const FTransform SphereTransform,
float  SphereRadius 
)
static

Constrains the position of a body outside of the requested sphere

◆ CreateSpring()

void FAnimPhys::CreateSpring ( TArray< FAnimPhysSpring > &  SpringContainer,
FAnimPhysRigidBody Body0,
FVector  Position0,
FAnimPhysRigidBody Body1,
FVector  Position1 
)
static

◆ PhysicsUpdate()

void FAnimPhys::PhysicsUpdate ( float  DeltaTime,
TArray< FAnimPhysRigidBody * > &  Bodies,
TArray< FAnimPhysLinearLimit > &  LinearLimits,
TArray< FAnimPhysAngularLimit > &  AngularLimits,
TArray< FAnimPhysSpring > &  Springs,
const FVector GravityDirection,
const FVector ExternalForce,
const FVector ExternalLinearAcc,
const FVector ExternalAngularAcc,
const FVector ExternalAngularVelocity,
int32  NumPreIterations = 8,
int32  NumPostIterations = 2 
)
static

Performs a physics update on the provided state objects

Parameters
DeltaTimeTime for the frame / update
BodiesBodies to integrate
LinearLimitsLinear limits to apply to the bodies
AngularLimitsAngular limits to apply to the bodies
SpringsLinear/Angular springs to apply to the bodies prior to solving
NumPreIterationsNumber of times to iterate the limits before performing the integration
NumPostIterationsNumber of times to iterae the limits after performing the integration

◆ ScaleRigidBodyMass()

void FAnimPhys::ScaleRigidBodyMass ( FAnimPhysRigidBody InOutRigidBody,
float  Scale 
)
static

Scale the mass and inertia properties of a rigid body

Parameters
InOutRigidBodyBody to modify
ScaleScale to use

Member Data Documentation

◆ AngularAccelerationAlpha

constexpr float FAnimPhys::AngularAccelerationAlpha = 1.0f
staticconstexpr

◆ bEnableDetailedStats

bool FAnimPhys::bEnableDetailedStats = false
static

◆ CentrifugalAlpha

float FAnimPhys::CentrifugalAlpha = 1.0f
static

◆ CoriolisAlpha

float FAnimPhys::CoriolisAlpha = 0.5f
static

◆ EulerAlpha

float FAnimPhys::EulerAlpha = 1.0f
static

The documentation for this class was generated from the following files: