UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SuspensionSystem.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Math/Transform.h"
7#include "Math/Vector.h"
9#include "VehicleUtility.h"
10
11#if VEHICLE_DEBUGGING_ENABLED
13#endif
14
22namespace Chaos
23{
24
25 #define NUM_SUS_AVERAGING 10
26
28 {
30 : SuspensionAxis(FVector(0.f, 0.f, -1.f))
31 , SuspensionForceOffset(FVector::ZeroVector)
32 , SuspensionMaxRaise(0.f)
33 , SuspensionMaxDrop(0.f)
34 , MaxLength(0.f)
35 , SpringRate(1.f)
36 , SpringPreload(0.5f)
37 , CompressionDamping(0.9f)
38 , ReboundDamping(0.9f)
39 , RestingForce(0.f)
40 , Swaybar(0.5f)
41 , DampingRatio(0.3f)
42 , WheelLoadRatio(1.f)
43 , RaycastSafetyMargin(0.0f)
44 , SuspensionSmoothing(6)
45 {
46 MaxLength = FMath::Abs(SuspensionMaxRaise) + FMath::Abs(SuspensionMaxDrop);
47 SuspensionSmoothing = FMath::Clamp(SuspensionSmoothing, 0, NUM_SUS_AVERAGING);
48 }
49
51 {
52 SuspensionMaxRaise = InSuspensionMaxRaise;
53 MaxLength = FMath::Abs(SuspensionMaxRaise) + FMath::Abs(SuspensionMaxDrop);
54 }
55
57 {
58 SuspensionMaxDrop = InSuspensionMaxDrop;
59 MaxLength = FMath::Abs(SuspensionMaxRaise) + FMath::Abs(SuspensionMaxDrop);
60 }
61
62 FVector SuspensionAxis; // local axis, direction of suspension force raycast traces
63 FVector SuspensionForceOffset; // relative position from wheel where suspension forces are applied
64 float SuspensionMaxRaise; // distance [cm]
65 float SuspensionMaxDrop; // distance [cm]
66 float MaxLength; // distance [cm]
67
68 float SpringRate; // spring constant
69 float SpringPreload; // Amount of Spring force (independent spring movement)
70 float CompressionDamping; // limit compression speed
71 float ReboundDamping; // limit rebound speed
72 float RestingForce; // force on spring when vehicle on level with no body roll
73
74 float Swaybar; // Anti-roll bar
75
76 float DampingRatio; // value between (0-no damping) and (1-critical damping)
77 float WheelLoadRatio; // Normalized value, 0 no weight transfer, 1 Normal Weight transfer. A lower value cures lift off oversteer.
78 float RaycastSafetyMargin; // raise start of raycast [cm]
79
80 int SuspensionSmoothing; // [0-off , 10-max] smoothing visual appearance of wheel movement
81 };
82
85 {
88
90 {
91 FVector Dir(End - Start);
92 return Dir.FVector::GetSafeNormal();
93 }
94
95 float Length()
96 {
97 FVector Dir(End - Start);
98 return Dir.Size();
99 }
100 };
101
102 class CHAOSVEHICLESCORE_API FSimpleSuspensionSim : public TVehicleSystem<FSimpleSuspensionConfig>
103 {
104 public:
107 , DisplacementInput(0.f)
108 , LastDisplacement(0.f)
109 , LocalVelocity(FVector::ZeroVector)
110 , SuspensionForce(0.f)
111 , LocalOffset(FVector::ZeroVector)
112 , SpringDisplacement(0.f)
113 , SpringIndex(0)
114 , LastSpringLength(0.f)
115 , AveragingLength()
116 , AveragingCount(0)
117 , AveragingNum(0)
118 {
119 }
120
121// Inputs
122
124 void SetSuspensionLength(float InLength, float WheelRadius)
125 {
126 DisplacementInput = InLength - Setup().RaycastSafetyMargin - WheelRadius;
127 DisplacementInput = FMath::Max(0.f, DisplacementInput);
128 SpringDisplacement = Setup().MaxLength - DisplacementInput;
129 }
130
132 {
133 float NormalizedLength = 1.0f;
134
135 if (Setup().MaxLength > SMALL_NUMBER)
136 {
137 NormalizedLength = DisplacementInput / Setup().MaxLength;
138 }
139 NormalizedLength = FMath::Max(FMath::Min(NormalizedLength, 1.0f), 0.0f);
140 return NormalizedLength;
141 }
142
145 {
146 LocalVelocity = InVelocity;
147 }
148
150 {
151 LocalVelocity = InWorldTransform.InverseTransformVector(InWorldVelocity);
152 }
153
154 void SetLocalRestingPosition(const FVector& InOffset)
155 {
156 LocalOffset = InOffset;
157 }
158
160 {
161 SpringIndex = InIndex;
162 }
163
165 {
166 FVector LocalDirection = Setup().SuspensionAxis;
167 FVector WorldLocation = BodyTransform.TransformPosition(GetLocalRestingPosition());
168 FVector WorldDirection = BodyTransform.TransformVector(LocalDirection);
169
170 OutTrace.Start = WorldLocation - WorldDirection * (Setup().SuspensionMaxRaise + Setup().RaycastSafetyMargin);
171 OutTrace.End = WorldLocation + WorldDirection * (Setup().SuspensionMaxDrop + WheelRadius);
172 }
173
174 float GetTraceLength(float WheelRadius)
175 {
176 return Setup().SuspensionMaxRaise + Setup().RaycastSafetyMargin + Setup().SuspensionMaxDrop + WheelRadius;
177 }
178
179// Outputs
180
181 float GetSpringLength();
182
183 float GetSuspensionForce() const
184 {
185 return SuspensionForce;
186 }
187
189 {
190 FVector LocalDirection(0.f, 0.f, 1.f);
191 return InTransform.TransformVector(LocalDirection) * SuspensionForce;
192 }
193
195 {
196 return Setup().SuspensionMaxRaise + GetSpringLength();
197 }
198
200 {
201 return LocalOffset;
202 }
203
204// Simulation
205
206 void Simulate(float DeltaTime);
207
208 int32 GetAveragingCount() const {return AveragingCount;}
209 int32 GetAveragingNum() const { return AveragingNum; }
210 float GetLastSpringLength() const { return LastSpringLength; }
211 float GetLastDisplacement() const { return LastDisplacement; }
212 float GetAveragingLength(const int32 LengthIndex) const { return AveragingLength[LengthIndex]; }
213
215 void SetAveragingNum(const int32 InAveragingNum) { AveragingNum = InAveragingNum; }
216 void SetLastSpringLength(const float InLastSpringLength) { LastSpringLength = InLastSpringLength; }
217 void SetLastDisplacement(const float InLastDisplacement) { LastDisplacement = InLastDisplacement; }
219
220 protected:
221
226
230
231 float LastSpringLength; // blend rather than jump to new location
232 float AveragingLength[NUM_SUS_AVERAGING];
235 };
236
237} // namespace Chaos
238
239#if VEHICLE_DEBUGGING_ENABLED
241#endif
#define UE_ENABLE_OPTIMIZATION
Definition CoreMiscDefines.h:60
#define UE_DISABLE_OPTIMIZATION
Definition CoreMiscDefines.h:59
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
#define NUM_SUS_AVERAGING
Definition SuspensionSystem.h:25
#define SMALL_NUMBER
Definition UnrealMathUtility.h:66
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition SuspensionSystem.h:103
float GetTraceLength(float WheelRadius)
Definition SuspensionSystem.h:174
float LastSpringLength
Definition SuspensionSystem.h:231
float GetLastDisplacement() const
Definition SuspensionSystem.h:211
void SetLocalVelocity(const FVector &InVelocity)
Definition SuspensionSystem.h:144
float LastDisplacement
Definition SuspensionSystem.h:223
FVector LocalOffset
Definition SuspensionSystem.h:227
float GetSuspensionForce() const
Definition SuspensionSystem.h:183
float SpringDisplacement
Definition SuspensionSystem.h:228
float GetAveragingLength(const int32 LengthIndex) const
Definition SuspensionSystem.h:212
void SetAveragingLength(const int32 LengthIndex, const float InAveragingLength)
Definition SuspensionSystem.h:218
FSimpleSuspensionSim(const FSimpleSuspensionConfig *SetupIn)
Definition SuspensionSystem.h:105
float GetNormalizedLength()
Definition SuspensionSystem.h:131
float GetSuspensionOffset()
Definition SuspensionSystem.h:194
void SetSuspensionLength(float InLength, float WheelRadius)
Definition SuspensionSystem.h:124
void SetLocalRestingPosition(const FVector &InOffset)
Definition SuspensionSystem.h:154
void SetAveragingNum(const int32 InAveragingNum)
Definition SuspensionSystem.h:215
FVector GetSuspensionForceVector(const FTransform &InTransform)
Definition SuspensionSystem.h:188
void SetLastDisplacement(const float InLastDisplacement)
Definition SuspensionSystem.h:217
void SetAveragingCount(const int32 InAveragingCount)
Definition SuspensionSystem.h:214
float SuspensionForce
Definition SuspensionSystem.h:225
void SetLastSpringLength(const float InLastSpringLength)
Definition SuspensionSystem.h:216
float GetLastSpringLength() const
Definition SuspensionSystem.h:210
int32 GetAveragingNum() const
Definition SuspensionSystem.h:209
float DisplacementInput
Definition SuspensionSystem.h:222
FVector LocalVelocity
Definition SuspensionSystem.h:224
uint32 SpringIndex
Definition SuspensionSystem.h:229
int AveragingCount
Definition SuspensionSystem.h:233
int AveragingNum
Definition SuspensionSystem.h:234
void UpdateWorldRaycastLocation(const FTransform &BodyTransform, float WheelRadius, FSuspensionTrace &OutTrace)
Definition SuspensionSystem.h:164
const FVector & GetLocalRestingPosition() const
Definition SuspensionSystem.h:199
void SetLocalVelocityFromWorld(const FTransform &InWorldTransform, const FVector &InWorldVelocity)
Definition SuspensionSystem.h:149
int32 GetAveragingCount() const
Definition SuspensionSystem.h:208
void SetSpringIndex(uint32 InIndex)
Definition SuspensionSystem.h:159
Definition VehicleSystemTemplate.h:13
Definition SkeletalMeshComponent.h:307
Definition SuspensionSystem.h:28
float Swaybar
Definition SuspensionSystem.h:74
float RestingForce
Definition SuspensionSystem.h:72
float SuspensionMaxDrop
Definition SuspensionSystem.h:65
int SuspensionSmoothing
Definition SuspensionSystem.h:80
float SpringPreload
Definition SuspensionSystem.h:69
float RaycastSafetyMargin
Definition SuspensionSystem.h:78
float SpringRate
Definition SuspensionSystem.h:68
float CompressionDamping
Definition SuspensionSystem.h:70
float DampingRatio
Definition SuspensionSystem.h:76
float ReboundDamping
Definition SuspensionSystem.h:71
float WheelLoadRatio
Definition SuspensionSystem.h:77
FSimpleSuspensionConfig()
Definition SuspensionSystem.h:29
void SetSuspensionMaxDrop(float InSuspensionMaxDrop)
Definition SuspensionSystem.h:56
float MaxLength
Definition SuspensionSystem.h:66
FVector SuspensionForceOffset
Definition SuspensionSystem.h:63
FVector SuspensionAxis
Definition SuspensionSystem.h:62
float SuspensionMaxRaise
Definition SuspensionSystem.h:64
void SetSuspensionMaxRaise(float InSuspensionMaxRaise)
Definition SuspensionSystem.h:50
Definition SuspensionSystem.h:85
FVector TraceDir()
Definition SuspensionSystem.h:89
float Length()
Definition SuspensionSystem.h:95
FVector Start
Definition SuspensionSystem.h:86
FVector End
Definition SuspensionSystem.h:87
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
T Size() const
Definition Vector.h:1716