Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Constraints/DistanceConstraint.h
9912 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Physics/Constraints/TwoBodyConstraint.h>7#include <Jolt/Physics/Constraints/ConstraintPart/AxisConstraintPart.h>89JPH_NAMESPACE_BEGIN1011/// Distance constraint settings, used to create a distance constraint12class JPH_EXPORT DistanceConstraintSettings final : public TwoBodyConstraintSettings13{14JPH_DECLARE_SERIALIZABLE_VIRTUAL(JPH_EXPORT, DistanceConstraintSettings)1516public:17// See: ConstraintSettings::SaveBinaryState18virtual void SaveBinaryState(StreamOut &inStream) const override;1920/// Create an instance of this constraint21virtual TwoBodyConstraint * Create(Body &inBody1, Body &inBody2) const override;2223/// This determines in which space the constraint is setup, all properties below should be in the specified space24EConstraintSpace mSpace = EConstraintSpace::WorldSpace;2526/// Body 1 constraint reference frame (space determined by mSpace).27/// Constraint will keep mPoint1 (a point on body 1) and mPoint2 (a point on body 2) at the same distance.28/// Note that this constraint can be used as a cheap PointConstraint by setting mPoint1 = mPoint2 (but this removes only 1 degree of freedom instead of 3).29RVec3 mPoint1 = RVec3::sZero();3031/// Body 2 constraint reference frame (space determined by mSpace)32RVec3 mPoint2 = RVec3::sZero();3334/// Ability to override the distance range at which the two points are kept apart. If the value is negative, it will be replaced by the distance between mPoint1 and mPoint2 (works only if mSpace is world space).35float mMinDistance = -1.0f;36float mMaxDistance = -1.0f;3738/// When enabled, this makes the limits soft. When the constraint exceeds the limits, a spring force will pull it back.39SpringSettings mLimitsSpringSettings;4041protected:42// See: ConstraintSettings::RestoreBinaryState43virtual void RestoreBinaryState(StreamIn &inStream) override;44};4546/// This constraint is a stiff spring that holds 2 points at a fixed distance from each other47class JPH_EXPORT DistanceConstraint final : public TwoBodyConstraint48{49public:50JPH_OVERRIDE_NEW_DELETE5152/// Construct distance constraint53DistanceConstraint(Body &inBody1, Body &inBody2, const DistanceConstraintSettings &inSettings);5455// Generic interface of a constraint56virtual EConstraintSubType GetSubType() const override { return EConstraintSubType::Distance; }57virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM) override;58virtual void SetupVelocityConstraint(float inDeltaTime) override;59virtual void ResetWarmStart() override;60virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) override;61virtual bool SolveVelocityConstraint(float inDeltaTime) override;62virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) override;63#ifdef JPH_DEBUG_RENDERER64virtual void DrawConstraint(DebugRenderer *inRenderer) const override;65#endif // JPH_DEBUG_RENDERER66virtual void SaveState(StateRecorder &inStream) const override;67virtual void RestoreState(StateRecorder &inStream) override;68virtual Ref<ConstraintSettings> GetConstraintSettings() const override;6970// See: TwoBodyConstraint71virtual Mat44 GetConstraintToBody1Matrix() const override { return Mat44::sTranslation(mLocalSpacePosition1); }72virtual Mat44 GetConstraintToBody2Matrix() const override { return Mat44::sTranslation(mLocalSpacePosition2); } // Note: Incorrect rotation as we don't track the original rotation difference, should not matter though as the constraint is not limiting rotation.7374/// Update the minimum and maximum distance for the constraint75void SetDistance(float inMinDistance, float inMaxDistance) { JPH_ASSERT(inMinDistance <= inMaxDistance); mMinDistance = inMinDistance; mMaxDistance = inMaxDistance; }76float GetMinDistance() const { return mMinDistance; }77float GetMaxDistance() const { return mMaxDistance; }7879/// Update the limits spring settings80const SpringSettings & GetLimitsSpringSettings() const { return mLimitsSpringSettings; }81SpringSettings & GetLimitsSpringSettings() { return mLimitsSpringSettings; }82void SetLimitsSpringSettings(const SpringSettings &inLimitsSpringSettings) { mLimitsSpringSettings = inLimitsSpringSettings; }8384///@name Get Lagrange multiplier from last physics update (the linear impulse applied to satisfy the constraint)85inline float GetTotalLambdaPosition() const { return mAxisConstraint.GetTotalLambda(); }8687private:88// Internal helper function to calculate the values below89void CalculateConstraintProperties(float inDeltaTime);9091// CONFIGURATION PROPERTIES FOLLOW9293// Local space constraint positions94Vec3 mLocalSpacePosition1;95Vec3 mLocalSpacePosition2;9697// Min/max distance that must be kept between the world space points98float mMinDistance;99float mMaxDistance;100101// Soft constraint limits102SpringSettings mLimitsSpringSettings;103104// RUN TIME PROPERTIES FOLLOW105106// World space positions and normal107RVec3 mWorldSpacePosition1;108RVec3 mWorldSpacePosition2;109Vec3 mWorldSpaceNormal;110111// Depending on if the distance < min or distance > max we can apply forces to prevent further violations112float mMinLambda;113float mMaxLambda;114115// The constraint part116AxisConstraintPart mAxisConstraint;117};118119JPH_NAMESPACE_END120121122