Incremental Rotation Skinning

In this post, I'm going to discuss incremental rotation (IR) skinning. First, there's an overview on prior methods. To skip to the main section, click here.

Skinning techniques like LBS and DQS work by transforming a vertex with a weighted average transform:

$$
\begin{equation}
v_i' = ( \sum_{j}^{C} w_{i,j} T_i ) v_i,
\end{equation}
\label{eq:lbs}
$$

where $v_i$ is the bind position of vertex $i$th, $v_i'$ is the final position of $i$, $C$ is the set of control handles (bones) influencing the mesh, $w_{i,j}$ is the weight of control $j$ over vertex $i$, and $T_i$ is the transform that turns $C_j$ into $C_j'$.

We require a set of weights that accurately control the mesh surface. For purposes of running efficiently on a GPU, the number of non-zero weights that influence a vertex tends to be capped at 4. A very simple scheme would be to weigh the vertices based on their Euclidean distance $d_{i,j}=||v_i - C_j||$. Select the four closest bones $CB$ based on distance and let $d=\sum_{j}^{CB} d_{i,j}$. Then $w_{i,j} = \frac{d - d_{i,j}}{d}$. Of course this would cause all kinds of trouble. Vertices on one ankle will be influenced by the other ankle, which is just terrible. Baran and Popovic provided a weight computation method that models heat diffusion across the surface, respecting the mesh's connectivity and bone-vertex visibility. Bone glow calculates an illumination integral across the length of a bone to further weight the right-hand-side of the sparse linear system used to solve the heat maps.

Better weight computations aside, we can't avoid the artifacts inherent to LBS (candy wrapper collapse) and DQS (spherical bulge) no matter how good our weights are. Stretchable and twistable bones still transforms $v_i$ by a weighted average of bone transforms, but it decomposes the operation into separate stages to permit bone stretching and twisting. Control over stretch and twist comes from endpoints weights, $e_{i,j} \in [0, 1]$, $0$ meaning the vertex is located at the start of the bone and $1$ meaning it's located at the end. Without the decomposed transformation or the endpoint weights, changing a bone's length will cause the surrounding mesh to over or under-fit, and twisting a bone will just cause the candy wrapper collapse.

Incremental Rotation Skinning

Rather than linearly blend a transform using skin weights to compute a vertex's transform, IR skinning decomposes the vertex transform into two stages. The incremental stage occurs in the space of the vertex's primary bone (whichever bone is associated with the vertex's highest skin weight). Given an endpoint weight $e_{i,j} \in [0, 1]$, the point of attachment $a_i$ along the bone can be computed as $a_i = j_{start} + e_{i,j}(j_{end} - j_{start})$. Next, $v_i$ is rotated around $a_i$ based on the joint's rotation and the attachment point's proximity to the rotating joint. The closer $a_i$ is to the joint, the more $v_i$ rotates.

$$
\begin{equation}
v_i' = R_j(e_{i,j}) v_i
\end{equation}
\label{eq:ir_incremental}
$$

After the incremental stage, the global stage simply transforms $v_i'$ by $j$'s global transform:

$$
\begin{equation}
v_i'' = T_j v_i'
\end{equation}
\label{eq:ir_global}
$$