A ball joint's angular travel (§28 "limits"), as a swing cone with an
optional twist range.
Why a cone and not a box (decision, WP-6.1)
A spherical joint leaves three rotational degrees of freedom, and solvers
express limits on them very differently. Rapier 0.19.3's typed
SphericalImpulseJoint exposes no limit API at all (it is not one of the
UnitImpulseJoints that carry setLimits); the only route there is a
generic joint with per-axis angular limits. A per-axis "box" would leak
that representation into the public API and would not be a shape any user
asks for.
A cone half-angle is what a shoulder, a universal joint, or a camera
gimbal is actually specified with, and it maps onto per-axis limits by
symmetry — an adapter builds it as ±coneAngle on the two swing axes of
SphericalJointDescriptor.axis. WP-6.3 verifies that against Rapier
and reports honestly if it cannot be built; nothing at this layer fakes it.
A ball joint's angular travel (§28 "limits"), as a swing cone with an optional twist range.
Why a cone and not a box (decision, WP-6.1)
A spherical joint leaves three rotational degrees of freedom, and solvers express limits on them very differently. Rapier 0.19.3's typed
SphericalImpulseJointexposes no limit API at all (it is not one of theUnitImpulseJoints that carrysetLimits); the only route there is a generic joint with per-axis angular limits. A per-axis "box" would leak that representation into the public API and would not be a shape any user asks for.A cone half-angle is what a shoulder, a universal joint, or a camera gimbal is actually specified with, and it maps onto per-axis limits by symmetry — an adapter builds it as
±coneAngleon the two swing axes of SphericalJointDescriptor.axis. WP-6.3 verifies that against Rapier and reports honestly if it cannot be built; nothing at this layer fakes it.