Kaynağa Gözat

Added accessor to update rotational/translation limits

Jorrit Rouwe 4 yıl önce
ebeveyn
işleme
1bb4b33d87

+ 46 - 23
Jolt/Physics/Constraints/SixDOFConstraint.cpp

@@ -71,6 +71,26 @@ TwoBodyConstraint *SixDOFConstraintSettings::Create(Body &inBody1, Body &inBody2
 	return new SixDOFConstraint(inBody1, inBody2, *this);
 }
 
+void SixDOFConstraint::UpdateRotationLimits()
+{
+	// Make values sensible
+	for (int i = 3; i < 6; ++i)
+		if (IsAxisFixed(((EAxis)i)))
+			mLimitMin[i] = mLimitMax[i] = 0.0f;
+		else
+		{
+			mLimitMin[i] = max(-JPH_PI, mLimitMin[i]);
+			mLimitMax[i] = min(JPH_PI, mLimitMax[i]);
+		}
+
+	// The swing twist constraint part requires symmetrical rotations around Y and Z
+	JPH_ASSERT(mLimitMin[EAxis::RotationY] == -mLimitMax[EAxis::RotationY]);
+	JPH_ASSERT(mLimitMin[EAxis::RotationZ] == -mLimitMax[EAxis::RotationZ]);
+
+	// Pass limits on to constraint part
+	mSwingTwistConstraintPart.SetLimits(mLimitMin[EAxis::RotationX], mLimitMax[EAxis::RotationX], mLimitMax[EAxis::RotationY], mLimitMax[EAxis::RotationZ]);
+}
+
 SixDOFConstraint::SixDOFConstraint(Body &inBody1, Body &inBody2, const SixDOFConstraintSettings &inSettings) :
 	TwoBodyConstraint(inBody1, inBody2, inSettings)
 {
@@ -108,29 +128,10 @@ SixDOFConstraint::SixDOFConstraint(Body &inBody1, Body &inBody2, const SixDOFCon
 			mFreeAxis |= 1 << a;
 	}
 
-	// Copy translation limits
-	for (int i = 0; i < 3; ++i)
-	{
-		mLimitMin[i] = inSettings.mLimitMin[i]; 
-		mLimitMax[i] = inSettings.mLimitMax[i];
-	}
-
-	// Copy rotation limits and make sensible
-	for (int i = 3; i < 6; ++i)
-		if (inSettings.IsFixedAxis((EAxis)i))
-			mLimitMin[i] = mLimitMax[i] = 0.0f;
-		else
-		{
-			mLimitMin[i] = max(-JPH_PI, inSettings.mLimitMin[i]);
-			mLimitMax[i] = min(JPH_PI, inSettings.mLimitMax[i]);
-		}
-
-	// The swing twist constraint part requires symmetrical rotations around Y and Z
-	JPH_ASSERT(mLimitMin[EAxis::RotationY] == -mLimitMax[EAxis::RotationY]);
-	JPH_ASSERT(mLimitMin[EAxis::RotationZ] == -mLimitMax[EAxis::RotationZ]);
-
-	// Pass limits on to constraint part
-	mSwingTwistConstraintPart.SetLimits(mLimitMin[EAxis::RotationX], mLimitMax[EAxis::RotationX], mLimitMax[EAxis::RotationY], mLimitMax[EAxis::RotationZ]);
+	// Copy translation and rotation limits
+	memcpy(mLimitMin, inSettings.mLimitMin, sizeof(mLimitMin)); 
+	memcpy(mLimitMax, inSettings.mLimitMax, sizeof(mLimitMax)); 
+	UpdateRotationLimits();
 
 	// Store friction settings
 	memcpy(mMaxFriction, inSettings.mMaxFriction, sizeof(mMaxFriction));
@@ -140,6 +141,28 @@ SixDOFConstraint::SixDOFConstraint(Body &inBody1, Body &inBody2, const SixDOFCon
 		mMotorSettings[i] = inSettings.mMotorSettings[i];
 }
 
+void SixDOFConstraint::SetTranslationLimits(Vec3Arg inLimitMin, Vec3Arg inLimitMax)
+{
+	mLimitMin[EAxis::TranslationX] = inLimitMin.GetX();
+	mLimitMin[EAxis::TranslationY] = inLimitMin.GetY();
+	mLimitMin[EAxis::TranslationZ] = inLimitMin.GetZ();
+	mLimitMax[EAxis::TranslationX] = inLimitMax.GetX();
+	mLimitMax[EAxis::TranslationY] = inLimitMax.GetY();
+	mLimitMax[EAxis::TranslationZ] = inLimitMax.GetZ();
+}
+
+void SixDOFConstraint::SetRotationLimits(Vec3Arg inLimitMin, Vec3Arg inLimitMax)
+{
+	mLimitMin[EAxis::RotationX] = inLimitMin.GetX();
+	mLimitMin[EAxis::RotationY] = inLimitMin.GetY();
+	mLimitMin[EAxis::RotationZ] = inLimitMin.GetZ();
+	mLimitMax[EAxis::RotationX] = inLimitMax.GetX();
+	mLimitMax[EAxis::RotationY] = inLimitMax.GetY();
+	mLimitMax[EAxis::RotationZ] = inLimitMax.GetZ();
+
+	UpdateRotationLimits();
+}
+
 void SixDOFConstraint::GetPositionConstraintProperties(Vec3 &outR1PlusU, Vec3 &outR2, Vec3 &outU) const
 {
 	Vec3 p1 = mBody1->GetCenterOfMassTransform() * mLocalSpacePosition1;

+ 9 - 0
Jolt/Physics/Constraints/SixDOFConstraint.h

@@ -113,6 +113,12 @@ public:
 	virtual Mat44				GetConstraintToBody1Matrix() const override					{ return Mat44::sRotationTranslation(mConstraintToBody1, mLocalSpacePosition1); }
 	virtual Mat44				GetConstraintToBody2Matrix() const override					{ return Mat44::sRotationTranslation(mConstraintToBody2, mLocalSpacePosition2); }
 
+	/// Update the translation limits for this constraint, note that this won't change if axis are free or not.
+	void						SetTranslationLimits(Vec3Arg inLimitMin, Vec3Arg inLimitMax);
+
+	/// Update the rotational limits for this constraint, note that this won't change if axis are free or not.
+	void						SetRotationLimits(Vec3Arg inLimitMin, Vec3Arg inLimitMax);
+
 	/// Get rotation of constraint in constraint space
 	inline Quat					GetRotationInConstraintSpace() const;
 
@@ -150,6 +156,9 @@ private:
 	// Calculate properties needed for the position constraint
 	inline void					GetPositionConstraintProperties(Vec3 &outR1PlusU, Vec3 &outR2, Vec3 &outU) const;
 
+	// Propagate the rotation limits to the constraint part
+	inline void					UpdateRotationLimits();
+
 	// Constraint settings helper functions
 	inline bool					IsAxisFixed(EAxis inAxis) const								{ return (mFixedAxis & (1 << inAxis)) != 0; }
 	inline bool					IsAxisFree(EAxis inAxis) const								{ return (mFreeAxis & (1 << inAxis)) != 0; }