Constraints
Advanced Programmer
Constraints restrict rigidbodies to certain movement patterns. For example, a realistic knee joint can only move along one axis and can't bend forwards.
Constraints can either link two rigidbodies together, or link a single rigidbody to a point in the world. They allow for interaction and dependency among rigidbodies.
There are six types of constraints:
- hinges
- gears
- sliders
- cones (twist and turn)
- point to point (fixed distance between two colliders)
- six degrees of freedom
For a demonstration of the different constraints, load the PhysicsSample sample project.
Create a constraint
Note
Currently, you can only use constraints from scripts.
To create a constraint, use the Simulation static method CreateConstraint:
CreateConstraint(ConstraintTypes type, RigidbodyComponent rigidBodyA, Matrix frameA, bool useReferenceFrameA);
This links RigidBodyA to the world at its current location. The boolean useReferenceFrameA specifies which coordinate system the limit is applied to (either RigidBodyA or the world).
Note
- In the case of ConstraintTypes.Point2Point, the frame represents a pivot in A. Only the translation vector is considered. useReferenceFrameA is ignored.
- In the case of ConstraintTypes.Hinge, the frame represents a pivot in A and Axis in A. This is because the hinge allows only a limited angle of rotation between the rigidbody and the world.
- In the case of ConstraintTypes.ConeTwist, useReferenceFrameA is ignored.
- ConstraintTypes.Gear needs two rigidbodies to be created. This function will throw an exception.
CreateConstraint(ConstraintTypes type, RigidbodyComponent rigidBodyA, RigidbodyComponent rigidBodyB, Matrix frameA, Matrix frameB, bool useReferenceFrameA)
This method links RigidBodyA to RigidBodyB.
Note
- In the case of ConstraintTypes.Point2Point, the frame represents a pivot in A or B. Only the translation vector is considered. useReferenceFrameA is ignored.
- In the case of ConstraintTypes.Hinge the frame represents pivot in A/B and Axis in A/B. This is because the hinge allows only a limited angle of rotation between the rigidbody and the world in this case.
- In the case of ConstraintTypes.ConeTwist, useReferenceFrameA is ignored.
- In the case of ConstraintTypes.Gear, useReferenceFrameA is ignored. The frame just represents the axis either in A or B; only the translation vector (which should contain the axis) is used.
The boolean useReferenceFrameA determines which coordinate system (RigidBodyA or RigidBodyB) the limits are applied to.
Add constraints to the simulation
After you create a constraint, add it to the simulation from a script by calling:
this.GetSimulation().AddConstraint(constraint);
or:
var disableCollisionsBetweenLinkedBodies = true;
this.GetSimulation().AddConstraint(constraint, disableCollisionsBetweenLinkedBodies);
The parameter disableCollisionsBetweenLinkedBodies stops linked bodies colliding with each other.
Likewise, to remove a constraint from the simulation, use:
this.GetSimulation().RemoveConstraint(constraint);