Class Constraint

All Implemented Interfaces:
com.jme3.export.Savable, com.jme3.util.clone.JmeCloneable, Cloneable, Comparable<NativePhysicsObject>
Direct Known Subclasses:
ConeJoint, GearJoint, HingeJoint, New6Dof, Point2PointJoint, SixDofJoint, SliderJoint

public abstract class Constraint extends PhysicsJoint
The abstract base class for rigid-body physics joints based on Bullet's btTypedConstraint. A Constraint can be single-ended or double-ended:
  • A single-ended Constraint constrains the motion of a dynamic rigid body.
  • A double-ended Constraint connects 2 rigid bodies together in the same PhysicsSpace. One or both of the bodies must be dynamic.
Subclasses include: ConeJoint, GearJoint, HingeJoint, New6Dof, Point2PointJoint, SixDofJoint, SixDofSpringJoint, and SliderJoint.
  • Field Details

    • logger15

      public static final Logger logger15
      message logger for this class
    • pivotA

      protected com.jme3.math.Vector3f pivotA
      copy of the pivot location: in physics-space coordinates if bodyA is null, or else in A's scaled local coordinates
    • pivotB

      protected com.jme3.math.Vector3f pivotB
      copy of the pivot location: in physics-space coordinates if bodyB is null, or else in B's scaled local coordinates
  • Constructor Details

    • Constraint

      protected Constraint()
      No-argument constructor needed by SavableClassUtil.
    • Constraint

      protected Constraint(PhysicsRigidBody body, JointEnd bodyEnd, com.jme3.math.Vector3f pivotInBody)
      Instantiate an enabled, single-ended Constraint using the specified body at the specified end.

      To be effective, the Constraint must be added to the body's PhysicsSpace and the body must be dynamic.

      Parameters:
      body - the body to constrain (not null, alias created)
      bodyEnd - at which end to attach the body (not null)
      pivotInBody - the pivot location in the body's scaled local coordinates (not null, unaffected)
    • Constraint

      protected Constraint(PhysicsRigidBody body, JointEnd bodyEnd, com.jme3.math.Vector3f pivotInBody, com.jme3.math.Vector3f pivotInWorld)
      Instantiate an enabled, single-ended Constraint using the specified body at the specified end.

      To be effective, the Constraint must be added to the body's PhysicsSpace and the body must be dynamic.

      Parameters:
      body - the body to constrain (not null, alias created)
      bodyEnd - at which end to attach the body (not null)
      pivotInBody - the pivot location in the body's scaled local coordinates (not null, unaffected)
      pivotInWorld - the pivot location in physics-space coordinates (not null, unaffected)
    • Constraint

      protected Constraint(PhysicsBody bodyA, PhysicsBody bodyB, com.jme3.math.Vector3f pivotInA, com.jme3.math.Vector3f pivotInB)
      Instantiate an enabled, double-ended Constraint.

      To be effective, the Constraint must be added to the PhysicsSpace of both bodies. Also, the bodies must be distinct and at least one of them must be dynamic.

      Parameters:
      bodyA - the body for the A end (not null, alias created)
      bodyB - the body for the B end (not null, alias created)
      pivotInA - the pivot location in A's scaled local coordinates (not null, unaffected)
      pivotInB - the pivot location in B's scaled local coordinates (not null, unaffected)
  • Method Details

    • getAppliedImpulse

      public float getAppliedImpulse()
      Determine the magnitude of the applied impulse. Requires feedback.
      Returns:
      impulse magnitude (≥0)
      Throws:
      IllegalStateException - if feedback is not enabled
    • getBreakingImpulseThreshold

      public float getBreakingImpulseThreshold()
      Determine the breaking impulse threshold.
      Returns:
      the threshold value
    • getOverrideIterations

      public int getOverrideIterations()
      Determine the number of iterations used to solve this Constraint.
      Returns:
      the number of iterations (≥0) or -1 if using the solver's default
    • getPivot

      public com.jme3.math.Vector3f getPivot(JointEnd end, com.jme3.math.Vector3f storeResult)
      Copy the location of the specified connection point in the specified body.
      Parameters:
      end - which end of the Constraint to access (not null)
      storeResult - storage for the result (modified if not null)
      Returns:
      a location vector (in scaled local coordinates, either storeResult or a new instance)
    • getPivotA

      public com.jme3.math.Vector3f getPivotA(com.jme3.math.Vector3f storeResult)
      Copy the location of the connection point in the body at the A end.
      Parameters:
      storeResult - storage for the result (modified if not null)
      Returns:
      a location vector (in A's scaled local coordinates, either storeResult or a new instance)
    • getPivotB

      public com.jme3.math.Vector3f getPivotB(com.jme3.math.Vector3f storeResult)
      Copy the location of the connection point in the body at the B end.
      Parameters:
      storeResult - storage for the result (modified if not null)
      Returns:
      a location vector (in B's scaled local coordinates, either storeResult or a new instance)
    • isCollisionBetweenLinkedBodies

      public boolean isCollisionBetweenLinkedBodies()
      Test whether collisions are handled between the ends.
      Returns:
      true if collisions are handled, otherwise false
    • isFeedback

      public boolean isFeedback()
      Test whether this Constraint has feedback enabled.
      Returns:
      true if enabled, otherwise false
    • overrideIterations

      public void overrideIterations(int numIterations)
      Override the number of iterations used to solve this Constraint.
      Parameters:
      numIterations - the desired number of iterations (≥0) or -1 to use the solver's default (default=-1)
    • setBreakingImpulseThreshold

      public void setBreakingImpulseThreshold(float desiredThreshold)
      Alter the breaking impulse threshold.
      Parameters:
      desiredThreshold - the desired value (default=MAX_VALUE with SP library or +Infinity with DP library)
    • setCollisionBetweenLinkedBodies

      public void setCollisionBetweenLinkedBodies(boolean allow)
      Handle/ignore collisions between the ends of a double-ended joint.
      Parameters:
      allow - true to handle collisions, false to ignore them (default=true)
    • setEnabled

      public void setEnabled(boolean enable)
      Enable or disable this Constraint.
      Parameters:
      enable - true to enable, false to disable (default=true)
    • setFeedback

      public void setFeedback(boolean enable)
      Enable or disable feedback for this Constraint.
      Parameters:
      enable - true to enable, false to disable (default=false)
    • copyConstraintProperties

      protected final void copyConstraintProperties(Constraint old)
      Copy common properties from another constraint. Used during cloning.
      Parameters:
      old - (not null, unaffected)
    • getConstraintType

      protected static final int getConstraintType(long constraintId)
      Read the constraint type.
      Parameters:
      constraintId - identifier of the btTypedConstraint (not zero)
      Returns:
      a btTypedConstraintType ordinal value (≥3)
    • readConstraintProperties

      protected final void readConstraintProperties(com.jme3.export.InputCapsule capsule) throws IOException
      Read common properties from a capsule.
      Parameters:
      capsule - the input capsule (not null, modified)
      Throws:
      IOException - from the importer
    • setPivotInA

      protected void setPivotInA(com.jme3.math.Vector3f location)
      Alter the pivot location in A's scaled local coordinates. The subclass is responsible for updating the native object.
      Parameters:
      location - the desired location (not null, unaffected)
    • setPivotInB

      protected void setPivotInB(com.jme3.math.Vector3f location)
      Alter the pivot location in B's scaled local coordinates. The subclass is responsible for updating the native object.
      Parameters:
      location - the desired location (not null, unaffected)
    • cloneFields

      public void cloneFields(com.jme3.util.clone.Cloner cloner, Object original)
      Callback from Cloner to convert this shallow-cloned Constraint into a deep-cloned one, using the specified Cloner and original to resolve copied fields.
      Specified by:
      cloneFields in interface com.jme3.util.clone.JmeCloneable
      Overrides:
      cloneFields in class PhysicsJoint
      Parameters:
      cloner - the Cloner that's cloning this Constraint (not null)
      original - the instance from which this Constraint was shallow-cloned (unused)
    • getBodyA

      public PhysicsRigidBody getBodyA()
      Access the rigid body at the A end.
      Overrides:
      getBodyA in class PhysicsJoint
      Returns:
      the pre-existing rigid body, or null if none
    • getBodyB

      public PhysicsRigidBody getBodyB()
      Access the rigid body at the B end.
      Overrides:
      getBodyB in class PhysicsJoint
      Returns:
      the pre-existing body, or null if none
    • isEnabled

      public boolean isEnabled()
      Test whether this Constraint is enabled.
      Specified by:
      isEnabled in class PhysicsJoint
      Returns:
      true if enabled, otherwise false
    • read

      public void read(com.jme3.export.JmeImporter importer) throws IOException
      De-serialize this Constraint from the specified importer, for example when loading from a J3O file.
      Specified by:
      read in interface com.jme3.export.Savable
      Overrides:
      read in class PhysicsJoint
      Parameters:
      importer - (not null)
      Throws:
      IOException - from the importer
    • write

      public void write(com.jme3.export.JmeExporter exporter) throws IOException
      Serialize this Constraint to the specified exporter, for example when saving to a J3O file.
      Specified by:
      write in interface com.jme3.export.Savable
      Overrides:
      write in class PhysicsJoint
      Parameters:
      exporter - (not null)
      Throws:
      IOException - from the exporter