-
- Type Parameters:
T
- thePhysicsBody
type
- All Implemented Interfaces:
DataContainer
,Shiftable
,Ownable
public class AngleJoint<T extends PhysicsBody> extends Joint<T> implements Shiftable, DataContainer
Implementation of an angle joint.A angle joint constrains the relative rotation of two bodies. The bodies will continue to translate freely.
By default the lower and upper limit angles are set to the current angle between the bodies. When the lower and upper limits are equal, the bodies rotate together and are not allowed rotate relative to one another. By default the limits are disabled.
If the lower and upper limits are set explicitly, the values must follow these restrictions:
- lower limit ≤ upper limit
- lower limit > -180
- upper limit < 180
setReferenceAngle(double)
method. This method sets the baseline angle for the joint, which represents 0 radians in the context of the limits. For example:// we would like the joint limits to be [30, 260] // this is the same as the limits [-60, 170] if the reference angle is 90 joint.setLimits(Math.toRadians(-60), Math.toRadians(170)); joint.setReferenceAngle(Math.toRadians(90));
The angle joint also allows a ratio value that allow the bodies to rotate at a specified value relative to the other. This can be used to simulate gears.Since the AngleJoint class defaults the upper and lower limits to the same value and by default the limits are enabled, you will need to modify the limits, or disable the limit to see the effect of the ratio.
When the angle between the bodies reaches a limit, and limits are enabled, the ratio will be turned off.
NOTE: The
getAnchor1()
andgetAnchor2()
methods return the world space center points for the joined bodies. This constraint doesn't need anchor points.- Since:
- 2.2.2
- Version:
- 4.2.0
- Author:
- William Bittle
- See Also:
- Documentation, Angle Constraint
-
-
Field Summary
Fields Modifier and Type Field Description protected boolean
limitEnabled
Whether the limits are enabledprotected double
lowerLimit
The lower limitprotected double
ratio
The angular velocity ratioprotected double
referenceAngle
The initial angle between the two bodiesprotected double
upperLimit
The upper limit
-
Constructor Summary
Constructors Constructor Description AngleJoint(T body1, T body2)
Minimal constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Vector2
getAnchor1()
Returns the anchor point on the firstPhysicsBody
in world coordinates.Vector2
getAnchor2()
Returns the anchor point on the secondPhysicsBody
in world coordinates.double
getJointAngle()
Returns the relative angle between the twoPhysicsBody
s in radians in the range [-π, π].double
getLowerLimit()
Returns the lower limit in radians.double
getRatio()
Returns the angular velocity ratio between the two bodies.Vector2
getReactionForce(double invdt)
Returns the force applied to thePhysicsBody
s in order to satisfy the constraint in newtons.double
getReactionTorque(double invdt)
Returns the torque applied to thePhysicsBody
s in order to satisfy the constraint in newton-meters.double
getReferenceAngle()
Returns the reference angle.double
getUpperLimit()
Returns the upper limit in radians.void
initializeConstraints(TimeStep step, Settings settings)
Performs any initialization of the velocity and position constraints.boolean
isLimitEnabled()
Returns true if the limit is enabled.void
setLimitEnabled(boolean flag)
Sets whether the angle limits are enabled.void
setLimits(double limit)
Sets both the lower and upper limits to the given limit.void
setLimits(double lowerLimit, double upperLimit)
Sets both the lower and upper limits.void
setLimitsEnabled(double limit)
Sets both the lower and upper limits to the given limit and enables them.void
setLimitsEnabled(double lowerLimit, double upperLimit)
Sets both the lower and upper limits and enables them.void
setLowerLimit(double lowerLimit)
Sets the lower limit in radians.void
setRatio(double ratio)
Sets the angular velocity ratio between the two bodies.void
setReferenceAngle(double angle)
Sets the reference angle.void
setUpperLimit(double upperLimit)
Sets the upper limit in radians.void
shift(Vector2 shift)
Translates the object to match the given coordinate shift.boolean
solvePositionConstraints(TimeStep step, Settings settings)
Solves the position constraints.void
solveVelocityConstraints(TimeStep step, Settings settings)
Solves the velocity constraints.String
toString()
-
Methods inherited from class Joint
getBody1, getBody2, getConstraintImpulseMixing, getErrorReductionParameter, getNaturalFrequency, getOtherBody, getOwner, getReducedInertia, getReducedMass, getSpringDampingCoefficient, getSpringStiffness, getUserData, isCollisionAllowed, isEnabled, setCollisionAllowed, setOwner, setUserData
-
Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface DataContainer
getUserData, setUserData
-
-
-
-
Field Detail
-
ratio
protected double ratio
The angular velocity ratio
-
lowerLimit
protected double lowerLimit
The lower limit
-
upperLimit
protected double upperLimit
The upper limit
-
limitEnabled
protected boolean limitEnabled
Whether the limits are enabled
-
referenceAngle
protected double referenceAngle
The initial angle between the two bodies
-
-
Constructor Detail
-
AngleJoint
public AngleJoint(T body1, T body2)
Minimal constructor.- Parameters:
body1
- the firstPhysicsBody
body2
- the secondPhysicsBody
- Throws:
NullPointerException
- if body1 or body2 is nullIllegalArgumentException
- if body1 == body2
-
-
Method Detail
-
toString
public String toString()
- Overrides:
toString
in classJoint<T extends PhysicsBody>
-
initializeConstraints
public void initializeConstraints(TimeStep step, Settings settings)
Description copied from class:Joint
Performs any initialization of the velocity and position constraints.- Specified by:
initializeConstraints
in classJoint<T extends PhysicsBody>
- Parameters:
step
- the time step informationsettings
- the current world settings
-
solveVelocityConstraints
public void solveVelocityConstraints(TimeStep step, Settings settings)
Description copied from class:Joint
Solves the velocity constraints.- Specified by:
solveVelocityConstraints
in classJoint<T extends PhysicsBody>
- Parameters:
step
- the time step informationsettings
- the current world settings
-
solvePositionConstraints
public boolean solvePositionConstraints(TimeStep step, Settings settings)
Description copied from class:Joint
Solves the position constraints.- Specified by:
solvePositionConstraints
in classJoint<T extends PhysicsBody>
- Parameters:
step
- the time step informationsettings
- the current world settings- Returns:
- boolean true if the position constraints were solved
-
getAnchor1
public Vector2 getAnchor1()
Returns the anchor point on the firstPhysicsBody
in world coordinates.Not applicable to this joint. This method returns the first body's world center.
- Specified by:
getAnchor1
in classJoint<T extends PhysicsBody>
- Returns:
Vector2
-
getAnchor2
public Vector2 getAnchor2()
Returns the anchor point on the secondPhysicsBody
in world coordinates.Not applicable to this joint. This method returns the second body's world center.
- Specified by:
getAnchor2
in classJoint<T extends PhysicsBody>
- Returns:
Vector2
-
getReactionForce
public Vector2 getReactionForce(double invdt)
Returns the force applied to thePhysicsBody
s in order to satisfy the constraint in newtons.Not applicable to this joint. Returns a new zero
Vector2
.- Specified by:
getReactionForce
in classJoint<T extends PhysicsBody>
- Parameters:
invdt
- the inverse delta time- Returns:
Vector2
-
getReactionTorque
public double getReactionTorque(double invdt)
Description copied from class:Joint
Returns the torque applied to thePhysicsBody
s in order to satisfy the constraint in newton-meters.- Specified by:
getReactionTorque
in classJoint<T extends PhysicsBody>
- Parameters:
invdt
- the inverse delta time- Returns:
- double
-
shift
public void shift(Vector2 shift)
Description copied from interface:Shiftable
Translates the object to match the given coordinate shift.
-
getJointAngle
public double getJointAngle()
Returns the relative angle between the twoPhysicsBody
s in radians in the range [-π, π].- Returns:
- double
- Since:
- 3.1.0
-
getRatio
public double getRatio()
Returns the angular velocity ratio between the two bodies.- Returns:
- double
- Since:
- 3.1.0
-
setRatio
public void setRatio(double ratio)
Sets the angular velocity ratio between the two bodies.A value of 0.5 means that body1 will rotate 2 times while body2 rotates once. A value of 2 means that body2 will rotate 2 times while body1 rotates once.
A value of 1.0 means that the body rotate at the same rate.
A negative ratio indicates that the anglular velocities of the joined bodies should be in opposite directions.
A ratio of zero is not supported.
- Parameters:
ratio
- the ratio; anything, just not zero- Throws:
IllegalArgumentException
- if ratio is equal to zero- Since:
- 3.1.0
-
setLimitEnabled
public void setLimitEnabled(boolean flag)
Sets whether the angle limits are enabled.- Parameters:
flag
- true if the angle limits should be enforced
-
isLimitEnabled
public boolean isLimitEnabled()
Returns true if the limit is enabled.- Returns:
- boolean true if the limit is enabled
- Since:
- 3.0.1
-
getUpperLimit
public double getUpperLimit()
Returns the upper limit in radians.- Returns:
- double
-
setUpperLimit
public void setUpperLimit(double upperLimit)
Sets the upper limit in radians.See the class documentation for more details on the limit ranges.
- Parameters:
upperLimit
- the upper limit in radians- Throws:
IllegalArgumentException
- if upperLimit is less than the current lower limit
-
getLowerLimit
public double getLowerLimit()
Returns the lower limit in radians.- Returns:
- double
-
setLowerLimit
public void setLowerLimit(double lowerLimit)
Sets the lower limit in radians.See the class documentation for more details on the limit ranges.
- Parameters:
lowerLimit
- the lower limit in radians- Throws:
IllegalArgumentException
- if lowerLimit is greater than the current upper limit
-
setLimits
public void setLimits(double lowerLimit, double upperLimit)
Sets both the lower and upper limits.See the class documentation for more details on the limit ranges.
- Parameters:
lowerLimit
- the lower limit in radiansupperLimit
- the upper limit in radians- Throws:
IllegalArgumentException
- if lowerLimit is greater than upperLimit
-
setLimitsEnabled
public void setLimitsEnabled(double lowerLimit, double upperLimit)
Sets both the lower and upper limits and enables them.See the class documentation for more details on the limit ranges.
- Parameters:
lowerLimit
- the lower limit in radiansupperLimit
- the upper limit in radians- Throws:
IllegalArgumentException
- if lowerLimit is greater than upperLimit
-
setLimits
public void setLimits(double limit)
Sets both the lower and upper limits to the given limit.See the class documentation for more details on the limit ranges.
- Parameters:
limit
- the desired limit
-
setLimitsEnabled
public void setLimitsEnabled(double limit)
Sets both the lower and upper limits to the given limit and enables them.See the class documentation for more details on the limit ranges.
- Parameters:
limit
- the desired limit
-
getReferenceAngle
public double getReferenceAngle()
Returns the reference angle.The reference angle is the angle calculated when the joint was created from the two joined bodies. The reference angle is the angular difference between the bodies.
- Returns:
- double
- Since:
- 3.0.1
-
setReferenceAngle
public void setReferenceAngle(double angle)
Sets the reference angle.This method can be used to set the reference angle to override the computed reference angle from the constructor. This is useful in recreating the joint from a current state.
See the class documentation for more details.
- Parameters:
angle
- the reference angle in radians- Since:
- 3.0.1
- See Also:
getReferenceAngle()
-
-