Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
SliderConstraint.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
12
14
17{
18public:
20
21 // See: ConstraintSettings::SaveBinaryState
22 virtual void SaveBinaryState(StreamOut &inStream) const override;
23
26 virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const override;
27
29 void SetSliderAxis(Vec3Arg inSliderAxis);
30
32 EConstraintSpace mSpace = EConstraintSpace::WorldSpace;
33
35 bool mAutoDetectPoint = false;
36
39 RVec3 mPoint1 = RVec3::sZero();
40 Vec3 mSliderAxis1 = Vec3::sAxisX();
41 Vec3 mNormalAxis1 = Vec3::sAxisY();
42
44 RVec3 mPoint2 = RVec3::sZero();
45 Vec3 mSliderAxis2 = Vec3::sAxisX();
46 Vec3 mNormalAxis2 = Vec3::sAxisY();
47
49 float mLimitsMin = -FLT_MAX;
50 float mLimitsMax = FLT_MAX;
51
54
56 float mMaxFrictionForce = 0.0f;
57
60
61protected:
62 // See: ConstraintSettings::RestoreBinaryState
63 virtual void RestoreBinaryState(StreamIn &inStream) override;
64};
65
68{
69public:
71
73 SliderConstraint(Body &inBody1, Body &inBody2, const SliderConstraintSettings &inSettings);
74
75 // Generic interface of a constraint
76 virtual EConstraintSubType GetSubType() const override { return EConstraintSubType::Slider; }
77 virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM) override;
78 virtual void SetupVelocityConstraint(float inDeltaTime) override;
79 virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) override;
80 virtual bool SolveVelocityConstraint(float inDeltaTime) override;
81 virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) override;
82#ifdef JPH_DEBUG_RENDERER
83 virtual void DrawConstraint(DebugRenderer *inRenderer) const override;
84 virtual void DrawConstraintLimits(DebugRenderer *inRenderer) const override;
85#endif // JPH_DEBUG_RENDERER
86 virtual void SaveState(StateRecorder &inStream) const override;
87 virtual void RestoreState(StateRecorder &inStream) override;
88 virtual Ref<ConstraintSettings> GetConstraintSettings() const override;
89
90 // See: TwoBodyConstraint
91 virtual Mat44 GetConstraintToBody1Matrix() const override;
92 virtual Mat44 GetConstraintToBody2Matrix() const override;
93
95 float GetCurrentPosition() const;
96
98 void SetMaxFrictionForce(float inFrictionForce) { mMaxFrictionForce = inFrictionForce; }
99 float GetMaxFrictionForce() const { return mMaxFrictionForce; }
100
102 MotorSettings & GetMotorSettings() { return mMotorSettings; }
103 const MotorSettings & GetMotorSettings() const { return mMotorSettings; }
104
105 // Motor controls
106 void SetMotorState(EMotorState inState) { JPH_ASSERT(inState == EMotorState::Off || mMotorSettings.IsValid()); mMotorState = inState; }
107 EMotorState GetMotorState() const { return mMotorState; }
108 void SetTargetVelocity(float inVelocity) { mTargetVelocity = inVelocity; }
109 float GetTargetVelocity() const { return mTargetVelocity; }
110 void SetTargetPosition(float inPosition) { mTargetPosition = mHasLimits? Clamp(inPosition, mLimitsMin, mLimitsMax) : inPosition; }
111 float GetTargetPosition() const { return mTargetPosition; }
112
114 void SetLimits(float inLimitsMin, float inLimitsMax);
115 float GetLimitsMin() const { return mLimitsMin; }
116 float GetLimitsMax() const { return mLimitsMax; }
117 bool HasLimits() const { return mHasLimits; }
118
120 const SpringSettings & GetLimitsSpringSettings() const { return mLimitsSpringSettings; }
121 SpringSettings & GetLimitsSpringSettings() { return mLimitsSpringSettings; }
122 void SetLimitsSpringSettings(const SpringSettings &inLimitsSpringSettings) { mLimitsSpringSettings = inLimitsSpringSettings; }
123
125 inline Vector<2> GetTotalLambdaPosition() const { return mPositionConstraintPart.GetTotalLambda(); }
126 inline float GetTotalLambdaPositionLimits() const { return mPositionLimitsConstraintPart.GetTotalLambda(); }
127 inline Vec3 GetTotalLambdaRotation() const { return mRotationConstraintPart.GetTotalLambda(); }
128 inline float GetTotalLambdaMotor() const { return mMotorConstraintPart.GetTotalLambda(); }
129
130private:
131 // Internal helper function to calculate the values below
132 void CalculateR1R2U(Mat44Arg inRotation1, Mat44Arg inRotation2);
133 void CalculateSlidingAxisAndPosition(Mat44Arg inRotation1);
134 void CalculatePositionConstraintProperties(Mat44Arg inRotation1, Mat44Arg inRotation2);
135 void CalculatePositionLimitsConstraintProperties(float inDeltaTime);
136 void CalculateMotorConstraintProperties(float inDeltaTime);
137
138 // CONFIGURATION PROPERTIES FOLLOW
139
140 // Local space constraint positions
141 Vec3 mLocalSpacePosition1;
142 Vec3 mLocalSpacePosition2;
143
144 // Local space sliding direction
145 Vec3 mLocalSpaceSliderAxis1;
146
147 // Local space normals to the sliding direction (in body 1 space)
148 Vec3 mLocalSpaceNormal1;
149 Vec3 mLocalSpaceNormal2;
150
151 // Inverse of initial rotation from body 1 to body 2 in body 1 space
152 Quat mInvInitialOrientation;
153
154 // Slider limits
155 bool mHasLimits;
156 float mLimitsMin;
157 float mLimitsMax;
158
159 // Soft constraint limits
160 SpringSettings mLimitsSpringSettings;
161
162 // Friction
163 float mMaxFrictionForce;
164
165 // Motor controls
166 MotorSettings mMotorSettings;
167 EMotorState mMotorState = EMotorState::Off;
168 float mTargetVelocity = 0.0f;
169 float mTargetPosition = 0.0f;
170
171 // RUN TIME PROPERTIES FOLLOW
172
173 // Positions where the point constraint acts on (middle point between center of masses)
174 Vec3 mR1;
175 Vec3 mR2;
176
177 // X2 + R2 - X1 - R1
178 Vec3 mU;
179
180 // World space sliding direction
181 Vec3 mWorldSpaceSliderAxis;
182
183 // Normals to the slider axis
184 Vec3 mN1;
185 Vec3 mN2;
186
187 // Distance along the slide axis
188 float mD = 0.0f;
189
190 // The constraint parts
191 DualAxisConstraintPart mPositionConstraintPart;
192 RotationEulerConstraintPart mRotationConstraintPart;
193 AxisConstraintPart mPositionLimitsConstraintPart;
194 AxisConstraintPart mMotorConstraintPart;
195};
196
EConstraintSpace
Certain constraints support setting them up in local or world space. This governs what is used.
Definition: Constraint.h:58
EConstraintSubType
Enum to identify constraint sub type.
Definition: Constraint.h:34
#define JPH_EXPORT
Definition: Core.h:214
#define JPH_NAMESPACE_END
Definition: Core.h:354
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:348
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
constexpr T Clamp(T inV, T inMin, T inMax)
Clamp a value between two values.
Definition: Math.h:45
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition: Memory.h:29
EMotorState
Definition: MotorSettings.h:17
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name)
Definition: SerializableObject.h:100
Definition: AxisConstraintPart.h:43
Definition: Body.h:35
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition: BodyID.h:13
virtual void SaveBinaryState(StreamOut &inStream) const
Saves the contents of the constraint settings in binary form to inStream.
Definition: Constraint.cpp:26
virtual void RestoreBinaryState(StreamIn &inStream)
This function should not be called directly, it is used by sRestoreFromBinaryState.
Definition: Constraint.cpp:36
Simple triangle renderer for debugging purposes.
Definition: DebugRenderer.h:30
Definition: DualAxisConstraintPart.h:48
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition: Mat44.h:13
Definition: MotorSettings.h:26
Definition: Quat.h:33
Definition: Reference.h:101
Definition: RotationEulerConstraintPart.h:36
A slider constraint allows movement in only 1 axis (and no rotation). Also known as a prismatic const...
Definition: SliderConstraint.h:68
void SetMaxFrictionForce(float inFrictionForce)
Friction control.
Definition: SliderConstraint.h:98
Vec3 GetTotalLambdaRotation() const
Definition: SliderConstraint.h:127
float GetLimitsMin() const
Definition: SliderConstraint.h:115
const MotorSettings & GetMotorSettings() const
Definition: SliderConstraint.h:103
virtual EConstraintSubType GetSubType() const override
Get the sub type of a constraint.
Definition: SliderConstraint.h:76
float GetTotalLambdaPositionLimits() const
Definition: SliderConstraint.h:126
bool HasLimits() const
Definition: SliderConstraint.h:117
Vector< 2 > GetTotalLambdaPosition() const
Definition: SliderConstraint.h:125
SpringSettings & GetLimitsSpringSettings()
Definition: SliderConstraint.h:121
float GetTotalLambdaMotor() const
Definition: SliderConstraint.h:128
float GetLimitsMax() const
Definition: SliderConstraint.h:116
void SetMotorState(EMotorState inState)
Definition: SliderConstraint.h:106
float GetTargetPosition() const
Definition: SliderConstraint.h:111
void SetLimitsSpringSettings(const SpringSettings &inLimitsSpringSettings)
Definition: SliderConstraint.h:122
const SpringSettings & GetLimitsSpringSettings() const
Update the limits spring settings.
Definition: SliderConstraint.h:120
void SetTargetVelocity(float inVelocity)
Definition: SliderConstraint.h:108
float GetTargetVelocity() const
Definition: SliderConstraint.h:109
MotorSettings & GetMotorSettings()
Motor settings.
Definition: SliderConstraint.h:102
float GetMaxFrictionForce() const
Definition: SliderConstraint.h:99
void SetTargetPosition(float inPosition)
Definition: SliderConstraint.h:110
EMotorState GetMotorState() const
Definition: SliderConstraint.h:107
Slider constraint settings, used to create a slider constraint.
Definition: SliderConstraint.h:17
MotorSettings mMotorSettings
In case the constraint is powered, this determines the motor settings around the sliding axis.
Definition: SliderConstraint.h:59
SpringSettings mLimitsSpringSettings
When enabled, this makes the limits soft. When the constraint exceeds the limits, a spring force will...
Definition: SliderConstraint.h:53
Settings for a linear or angular spring.
Definition: SpringSettings.h:23
Definition: StateRecorder.h:48
Simple binary input stream.
Definition: StreamIn.h:13
Simple binary output stream.
Definition: StreamOut.h:13
Base class for all constraints that involve 2 bodies. Body1 is usually considered the parent,...
Definition: TwoBodyConstraint.h:27
Base class for settings for all constraints that involve 2 bodies.
Definition: TwoBodyConstraint.h:16
virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const =0
Definition: Vec3.h:16
static JPH_INLINE Vec3 sAxisX()
Vectors with the principal axis.
Definition: Vec3.h:52
static JPH_INLINE Vec3 sAxisY()
Definition: Vec3.h:53
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition: Vec3.inl:107
Templatized vector class.
Definition: Vector.h:12