I’ll be teaching our Skinning course again this year. This time at the IGS 2016 summer school (host of the Symposium of Geometry Processing). The rest of the summer school (aka workshop) line-up is an all-star cast. Look forward to seeing you there.

## Posts Tagged ‘skinning’

### Bounded biharmonic weights demo binary

Thursday, August 13th, 2015I’ve finally gotten around to creating a stand-alone mac os x app for the prototype I use to give demos of our bounded biharmonic weights. The only catch is that you’ll have to grab a mosek (free academic trial) license and put it in the right place

Unfortunately do to license reasons I cannot release the source code for this app, but the code for bounded biharmonic weights is in my matlab gptoolbox and in our C++ libigl

### Accompanying video for “Linear Subspace Design for Real-Time Shape Deformation”

Thursday, May 7th, 2015Here’s the accompanying video for SIGGRAPH 2015 paper “Linear Subspace Design for Real-Time Shape Deformation”.

### Preprint for “Linear Subspace Design for Real-Time Shape Deformation”

Wednesday, May 6th, 2015Our upcoming SIGGRAPH 2015 paper “Linear Subspace Design for Real-Time Shape Deformation” is online now. This is joint work with Yu Wang, jernej Barbič and Ladislav Kavan. One way to interpret our contribution is a method for computing shape-aware (rather than cage-aware) generalized barycentric coordinates *without a cage*. Another way to interpret it is as a generalization of linear blend skinning to incorporate transformations of region regions/bones and translations at point handles. The distinguishing characteristic of our weight computation is its speed. The choice of handles (the choice of linear subspace) is now interactive and becomes part of the design process. It absorbs user-creativity just as manipulating the handles does.

### Skinning Course at SGP Grad School

Monday, March 16th, 2015I’ll be teaching a version our of SIGGRAPH 2014 course Skinning: Real-time Shape Deformation at this years SGP. Looking at the grad school line up this yea, it seems I’ll be in very good company.

### Skinning Subdivision Surfaces

Monday, March 16th, 2015Songrun and Yotam have wrapped up the little 3D demo of our Siggraph Asia 2014 paper Skinning Cubic Bézier Splines and Catmull-Clark Subdivision Surfaces. Build the demo from source on github.

### “Skinning Cubic Bezier Splines and Catmull Clark Subdivision Surfaces” preprint available

Sunday, September 28th, 2014I’ve uploaded a preprint of a paper Songrun Liu, Yotam Gingold and I have recently finished. The paper’s entitled “Skinning Cubic Bezier Splines and Catmull Clark Subdivision Surfaces” and will be published in the upcoming proceedings of SIGGRAPH Asia 2014.

**Abstract:** Smooth space deformation has become a vital tool for the animation and design of 2D and 3D shapes. Linear methods, under the umbrella term of “linear blend skinning”, are the de facto standard for 3D animations. Unfortunately such approaches do not trivially extend to deforming vector graphics, such as the cubic Bézier splines prevalent in 2D or subdivision surfaces in 3D. We propose a variational approach to reposition the control points of cubic Bézier splines and Catmull-Clark subdivision surfaces—or any linear subdivision curves or surfaces—to produce curves or surfaces which match a linear blend skinning deformation as closely as possible. Exploiting the linearity of linear blend skinning, we show how this optimization collapses neatly into the repeated multiplication of a matrix per handle. We support C0, C1, G1, and fixed-angle continuity constraints between adjacent Bézier curves in a spline. Complexity scales linearly with respect to the number of input curves and run-time performance is fast enough for real-time editing and animation of high-resolution shapes.

**Update:** We now have a project page, too.

### Accompanying video for SIGGRAPH Asia paper “Skinning Cubic Bezier Splines and Catmull Clark Subdivision Surfaces “

Sunday, September 28th, 2014Here’s the accompanying video for our upcoming SIGGRAPH Asia paper “Skinning Cubic Bezier Splines and Catmull Clark Subdivision Surfaces” by Songrun Liu, Alec Jacobson and Yotam Gingold.

Also, check out the paper.

### Skinning.org Siggraph 2014 Course Notes

Tuesday, August 12th, 2014Zhigang Deng, Ladislav Kavan, JP Lewis and I are teaching a course this week at siggraph.

We’ll cover a wide variety of skinning related techniques and we’re hosting our notes at skinning.org. Check it out and tell us what you think!

### Implementing forward kinematics for linear blend skinning

Saturday, December 28th, 2013I’ve implemented linear blend skinning and forward kinematics many times now. Each time I start out I have to scratch my head a little about what gets stored where and how best to construct the final bone transformations. Here’s a little explanation that will hopefully help in the future.

First let’s recall the linear blend skinning formula:

```
v' = ∑ wi(v) Ti * v
```

where `v'`

is the new position of some point `v`

on our shape, and `wi(v)`

is bone i’s weight function evaluated at `v`

and `Ti`

is bone i’s transformation.

We’re specifically dealing with rigid bones, in fact we’ll consider our skeleton a rigid kinematic chain. Then the formula becomes:

```
v' = ∑ wi(v) (Qi * v + ti)
```

where `Qi`

is the **absolute** bone (or joint) rotation (e.g. stored as a quaternion) of bone i. These absolute rotations are just a concatenation down from the root to bone i of the relative rotations we’re storing for each bone. These relative rotations are what we’re changing during an animation. The translation part for each bone `ti`

is what gets a tad confusing. It is a function of the static (rest) skeleton (specifically the rigid bone lengths and relative positions in space) and the center of each bone rotation (i.e. joints positions).

Let’s go through a small example. Suppose we have two bones and we’re storing **relative** rotations `q₀`

and `q₁`

.

First we’ll figure out `Q₀`

and `t₀`

. We want our rotation `q₀`

to be centered about the bone’s “joint” or upper endpoint. To do this we first translate so that endpoint is at the origin,

then rotate by `q₀`

,

and then translate back,

This affectively computes `Q₀`

and `t₀`

. Imagine we apply these operations to some arbitrary point `x`

. First translate so that the endpoint is at the origin: `x-x₀`

, then rotate `q₀(x-x₀)`

, then translate back `q₀(x-x₀)+x₀`

. Now separate the rotation and translation and you have `q₀x-q₀x₀+x₀`

, revealing that `Q₀ = q₀`

and `t₀ = -q₀x₀+x₀`

.

Now, a bit more tricky let’s consider then next bone. Again we want to rotate about the bone’s parent joint, so translate such that it’s at the origin,

then rotate, but remember we need to rotate not just for this bone but also its parent (and in general all its ancestors),

then finally translate back, but now we want the center to end up connected with its parent bone, so translate to the transformed parent joint location,

Again, this computes `Q₁`

and `t₁`

. Let’s go through it again for some arbitrary point `x`

. First translate so that the parent joint is at the origin `x-x₁`

, then rotate by the parent’s rotation and this bone’s `q₁q₀(x-x₁)`

, then translate to meet the parent’s transformation of the joint `q₁q₀(x-x₁) + (q₀x₁-q₀x₀+x₀)`

. Separating the rotation from the translation we have `q₁q₀x - q₁q₀x₁ + q₀x₁-q₀x₀+x₀`

, revealing that `Q₁ = q₁q₀`

and `t₁ = - q₁q₀x₁ + q₀x₁-q₀x₀+x₀`

.

Finally, putting both bones together we see the fully transformed skeleton.

In general, we can write the absolute rotations and translations determined by forward kinematics as a recursive function of the relative rotations and rest joint locations:

```
Qi = qi Qp
ti = - Qi xi + Qp xi - Qp xp + xp
```

where bone `p`

is the parent of bone `i`

.

**Note:** If you’re storing your skeleton as a tree where each bone `i`

knows its parent `p`

then one affective and efficient way to compute the result of this recursive formula is using dynamic programming. Alternatively, if each bone `p`

knows each of its children `i`

then one can just use breadth or depth first traversal.

**Note:** This is just for determining the absolute rigid transformations corresponding to each bone. It does not depend on the fact that we’re using *linear* blend skinning. The same construction applies if fancier skinning formulae are used like dual quaternion skinning.