Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
SwingTwistConstraint.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
21{
22public:
24
25 // See: ConstraintSettings::SaveBinaryState
26 virtual void SaveBinaryState(StreamOut &inStream) const override;
27
29 virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const override;
30
32 EConstraintSpace mSpace = EConstraintSpace::WorldSpace;
33
35 RVec3 mPosition1 = RVec3::sZero();
36 Vec3 mTwistAxis1 = Vec3::sAxisX();
37 Vec3 mPlaneAxis1 = Vec3::sAxisY();
38
40 RVec3 mPosition2 = RVec3::sZero();
41 Vec3 mTwistAxis2 = Vec3::sAxisX();
42 Vec3 mPlaneAxis2 = Vec3::sAxisY();
43
45 float mNormalHalfConeAngle = 0.0f;
46 float mPlaneHalfConeAngle = 0.0f;
47
49 float mTwistMinAngle = 0.0f;
50 float mTwistMaxAngle = 0.0f;
51
53 float mMaxFrictionTorque = 0.0f;
54
58
59protected:
60 // See: ConstraintSettings::RestoreBinaryState
61 virtual void RestoreBinaryState(StreamIn &inStream) override;
62};
63
68{
69public:
71
73 SwingTwistConstraint(Body &inBody1, Body &inBody2, const SwingTwistConstraintSettings &inSettings);
74
76 virtual EConstraintSubType GetSubType() const override { return EConstraintSubType::SwingTwist; }
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 { return Mat44::sRotationTranslation(mConstraintToBody1, mLocalSpacePosition1); }
92 virtual Mat44 GetConstraintToBody2Matrix() const override { return Mat44::sRotationTranslation(mConstraintToBody2, mLocalSpacePosition2); }
93
95 inline Vec3 GetLocalSpacePosition1() const { return mLocalSpacePosition1; }
96 inline Vec3 GetLocalSpacePosition2() const { return mLocalSpacePosition2; }
97 inline Quat GetConstraintToBody1() const { return mConstraintToBody1; }
98 inline Quat GetConstraintToBody2() const { return mConstraintToBody2; }
99
101 inline float GetNormalHalfConeAngle() const { return mNormalHalfConeAngle; }
102 inline void SetNormalHalfConeAngle(float inAngle) { mNormalHalfConeAngle = inAngle; UpdateLimits(); }
103 inline float GetPlaneHalfConeAngle() const { return mPlaneHalfConeAngle; }
104 inline void SetPlaneHalfConeAngle(float inAngle) { mPlaneHalfConeAngle = inAngle; UpdateLimits(); }
105 inline float GetTwistMinAngle() const { return mTwistMinAngle; }
106 inline void SetTwistMinAngle(float inAngle) { mTwistMinAngle = inAngle; UpdateLimits(); }
107 inline float GetTwistMaxAngle() const { return mTwistMaxAngle; }
108 inline void SetTwistMaxAngle(float inAngle) { mTwistMaxAngle = inAngle; UpdateLimits(); }
109
111 const MotorSettings & GetSwingMotorSettings() const { return mSwingMotorSettings; }
112 MotorSettings & GetSwingMotorSettings() { return mSwingMotorSettings; }
113 const MotorSettings & GetTwistMotorSettings() const { return mTwistMotorSettings; }
114 MotorSettings & GetTwistMotorSettings() { return mTwistMotorSettings; }
115
117 void SetMaxFrictionTorque(float inFrictionTorque) { mMaxFrictionTorque = inFrictionTorque; }
118 float GetMaxFrictionTorque() const { return mMaxFrictionTorque; }
119
121
123 void SetSwingMotorState(EMotorState inState);
124 EMotorState GetSwingMotorState() const { return mSwingMotorState; }
125 void SetTwistMotorState(EMotorState inState);
126 EMotorState GetTwistMotorState() const { return mTwistMotorState; }
127
129 void SetTargetAngularVelocityCS(Vec3Arg inAngularVelocity) { mTargetAngularVelocity = inAngularVelocity; }
130 Vec3 GetTargetAngularVelocityCS() const { return mTargetAngularVelocity; }
131
133 void SetTargetOrientationCS(QuatArg inOrientation);
134 Quat GetTargetOrientationCS() const { return mTargetOrientation; }
135
138 void SetTargetOrientationBS(QuatArg inOrientation) { SetTargetOrientationCS(mConstraintToBody1.Conjugated() * inOrientation * mConstraintToBody2); }
139
142 Quat GetRotationInConstraintSpace() const;
143
145 inline Vec3 GetTotalLambdaPosition() const { return mPointConstraintPart.GetTotalLambda(); }
146 inline float GetTotalLambdaTwist() const { return mSwingTwistConstraintPart.GetTotalTwistLambda(); }
147 inline float GetTotalLambdaSwingY() const { return mSwingTwistConstraintPart.GetTotalSwingYLambda(); }
148 inline float GetTotalLambdaSwingZ() const { return mSwingTwistConstraintPart.GetTotalSwingZLambda(); }
149 inline Vec3 GetTotalLambdaMotor() const { return Vec3(mMotorConstraintPart[0].GetTotalLambda(), mMotorConstraintPart[1].GetTotalLambda(), mMotorConstraintPart[2].GetTotalLambda()); }
150
151private:
152 // Update the limits in the swing twist constraint part
153 void UpdateLimits();
154
155 // CONFIGURATION PROPERTIES FOLLOW
156
157 // Local space constraint positions
158 Vec3 mLocalSpacePosition1;
159 Vec3 mLocalSpacePosition2;
160
161 // Transforms from constraint space to body space
162 Quat mConstraintToBody1;
163 Quat mConstraintToBody2;
164
165 // Limits
166 float mNormalHalfConeAngle;
167 float mPlaneHalfConeAngle;
168 float mTwistMinAngle;
169 float mTwistMaxAngle;
170
171 // Friction
172 float mMaxFrictionTorque;
173
174 // Motor controls
175 MotorSettings mSwingMotorSettings;
176 MotorSettings mTwistMotorSettings;
177 EMotorState mSwingMotorState = EMotorState::Off;
178 EMotorState mTwistMotorState = EMotorState::Off;
179 Vec3 mTargetAngularVelocity = Vec3::sZero();
180 Quat mTargetOrientation = Quat::sIdentity();
181
182 // RUN TIME PROPERTIES FOLLOW
183
184 // Rotation axis for motor constraint parts
185 Vec3 mWorldSpaceMotorAxis[3];
186
187 // The constraint parts
188 PointConstraintPart mPointConstraintPart;
189 SwingTwistConstraintPart mSwingTwistConstraintPart;
190 AngleConstraintPart mMotorConstraintPart[3];
191};
192
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_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: AngleConstraintPart.h:37
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
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition: Mat44.h:13
static JPH_INLINE Mat44 sRotationTranslation(QuatArg inR, Vec3Arg inT)
Get matrix that rotates and translates.
Definition: Mat44.inl:149
Definition: MotorSettings.h:26
Definition: PointConstraintPart.h:41
Definition: Quat.h:33
static JPH_INLINE Quat sIdentity()
Definition: Quat.h:103
Definition: Reference.h:101
Definition: StateRecorder.h:48
Simple binary input stream.
Definition: StreamIn.h:13
Simple binary output stream.
Definition: StreamOut.h:13
Definition: SwingTwistConstraint.h:68
void SetPlaneHalfConeAngle(float inAngle)
Definition: SwingTwistConstraint.h:104
float GetNormalHalfConeAngle() const
Definition: SwingTwistConstraint.h:101
void SetTwistMinAngle(float inAngle)
Definition: SwingTwistConstraint.h:106
float GetTotalLambdaSwingY() const
Definition: SwingTwistConstraint.h:147
float GetTwistMaxAngle() const
Definition: SwingTwistConstraint.h:107
virtual EConstraintSubType GetSubType() const override
Get the sub type of a constraint.
Definition: SwingTwistConstraint.h:76
virtual Mat44 GetConstraintToBody2Matrix() const override
Calculates the transform that transforms from constraint space to body 2 space. The first column of t...
Definition: SwingTwistConstraint.h:92
float GetTotalLambdaSwingZ() const
Definition: SwingTwistConstraint.h:148
void SetTargetAngularVelocityCS(Vec3Arg inAngularVelocity)
Set the target angular velocity of body 2 in constraint space of body 2.
Definition: SwingTwistConstraint.h:129
Vec3 GetTotalLambdaMotor() const
Definition: SwingTwistConstraint.h:149
EMotorState GetTwistMotorState() const
Definition: SwingTwistConstraint.h:126
Quat GetConstraintToBody1() const
Definition: SwingTwistConstraint.h:97
void SetTwistMaxAngle(float inAngle)
Definition: SwingTwistConstraint.h:108
void SetNormalHalfConeAngle(float inAngle)
Definition: SwingTwistConstraint.h:102
Vec3 GetLocalSpacePosition1() const
Definition: SwingTwistConstraint.h:95
const MotorSettings & GetSwingMotorSettings() const
Definition: SwingTwistConstraint.h:111
float GetPlaneHalfConeAngle() const
Definition: SwingTwistConstraint.h:103
float GetMaxFrictionTorque() const
Definition: SwingTwistConstraint.h:118
Quat GetConstraintToBody2() const
Definition: SwingTwistConstraint.h:98
Vec3 GetTargetAngularVelocityCS() const
Definition: SwingTwistConstraint.h:130
Vec3 GetTotalLambdaPosition() const
Definition: SwingTwistConstraint.h:145
void SetTargetOrientationBS(QuatArg inOrientation)
Definition: SwingTwistConstraint.h:138
Vec3 GetLocalSpacePosition2() const
Definition: SwingTwistConstraint.h:96
Quat GetTargetOrientationCS() const
Definition: SwingTwistConstraint.h:134
virtual Mat44 GetConstraintToBody1Matrix() const override
Calculates the transform that transforms from constraint space to body 1 space. The first column of t...
Definition: SwingTwistConstraint.h:91
void SetMaxFrictionTorque(float inFrictionTorque)
Definition: SwingTwistConstraint.h:117
MotorSettings & GetSwingMotorSettings()
Definition: SwingTwistConstraint.h:112
float GetTwistMinAngle() const
Definition: SwingTwistConstraint.h:105
const MotorSettings & GetTwistMotorSettings() const
Definition: SwingTwistConstraint.h:113
MotorSettings & GetTwistMotorSettings()
Definition: SwingTwistConstraint.h:114
float GetTotalLambdaTwist() const
Definition: SwingTwistConstraint.h:146
EMotorState GetSwingMotorState() const
Definition: SwingTwistConstraint.h:124
Definition: SwingTwistConstraintPart.h:26
Definition: SwingTwistConstraint.h:21
MotorSettings mSwingMotorSettings
Definition: SwingTwistConstraint.h:56
MotorSettings mTwistMotorSettings
Definition: SwingTwistConstraint.h:57
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