← Back to archive

Repo of the Day

Friedrich-M/UniMate

Published: Nov 8, 2026

Open repository ↗

[SIGGRAPH Asia 2026] UniMate: One Unified Model to Animate Diverse Skeletons

Summary

Friedrich-M/UniMate is a Python implementation of a unified text-to-motion model for rigged 3D assets. It includes training and inference code, the UniML3D dataset and processing tools, and released checkpoints; the documented goal is to animate different skeleton topologies without retraining a model for each rig or optimizing at test time.

What it is useful for

UniMate turns a short text prompt into articulated motion for bipedal, quadrupedal, avian, marine, insectoid, serpentine, and articulated rigid-object rigs. The bundled examples cover a Mixamo humanoid, Truebones reindeer, Objaverse assets such as Garfield, Gundam, Baymax, and a flower, plus custom-processed Unitree Go2, eagle, and shark assets. That makes it useful for generating motion for existing dataset skeletons or bringing a new rigged GLB, glTF, or FBX asset into a text-driven animation workflow.

The same checkpoint supports three constrained tasks without more training: motion in-betweening from pinned keyframes, text-guided editing that keeps selected joints fixed, and motion expansion that chains prompts with overlapping frames. UniML3D is also a training resource, containing 13,769 text-paired clips across 7,430 skeletons with canonicalized training features and annotation exports.

There are important boundaries. The README calls UniMate an early step and says many motions and skeletons still fail. Prompts should be short, start with “An object,” and describe one action. Some Objaverse rigs and clips have defective poses or stitched actions and can destabilize training. The full dataset download is about 88 GB, and the Truebones motion pack cannot be redistributed; it must be purchased and rebuilt locally. Code is MIT-licensed, while released checkpoints are CC BY-NC 4.0.

How engineers can use it

Start with the README’s shared Conda environment:

conda create -n unimate python=3.10 -y
conda activate unimate
pip install "setuptools<81"
pip install -r requirements.txt --no-build-isolation

Download a released checkpoint into outputs/:

hf download Linzhan/UniMate --repo-type model --local-dir outputs \
  --include "unimate_uniml3d_f60_v3/*.json" --include "unimate_uniml3d_f60_v3/*.npy" \
  --include "unimate_uniml3d_f60_v3/checkpoints/checkpoint_step_150000.pt"

For a custom rig, follow data_process/rig_preprocess/README.md. It converts a rigged asset into an asset directory, labels joints, and pauses for review of labels and facing; that review should not be skipped. Inference can then use the provided custom asset:

python -m unimate.inference.sample --exp_dir outputs/unimate_uniml3d_f60_v3 \
  --asset assets/examples/unitree_go2 --prompt "An object trots forward." \
  "An object rears up on its hind legs." --output_dir outputs/samples/custom
bash scripts/run_animate_motion.sh outputs/samples/custom

For training, download the features/* data or build it with stage 4 of the processing pipeline, then launch a documented configuration:

accelerate launch -m unimate.training.train --config configs/uniml3d_60frames_graph_adaln.json

Each run writes its resolved configuration, normalization statistics, checkpoints, debug samples, and TensorBoard logs under outputs/<experiment>/.