---
kind: concept
slug: linear-blend-skinning
title: Linear blend skinning
summary: >-
  Linear blend skinning moves each point by a weighted mix of bone transforms, with per-point weights. The one card here learns the weights and a pose-dependent offset in a canonical radiance field, and inverts the map by root finding. That gives novel-pose renders and pixel correspondences with no body template, but needs a tracked skeleton and multi-view images.
tags: [skinning, articulated-avatars, novel-pose-synthesis, dense-correspondence]
papers: ["2206.08929"]
related: [neural-radiance-field, dynamic-neural-radiance-field, dense-correspondence, parametric-body-model, human-mesh-recovery]
status: draft
updated_at: 2026-11-08
---

## Overview

Skinning moves the points of a model with the bones of a skeleton. In linear
blend skinning, each point is moved by every bone in turn, and the results are
averaged with per-point weights. The weights say how much each bone controls
the point. This page covers one use of the idea: a canonical radiance field
whose points are moved to the posed frame by learned weights. The only source
is [TAVA](/papers/2206.08929), which does this for animatable people and
animals [arxiv:2206.08929 §3.2] [§3.3.1]. Because this wiki holds one card on
the topic, the variants below all come from that paper.

The invariant is the forward map. A point in canonical space is sent to view
space by a weighted sum of bone transforms. The weights come from a network that
reads the canonical point, and empty space gets an identity weight so that it
stays where it is [arxiv:2206.08929 §3.3.1, eq. 4-5]. Rendering needs the other
direction: for each sample in view space, the canonical point that maps to it.
TAVA finds that point by solving an equation numerically, starting from several
guesses [arxiv:2206.08929 §3.3.2, eq. 6-7]. The skinning step therefore sits in
two places: the forward map, which defines the deformation, and the inverse map,
which the renderer uses.

Two design choices sit on top of the basic map. The first is that the weights
are learned, not fixed by a rig. The second is an extra offset that a separate
network predicts from the pose. The paper gives the offset for muscles and
clothing [arxiv:2206.08929 §3.3.1]. The paper's loss can also push the weights
of points on a bone towards that bone, and push the offset of those points
towards zero [arxiv:2206.08929 §3.6].

## Variants

### Learned skinned canonical field (TAVA, full model)

A canonical colour and density network, plus a network that gives each
canonical point one weight per bone and one for empty space
[arxiv:2206.08929 §3.2] [eq. 3]. The forward map adds the pose-dependent
offset [arxiv:2206.08929 §3.3.1]. The renderer keeps, for each sample, the
root-finding candidate with the highest density [arxiv:2206.08929 §3.4]. Card:
[TAVA: Template-free Animatable Volumetric Actors](/papers/2206.08929).
On ZJU-Mocap, the author-reported out-of-distribution score is 30.69 PSNR,
against 30.60 for NARF and 30.33 for NeuralBody, which uses an SMPL template
[arxiv:2206.08929 tab. 1]. The paper's own numbers for the baselines come from
re-implementations of NARF, A-NeRF and Pose-NeRF, and the paper's appendix
compares them with the official code [arxiv:2206.08929 app. D]
[card, Paper vs code](/papers/2206.08929).

### Without the non-linear offset (ablation)

The same model with the offset network removed. The author-reported
novel-view PSNR drops from 33.11 to 31.86, and the out-of-distribution score
drops from 30.69 to 30.56 [arxiv:2206.08929 tab. 3]. The offset therefore
matters most for new views in this experiment, and little for new poses.
The paper's animal runs also turn the offset off [arxiv:2206.08929 §4.2].

## When to use which

| Situation | Use | Why |
|---|---|---|
| Person or animal, multi-view images, a tracked skeleton per frame, no body template, and test poses unlike training | Learned skinned canonical field | Author-reported OOD PSNR 30.69 on ZJU-Mocap [arxiv:2206.08929 tab. 1]. A tracked skeleton per frame is required [arxiv:2206.08929 §1]. |
| Pixel correspondences across views and poses are needed | Learned skinned canonical field | Correspondences come from the canonical coordinates [arxiv:2206.08929 §3.5]. Author-reported 4.30 px against 9.28 px for NARF on the synthetic animals, in-distribution [arxiv:2206.08929 tab. 2]. |
| Only a single view, or no skeleton tracking | Not covered by the card | TAVA needs multi-view images and a tracked skeleton [arxiv:2206.08929 §1]. |
| Clothing or muscle detail matters most for new views | Keep the offset term | The offset ablation drops novel-view PSNR by 1.25 dB [arxiv:2206.08929 tab. 3]. |
| Animal subjects, as in the paper's experiments | Offset term off, as in the paper's animal runs | The paper disables the offset and occlusion for animals [arxiv:2206.08929 §4.2]. Its reason is not stated. |
| Compute budget is tight | Budget for root finding | Root finding is the cost centre. The paper uses K = 5 nearest bones [arxiv:2206.08929 §3.3.2], and the released code adds a background candidate, so each sample needs up to K + 1 solves [card, Paper vs code](/papers/2206.08929). The card records no runtime figure. |
| A template-based pipeline is available | Compare on your data first | On ZJU-Mocap, NeuralBody scores higher than TAVA on novel views and in-distribution poses, and TAVA scores higher on out-of-distribution PSNR [arxiv:2206.08929 tab. 1]. The card gives no broader comparison. |

## Implementation sketch

The sketch follows the paper's equations. Names are ours. The released code
differs in several details, listed on the card's Paper vs code section.

```pseudocode
# Skinning weights for one canonical point  [arxiv:2206.08929 §3.2] [eq. 3]
# Input: canonical point x_c (3,); network F_s
# Output: B+1 weights, one per bone plus one for empty space

def skin_weights(x_c):
    # B+1 values; the normalisation used in the release is on the card
    return F_s(x_c)

# Forward map, canonical to view space  [arxiv:2206.08929 §3.3.1] [eq. 4-5]
# Input: canonical point x_c (3,); bone transforms T_1..T_B; offset net
# Output: view-space point x_v (3,)

def forward(x_c, T, pose, offset_net):
    w = skin_weights(x_c)
    # Empty-space weight multiplies the identity, so it stays put
    x_v = w[0] * x_c
    for b in range(1, B + 1):
        # Each bone moves the point, scaled by its weight
        x_v = x_v + w[b] * apply(T[b], x_c)
    # Pose-dependent offset for muscles and clothing  [§3.3.1]
    return x_v + offset_net(x_c, pose)

# Inverse map by root finding  [arxiv:2206.08929 §3.3.2] [eq. 6-7]
# Input: view-space sample x_v (3,); pose; initial guesses (K, 3)
# Output: canonical candidates that converged

def inverse_candidates(x_v, pose, guesses):
    found = []
    for x_c in guesses:
        # Iterate until the residual forward(x_c) - x_v is small  [eq. 6]
        # The paper writes Newton's update; the release uses Broyden's
        for step in range(max_steps):
            r = forward(x_c, T, pose, offset_net) - x_v
            if norm(r) < tol:
                found.append(x_c)
                break
            x_c = x_c - solve_jacobian(x_c, pose, r)  # [eq. 7]
    return found
```

## Contradictions

None known. The wiki has one card on this technique, so no two sources
disagree. Within TAVA, the released code differs from the paper on the root
solver, the bone losses and the number of candidates. Read the card's Paper vs
code section before comparing numbers with the paper.

## Papers

- [TAVA: Template-free Animatable Volumetric Actors](/papers/2206.08929): a learned skinning field in canonical space with a non-linear offset and root-finding inverse map. Built from multi-view images and a tracked skeleton, with no body template.
