- Python 100%
| .gitignore | ||
| jiggle_lab.py | ||
| LICENSE | ||
| README.md | ||
Jiggle Lab
Measured, one-click jiggle physics for rigged avatars in Blender.
Jiggle Lab reads a rigged avatar's geometry, works out which flesh overhangs the skeleton, clusters that soft tissue into anatomical masses, and auto-rigs a jiggle bone per mass with physically-derived spring parameters. It then computes matching VRChat PhysBone settings, and lets you preview the motion in the viewport or render it straight to MP4.
No manual bone placement, no guessing at spring/pull values — the numbers come out of the mesh itself.
What it does
- Analyze soft tissue. Builds a per-vertex "softness" field — the distance from each vertex to its nearest structural skeleton bone (how far the flesh overhangs the structure) — and paints it as a heatmap (blue = firm / near-bone, red = soft overhang). Verts driven only by helper groups or no deform bone are excluded.
- Detect masses. Clusters high-softness vertices into anatomical zones by position and dominant bone — breast (L/R), belly, butt (L/R), thigh (L/R). Arms are skipped. Each mass is colored distinctly and reported with its vertex count.
- Auto-rig jiggle bones. Creates one bone per mass (
jb_*prefix), parents it to the mass's dominant deform bone, orients it along the overhang direction, and weights it with a softness falloff taken from the existing deform weights. By default it strips any prior jiggle rig first, so rigs never stack (stacked rigs cause clipping) — safe to re-run. - Compute physics. From each mass's proxy volume it derives a spring model:
bigger masses jiggle slower (natural frequency
f ~ 1/sqrt(m)), firmer tissue is more damped (damping ratio ζ). These map to VRChat PhysBone Pull, Spring, Stiffness, and Gravity, stored as custom properties on each jiggle bone and shown in the panel. - Preview / render. Bakes a jump animation with a decaying oscillation on the
jiggle bones so you can feel the motion — play it in the timeline, or render it to
an MP4. MP4 uses Blender's native FFmpeg container when the build supports it, and
falls back to a PNG sequence stitched with system
ffmpeg(or leaves the PNG folder ifffmpegisn't found).
Quick start
Open the Jiggle Lab tab in the 3D View sidebar (press N). The panels run
top-to-bottom in the order you use them:
- Setup — Pick your Mesh and Armature, or click Set / Sync Targets to auto-fill from the active mesh and its armature modifier. This panel also shows whether Deform Doctor and MPFB were detected.
- Analyze — Click Analyze Soft Tissue to paint the overhang heatmap. Adjust Softness Threshold and Min Mass Size, then click Detect Masses to see the clustered zones and their vertex counts. Clear Heatmap removes the diagnostic coloring.
- Auto-Rig & Physics — Set Firmness, Min/Max Freq, Jiggle Authority, Max Influences, and leave Replace Existing Jiggle on. Click Auto-Rig Jiggle Bones (it asks for confirmation). It rigs the bones, computes the physics, and lists the resulting PhysBone settings per bone. Remove Jiggle Bones deletes everything it created.
- Preview — Set Preview Amplitude and Preview Frames, then Bake
Preview (viewport) and play the timeline, or Render Preview MP4 to write
jiggle_lab_preview.mp4.
Controls
| Control | Default | Meaning |
|---|---|---|
| Softness Threshold | 0.55 | Fraction of max overhang counted as soft tissue |
| Min Mass Size | 40 | Minimum vertices for a cluster to become a mass |
| Firmness | 0.3 | Tissue firmness → damping (used when the MPFB macro is absent) |
| Min Freq (Hz) | 1.6 | Frequency of the biggest / heaviest mass |
| Max Freq (Hz) | 3.8 | Frequency of the smallest mass |
| Jiggle Authority | 0.8 | Max weight share a jiggle bone takes from the body |
| Max Influences | 4 | Weight limit-per-vertex during cleanup |
| Replace Existing Jiggle | on | Strip prior jiggle rig before rigging (no stacking) |
| Preview Amplitude | 1.0 | Scales preview jiggle amplitude |
| Preview Frames | 100 | Length of the baked preview |
Installation
Jiggle Lab is a single-file, drop-in add-on.
- Blender 2.93+: Edit → Preferences → Add-ons (or Extensions on 4.2+) → Install…
- Select
jiggle_lab.pyand enable Jiggle Lab. - Open the Jiggle Lab panel in the 3D View sidebar (
N).
Blender version support
Requires Blender 2.93 or newer (bl_info minimum (2, 93, 0)). Runtime-verified on Blender 2.93.0 and 5.1.2. The jiggle heatmap uses mesh.color_attributes on Blender 3.2+ and falls back to loop-domain mesh.vertex_colors on 2.93–3.1; viewport-render preview uses context.temp_override on 3.2+ with a classic override-dict fallback on older builds.
VRChat / Unity relevance
Jiggle Lab is built for avatars headed to VRChat and Unity. For each mass it computes
concrete VRChat PhysBone values — Pull, Spring, Stiffness, and Gravity — derived
from the mass's size and firmness, and stores them as custom properties on the
generated jiggle bones so you can read them straight off the rig when setting up your
PhysBone components. The generated bones use a clean jb_ prefix and are weighted
with a per-vertex influence cap (default 4) so the rig stays within engine limits. The
in-Blender preview is an approximation of feel — in-game jiggle is 100% PhysBones.
Part of the Unity AI Lab Blender suite
Jiggle Lab is one of the Unity AI Lab Blender plugins. Each tool is standalone — no hard dependencies — but built to interoperate cleanly with its siblings:
- Deform Doctor — when present, Jiggle Lab routes its weight cleanup
(limit-to-N + normalize) through it; otherwise it uses its own equivalent.
Jiggle Lab never touches Deform Doctor's
DD_Heatattribute (it uses its ownJL_Heat). - MPFB — when present, Jiggle Lab reads the
firmnessmacro to scale damping instead of the Firmness slider. - Texturly and Cats Blender Expanded — sibling suite tools for world/material texturing and avatar cleanup that share the same avatar-first, VRChat/Unity-safe workflow.
Conflict-proofing is by design: Jiggle Lab keeps its own jigglelab.* operator
namespace, JIGGLELAB_* classes, scene.jiggle_lab property, "Jiggle Lab" sidebar
tab, JL_Heat color attribute, and jb_ bone prefix, and it detects and reuses
existing jiggle bones rather than duplicating them.
The suite is developed on the lab's self-hosted Forgejo host:
git@git.unityailab.com:UnityAILab/blender-jiggle-lab.git
License
GNU General Public License v3.0 or later (GPL-3.0-or-later). See LICENSE.
© Unity AI Lab.