Linzhan/Objaverse-XL-Rigged-Animated

Dataset

Objaverse-XL Rigged & Animated Subset

2

48 commits

1 linked in READMEs

updated Sep 7, 2026

See the code

README

Objaverse-XL Rigged & Animated Subset

Every asset here carries both a skeleton and at least one animation clip, selected from Objaverse / Objaverse-XL. Rigs range from 3 to 344 joints and span characters as well as articulated rigid objects.

Objaverse-XL indexes over 10 million objects, but only a small fraction carry a usable rig and motion on it. This subset isolates that fraction: every file was checked to contain at least one skin with joints and at least one animation clip that actually drives them.

Assets are provided exactly as downloaded — no filtering, retargeting, canonicalization or joint renaming has been applied — so you can run your own preprocessing on top. The accompanying tables expose the structural properties needed to plan that preprocessing, such as which assets have a disconnected skeleton or which clips are near-static.

assets7,373 (23 GB)
animation clips16,190 (~21.0 h)
assets with both rig and animation7,373 (100%)
single kinematic tree7,128 (96.7%) — 245 need pruning
joints per assetmin 3 · median 44 · p95 78 · max 344
clip durationmedian 2.03 s · p95 17.1 s · max 745 s
near-static clips (< 0.1 s)803
vertices per assetmedian 6,628 · p95 88,124 · max 1.52 M

Contents

glb/               7,373 .glb   assets, original filenames preserved
metadata.csv       one row per asset
animations.csv     one row per clip
excluded.csv       18 assets known to defeat processing
scripts/           the glTF probe that derives both tables

excluded.csv records the assets a processing pipeline should skip: 3 that no importer reads cleanly (corrupt rigs, singular transforms, NaN axis limits) and 15 whose animations are entirely static or too short to use, with the reason per row.

Renders live in a separate repository, Objaverse-XL-Rigged-Animated-Renders: a four-view MP4 of every animation clip (10,355 folders) and a 2×2 rest-pose grid per asset (tpose/, 7,373 PNGs, previously hosted here). Stems match, so both join back to the tables below without any name mangling.

Filenames are unchanged, so every asset maps back to its Objaverse entry:

patterncountmeaning
<24-hex>_{fbx,glb,gltf}.glb5,305Objaverse-XL (GitHub); suffix is the original format
<32-hex>.glb2,068Objaverse 1.0 / Sketchfab UID

metadata.csv

One row per asset, joined to animations.csv on file.

columnmeaning
filepath, e.g. glb/00064e6f….glb
object_id, id_familyObjaverse id and which family it came from
source_formatoriginal format before GLB conversion; empty for Sketchfab
num_vertices, num_meshes, num_nodesgeometry size
num_jointsrig size
num_skeleton_roots, single_treenumber of kinematic trees; single_tree is false when the asset needs single-tree pruning
num_animations, total_duration_sec, max_keyframesanimation budget
animated_jointsjoints driven by any clip — the union across all of them, so it can exceed the per-clip figure in animations.csv
generatorexporter string (Sketchfab-*, Khronos glTF Blender I/O *, …)

animations.csv

One row per animation, since motion datasets are counted in sequences rather than assets: file, object_id, clip_index, clip_name, duration_sec, keyframes, num_channels, animated_nodes, animated_joints, drives_skeleton.

drives_skeleton is the useful filter: 5,615 of 16,190 clips animate only non-joint nodes (object-level transforms rather than a character rig). Every asset has at least one clip that does drive its skeleton.

Usage

from datasets import load_dataset

assets = load_dataset("Linzhan/Objaverse-XL-Rigged-Animated", "assets", split="train")
clips  = load_dataset("Linzhan/Objaverse-XL-Rigged-Animated", "animations", split="train")

# assets needing no single-tree pruning, with a humanoid-scale rig
clean = assets.filter(lambda r: r["single_tree"] == "true" and 20 <= r["num_joints"] <= 100)

# clips that drive a skeleton and are not near-static
usable = clips.filter(lambda r: r["drives_skeleton"] == "true" and r["duration_sec"] >= 0.5)

Both tables are derived from each file's glTF JSON chunk by scripts/build_dataset.py, so they can be regenerated or extended without re-downloading anything.

Processing it into motion data

This repository is the raw layer. The pipeline that turns it into canonicalized, text-paired motion clips is open at UniMate/data_process: it exports each clip to NPZ, renders previews, captions them with a vision-language model, cleans the joint labels and derives the training features. The processed release built from it is UniML3D.

bash data_process/scripts/run_download.sh objaverse
bash data_process/scripts/run_export.sh objaverse

Licensing and attribution

The assets in glb/ were created by third parties and retain their individual upstream licences, which are heterogeneous: various Creative Commons terms for Sketchfab objects, and whatever applies to the GitHub-sourced ones. No blanket licence covers the collection and none is asserted here — publishing them is not a licence grant. Resolve the licence for a given object_id through the Objaverse-XL annotations before using or redistributing an asset.

The derived material — metadata.csv, animations.csv, scripts/ and this card — is offered under ODC-BY 1.0, matching the upstream Objaverse metadata. The renders in the companion repository are not covered by that grant: they depict the assets themselves, so they inherit each asset's upstream licence exactly as the GLB does.

Rights holders who want an asset removed can open an issue on this repository; see NOTICE.md for the full statement and the takedown process.

Citation

This dataset is part of UniML3D, the training corpus introduced in UniMate: One Unified Model to Animate Diverse Skeletons (SIGGRAPH Asia 2026; paper page). If you use it, please cite the paper:

@article{mou2026unimate,
  title   = {UniMate: One Unified Model to Animate Diverse Skeletons},
  author  = {Mou, Linzhan and Lei, Jiahui and Dou, Zhiyang and Cai, Chenyue and Song, Chaoyue and Finkelstein, Adam and Rusinkiewicz, Szymon},
  journal = {arXiv preprint arXiv:2609.05415},
  year    = {2026}
}

Please also cite this dataset repository and Objaverse-XL as the source of the assets:

@misc{objaverse_xl_rigged_animated,
  title  = {Objaverse-XL Rigged and Animated Subset},
  author = {Mou, Linzhan},
  year   = {2026},
  url    = {https://huggingface.co/datasets/Linzhan/Objaverse-XL-Rigged-Animated},
  note   = {Objaverse-XL assets carrying both a skeleton and animation, with derived metadata}
}

@inproceedings{deitke2023objaversexl,
  title     = {Objaverse-XL: A Universe of 10M+ 3D Objects},
  author    = {Deitke, Matt and Liu, Ruoshi and Wallingford, Matthew and others},
  booktitle = {Advances in Neural Information Processing Systems},
  pages     = {35799--35813},
  year      = {2023}
}
3d
animation
gltf
motion
objaverse
rigging
skeletal-animation

Linzhan/Objaverse-XL-Rigged-Animated

Dataset

Objaverse-XL Rigged & Animated Subset

2

48 commits

1 linked in READMEs

updated Sep 7, 2026

See the code

README

Objaverse-XL Rigged & Animated Subset

Every asset here carries both a skeleton and at least one animation clip, selected from Objaverse / Objaverse-XL. Rigs range from 3 to 344 joints and span characters as well as articulated rigid objects.

Objaverse-XL indexes over 10 million objects, but only a small fraction carry a usable rig and motion on it. This subset isolates that fraction: every file was checked to contain at least one skin with joints and at least one animation clip that actually drives them.

Assets are provided exactly as downloaded — no filtering, retargeting, canonicalization or joint renaming has been applied — so you can run your own preprocessing on top. The accompanying tables expose the structural properties needed to plan that preprocessing, such as which assets have a disconnected skeleton or which clips are near-static.

assets7,373 (23 GB)
animation clips16,190 (~21.0 h)
assets with both rig and animation7,373 (100%)
single kinematic tree7,128 (96.7%) — 245 need pruning
joints per assetmin 3 · median 44 · p95 78 · max 344
clip durationmedian 2.03 s · p95 17.1 s · max 745 s
near-static clips (< 0.1 s)803
vertices per assetmedian 6,628 · p95 88,124 · max 1.52 M

Contents

glb/               7,373 .glb   assets, original filenames preserved
metadata.csv       one row per asset
animations.csv     one row per clip
excluded.csv       18 assets known to defeat processing
scripts/           the glTF probe that derives both tables

excluded.csv records the assets a processing pipeline should skip: 3 that no importer reads cleanly (corrupt rigs, singular transforms, NaN axis limits) and 15 whose animations are entirely static or too short to use, with the reason per row.

Renders live in a separate repository, Objaverse-XL-Rigged-Animated-Renders: a four-view MP4 of every animation clip (10,355 folders) and a 2×2 rest-pose grid per asset (tpose/, 7,373 PNGs, previously hosted here). Stems match, so both join back to the tables below without any name mangling.

Filenames are unchanged, so every asset maps back to its Objaverse entry:

patterncountmeaning
<24-hex>_{fbx,glb,gltf}.glb5,305Objaverse-XL (GitHub); suffix is the original format
<32-hex>.glb2,068Objaverse 1.0 / Sketchfab UID

metadata.csv

One row per asset, joined to animations.csv on file.

columnmeaning
filepath, e.g. glb/00064e6f….glb
object_id, id_familyObjaverse id and which family it came from
source_formatoriginal format before GLB conversion; empty for Sketchfab
num_vertices, num_meshes, num_nodesgeometry size
num_jointsrig size
num_skeleton_roots, single_treenumber of kinematic trees; single_tree is false when the asset needs single-tree pruning
num_animations, total_duration_sec, max_keyframesanimation budget
animated_jointsjoints driven by any clip — the union across all of them, so it can exceed the per-clip figure in animations.csv
generatorexporter string (Sketchfab-*, Khronos glTF Blender I/O *, …)

animations.csv

One row per animation, since motion datasets are counted in sequences rather than assets: file, object_id, clip_index, clip_name, duration_sec, keyframes, num_channels, animated_nodes, animated_joints, drives_skeleton.

drives_skeleton is the useful filter: 5,615 of 16,190 clips animate only non-joint nodes (object-level transforms rather than a character rig). Every asset has at least one clip that does drive its skeleton.

Usage

from datasets import load_dataset

assets = load_dataset("Linzhan/Objaverse-XL-Rigged-Animated", "assets", split="train")
clips  = load_dataset("Linzhan/Objaverse-XL-Rigged-Animated", "animations", split="train")

# assets needing no single-tree pruning, with a humanoid-scale rig
clean = assets.filter(lambda r: r["single_tree"] == "true" and 20 <= r["num_joints"] <= 100)

# clips that drive a skeleton and are not near-static
usable = clips.filter(lambda r: r["drives_skeleton"] == "true" and r["duration_sec"] >= 0.5)

Both tables are derived from each file's glTF JSON chunk by scripts/build_dataset.py, so they can be regenerated or extended without re-downloading anything.

Processing it into motion data

This repository is the raw layer. The pipeline that turns it into canonicalized, text-paired motion clips is open at UniMate/data_process: it exports each clip to NPZ, renders previews, captions them with a vision-language model, cleans the joint labels and derives the training features. The processed release built from it is UniML3D.

bash data_process/scripts/run_download.sh objaverse
bash data_process/scripts/run_export.sh objaverse

Licensing and attribution

The assets in glb/ were created by third parties and retain their individual upstream licences, which are heterogeneous: various Creative Commons terms for Sketchfab objects, and whatever applies to the GitHub-sourced ones. No blanket licence covers the collection and none is asserted here — publishing them is not a licence grant. Resolve the licence for a given object_id through the Objaverse-XL annotations before using or redistributing an asset.

The derived material — metadata.csv, animations.csv, scripts/ and this card — is offered under ODC-BY 1.0, matching the upstream Objaverse metadata. The renders in the companion repository are not covered by that grant: they depict the assets themselves, so they inherit each asset's upstream licence exactly as the GLB does.

Rights holders who want an asset removed can open an issue on this repository; see NOTICE.md for the full statement and the takedown process.

Citation

This dataset is part of UniML3D, the training corpus introduced in UniMate: One Unified Model to Animate Diverse Skeletons (SIGGRAPH Asia 2026; paper page). If you use it, please cite the paper:

@article{mou2026unimate,
  title   = {UniMate: One Unified Model to Animate Diverse Skeletons},
  author  = {Mou, Linzhan and Lei, Jiahui and Dou, Zhiyang and Cai, Chenyue and Song, Chaoyue and Finkelstein, Adam and Rusinkiewicz, Szymon},
  journal = {arXiv preprint arXiv:2609.05415},
  year    = {2026}
}

Please also cite this dataset repository and Objaverse-XL as the source of the assets:

@misc{objaverse_xl_rigged_animated,
  title  = {Objaverse-XL Rigged and Animated Subset},
  author = {Mou, Linzhan},
  year   = {2026},
  url    = {https://huggingface.co/datasets/Linzhan/Objaverse-XL-Rigged-Animated},
  note   = {Objaverse-XL assets carrying both a skeleton and animation, with derived metadata}
}

@inproceedings{deitke2023objaversexl,
  title     = {Objaverse-XL: A Universe of 10M+ 3D Objects},
  author    = {Deitke, Matt and Liu, Ruoshi and Wallingford, Matthew and others},
  booktitle = {Advances in Neural Information Processing Systems},
  pages     = {35799--35813},
  year      = {2023}
}
3d
animation
gltf
motion
objaverse
rigging
skeletal-animation