Robust Weight Transfer
Overview
Robust Weight Transfer is a skin weight transfer tool based on the SIGGRAPH Asia 2023 paper “Robust Skin Weights Transfer via Weight Inpainting”.
Unlike conventional weight transfer tools, it can robustly transfer weights even when the source and target mesh shapes do not perfectly match. For unmatched vertices, the “Weight Inpainting” algorithm estimates appropriate weights from surrounding weight information.
Basic Operation
- Find the closest point on the source mesh for each target vertex.
- Perform matching based on distance and normal angle thresholds. Vertices that don’t match due to thresholds become candidates for Weight Inpainting.
- Transfer source weights directly to matched vertices, and assign Weight Inpainting estimated weights to unmatched vertices.
- Apply smoothing if needed (optional).
- Seam vertices normally have separate weights, but you can optionally average weights of vertices at the same position (optional).
Launch
Launch the tool from the dedicated menu or with the following command.
import faketools.tools.rig.robust_weight_transfer.ui
faketools.tools.rig.robust_weight_transfer.ui.show_ui()

Usage
1. Standard Weight Transfer
- Select the source mesh (with skinCluster) and click
Set - Select the target mesh and click
Add Selected - Click
Transfer
2. Partial Transfer
- Set the source mesh
- Select the vertices you want to transfer on the target mesh
- Click
Add Selected(displayed in blue in the list) - Click
Transfer
3. Matching Verification
- Set source and target
- Click
Searchto verify matching results - Click
Select Unmatchedto check unmatched vertices - Adjust Distance Ratio or Angle as needed
- Click
Transfer
※ If all target geometry and vertices are unmatched, weight transfer will not be performed.
4. Garment Seam Processing
- Add all clothing parts (body, collar, sleeves, etc.) to targets
- Turn on
Average Seam Weights - Click
Transfer
Options
Source
Set the mesh to transfer weights from.

- Select a mesh with skinCluster
- Click the
Setbutton
Targets
Set the meshes or vertices to transfer weights to.

- Add Selected: Add selected meshes or vertices to the list
- Remove: Remove selected items from the list
- Clear: Clear all targets
- Select: Select the target in the viewport
About Partial Transfer: When you add
selected vertices, weights are transferred only to those
vertices. They are displayed in blue in the list, with
the vertex count shown as [123 vtx].
Settings
Configure matching parameters.

| Parameter | Description | Default |
|---|---|---|
| Distance Ratio | Ratio of distance threshold to bounding box diagonal | 0.05 |
| Angle (degrees) | Normal angle threshold (degrees) | 30.0 |
| Expand Boundary | Number of edge rings to expand around unmatched vertices | 0 |
| Flip Normals | Allow matching with flipped normals | OFF |
| Fast Mode (KDTree) | Fast (slightly less accurate) matching using KDTree | OFF |
| Use Deformed Source | Evaluate source mesh at current pose | OFF |
| Use Deformed Target | Evaluate target mesh at current pose | OFF |
About Distance Ratio: Smaller values result in stricter matching. 0.05 means matching within 5% of the diagonal length.
About Expand Boundary: At the boundary between matched and unmatched vertices, weights from vertices that barely passed the threshold can introduce noise. Setting this value to 1 or higher will also treat vertices within N edge rings around unmatched vertices as “unmatched”, making them candidates for Weight Inpainting interpolation. This removes noise at the boundary and results in smoother weight transitions.
- 0: No expansion (default, original behavior)
- 1-5: Expand the boundary by the specified number of edge rings
※ An error will occur if expansion causes all vertices to become unmatched.
About Flip Normals: Turn this on when normals are flipped between source and target (e.g., clothing lining).
About Use Deformed Source / Use Deformed Target: Use when transferring weights in a pose other than bind pose. With both enabled, matching is performed based on the current pose shapes.
Post Processing
Configure processing applied to weights after transfer.

| Parameter | Description | Default |
|---|---|---|
| Enable Smoothing | Enable smoothing | ON |
| Iterations | Number of smoothing iterations | 10 |
| Alpha | Smoothing strength (0.01-1.0) | 0.2 |
| Average Seam Weights | Enable seam averaging | OFF |
| Include Internal Seams | Also average seams within the same mesh | ON |
| Position Tolerance | Distance tolerance for considering vertices at the same position | 0.0001 |
About Smoothing: Weight smoothing options after transfer. Smooths weights estimated by Weight Inpainting for more natural results.
About Seam Weights: Options for averaging seam vertex weights. This option is useful when the mesh is divided into multiple parts. Averages weights of vertices at the same position for consistent weights.
Use Cases: - When clothing collar and body are separate meshes with seam vertices at the same position - When vertices are split at UV seams but at the same position
Status
Displays matching results.

- Matched: Number and percentage of matched vertices
- Unmatched: Number and percentage of unmatched vertices (estimated by Weight Inpainting)
Action Buttons
| Button | Description |
|---|---|
| Search | Execute matching search (results displayed in Status) |
| Select Unmatched | Select unmatched vertices in viewport |
| Transfer | Execute weight transfer |
Basic Workflow
Preset Menu
Save and load settings as presets.
- Save Settings…: Save current settings as a preset
- Edit Settings…: Edit or delete presets
- Reset Settings…: Reset all settings to defaults
- Preset name: Load a saved preset
Note: Source and Targets are not included in presets.
Technical Details
Weight Inpainting Algorithm
Weights for unmatched vertices are solved as an optimization problem using a Laplacian matrix. This computes smoothly interpolated weights from surrounding weight information.
Dependencies
- numpy: Numerical computation
- scipy: Sparse matrix operations
- robust-laplacian: Fast Laplacian computation (optional, fallback implementation available)
If robust-laplacian is not installed,
the built-in fallback implementation is used.
Troubleshooting
Low Match Rate
- Increase Distance Ratio (e.g., 0.05 → 0.1)
- Increase Angle (e.g., 30 → 45)
- Try turning on Flip Normals
Weights Not Smooth
- Increase Smoothing Iterations
- Increase Smoothing Alpha
Issues with Deformed State
- Turn on both Use Deformed Source and Use Deformed Target
- Or return to bind pose before transfer
Seam Averaging Not Working
- Increase Position Tolerance (e.g., 0.0001 → 0.001)
- Verify vertices are actually at the same position