This is an old revision of the document!
HingeJoint
A common misconception 1) is that HingeJoint
constrains the rotation
or localRotation
of the Transform
that it is attached to. This is not strictly true. HingeJoint
only constrains the relative rotation between its own RigidBody
and the Rigidbody
in the ConnectedBody
field.
Another common misconception is that HingeJoint.angle
and HingJoint.axis
represent the rotation
of the Transform
that it is attached to. This is also not strictly true. That is, Quaternion.AngleAxis(hingeJoint.angle, hingeJoint.axis)
does not necessarily equal hingeJoint.transform.rotation
or hingeJoint.transform.localRotation
.
These two misconceptions, taken together, can make a HingeJoint
behave quite differently from what you might expect.
To quote the official docs:
The rest angle between the bodies is always zero at the beginning of the simulation.
The consequence of this is that HingeJoint.angle
does not depend on the starting orientation of either the joint's RigidBody
or the connected RigidBody
. And because HingeJoint.limits
represents limits on HingeJoint.angle
, the limits are also independent of any starting orientation of the bodies.
An example: Consider a GameObject
with rotation (0, 0, 0)
and a HingeJoint
on the x-axis with limits of [-90, 90]
. When played as-is, this GameObject
will be free to rotate between (-90, 0, 0)
and (90, 0, 0)
. However, if you rotate this GameObject
in the editor such that it starts with rotation (90, 0, 0)
and play it, the GameObject
will then be free to rotate between (0, 0, 0)
and (180, 0, 0)
- even though the angle limits have not changed.