## Constraining IK Joints With Arbitrary Geometry

The following video demos a system for making geometry based constraints for a CCD solution, based on some of the notes and ideas presented by Jonathan Blow here. In the clip, an arm with 15 constrained ball joints tracks a target placed by the mouse. Each joint is constrained by a polygonal geometry approximating a circle, but any convex 2D shape could have been used.

IK links and constraints can be represented by the following simple structures.

After a link’s transforms are set by an iteration of CCD, a link’s `rotation` may violate the constraint and must be rotated back to the constraint primitive. In this scheme, the final and first vertexes of a constraint primitive are connected so that a constraint always forms a loop.

The closest-point math is the result of a pen and paper calculation and could stand a bit of optimization. I’ve left it the way it is to make it a bit easier to see what’s going on.

In the last line, the quaternion constructor `quat(next, limit)` is the minimal rotation from the vector `next` to `limit`, something like what Blow presents near the end of his article.