This post is somewhat a description of what I’ve been doing recently. This week I’ve been reading cloth simulation papers to stay a bit away from rigid body dynamics since it is a well solved problem as discussed by the community. Last week I ended up finishing an implementation of contact point clustering using k-means. My experiments have shown that the optimization described in the excelent GPG4 article is available just to show how things got started. However, it can generate good results even if implemented naively, still leaving open doors for more optimization, such as the use of hysteresis to avoid jittering and the like. The video below was one of the first tests that showed some acceptable, still not plausable though, results.
Sometimes it’s desired to have a distance constraint. That constraint assumes a choosen separation distance for two points fixed in two bodies. I’ve written a derivation for it in 3D and shared here. An implementation should be pretty simple since we have minimally one Jacobian and solve a 1D linear system. Here is an example which you can use in your own projects.
Let’s say we need to compute the intersection point and normal from a line segment to an axis-aligned bounding box (AABB) bounds, and we neither want to perform expensive plane computations nor keep the AABB boundaries as an intersection of 6 axis-aligned planes (as it is a waste of memory). A quick way to do that is by evaluating the slab plane equation for each axis-aligned plane of the AABB.
You can read here how to compute the mouse constraint Jacobian, which I think is the simplest constraint along with a distance constraint. It can be helpfull when you’re selecting geometries in the scene using the mouse world space position (as a joint anchor point), since there is lack of controlability by directly applying forces at a particular point of a rigid body shape.
Errata: There is a minus sign before the stabilization term. It should be:
Lambda = (J * M * J^T)-1 * (-J * V – Beta / TimeStep * C)
Note: You can bound excessive impulses to avoid excessive velocity changes.
Thanks to Dirk Gregorius of Valve for pointing those things out via e-mail.