As rigid as possible gradient descent and Newton's method

Alec Jacobson

January 05, 2015

weblog/

For a long while now I've been curious to implement Newton's method for minimizing as-rigid-as-possible (ARAP) energies. I finally had an excuse to put the pieces together. Find the arap_gradient.m and arap_hessian.m functions in my gptoolbox for matlab.

First, to see what gradient descent looks like:

arap knight gradient descent

The red mesh is the original for reference, and the blue begins distorted and is restored via gradient descent. The iterations are simply:

while true
  [G,E] = arap_gradient(V,F,U);
  U = U - delta_t * G;
end

Convergence is quite slow (I'm displaying every 100 iterations!). I've even increased delta_t as much as I can without hitting instabilities.

In comparison, here's Newton's method:

arap knight Newton's method

Not surprisingly Newton's method is much faster (done in 100 iterations). Here's what the iterations look like:

while true
  [G,E,R] = arap_gradient(V,F,U);
  H = arap_hessian(V,F,'EvaluationPoint',U,'Rotations',R);
  U = U - delta_t * reshape((H+mu*I) \ G(:),size(U));
end

where mu~=1e-6 is a small number accounting for the instability of the Hessian. I guess this makes it Levenberg-Marquardt, though I'm not updating mu.

For those interested, the paper "A Simple Geometric Model for Elastic Deformations" [Chao et al. 2010] has derivations for both the gradient and Hessian. Though I find their mathematical conventions difficult to parse.

The gradient is straight-forward if you've already implemented the popular "local-global" solver approach. Just conduct your local step (find best fit rotations R) and build (but don't solve) your Poisson equation A X = B. This equation comes from minimizing the ARAP energy with R held fixed: E(X) = 1/2 X' A X - X' B. Now you know that Grad E at X with the best fit R is A*X - B.

The Hessian takes a bit more work. I prefer the derivation in "Shape Decomposition Using Modal Analysis" [Huang et al. 2009]. Besides being mindful of small typo, one must adapt their derivation a bit. They derive the Hessian assuming evaluation at the rest state (where all best fit rotations are identities). To account for this, build the covariance matrices using the evaluation point vertex positions and then left multiply them by the same best fit rotations used when computing the gradient.

Update: A friend also showed me a derivation of the Hessian of the (more or less equivalent) co-rotation elasticity energy in "Material Point Method for Snow Simulation" [Stomakhin et al. 2013]. The procedure looks very well explained though I haven't given it enough time to parse the dense tensor/index notation yet.