A complete snapshot of the Mixamo library: 2,317 motion clips and
114 rigged characters, exported as binary FBX (FBX 7.7 / fbx7_2019) with per-file metadata.
All animations share one uniform 65-joint mixamorig skeleton, so any clip can drive any
compatible character without remapping.
Use animation_motion/ and character_refined/. The full export contains 2,446 animation
files, but 129 are single-pose assets that carry no motion (Mixamo's *_Pose* library, plus
T-Pose and Leaning); animation_motion/ is the 2,317 that actually move.
animation_motion/ 2,317 .fbx clips that move <- use this
animation/ 2,446 .fbx the full export, poses included
character/ 114 .fbx T-pose characters with skin mesh, as exported
character_refined/ 114 .fbx same characters, bone namespaces normalised <- use this
character_refined_glb/ 114 .glb character_refined/ converted to GLB, same stems
character_tpose/ 114 .png rest-pose render grid per character
animation_motion_ybot/ 2,317 .fbx every moving clip baked onto Y Bot β mesh + motion
in one ready-to-play file
animation_motion_render/ 2,317 dirs four-view render of every moving clip on Y Bot
(MP4 + camera JSON per view)
animation_motion_prompts.json filename -> text label + Mixamo id, 2,317 entries
animation_motion_frames.json filename -> keyframe count, 2,317 entries
static_clips.csv the 129 files left out, with the measurement behind it
animation_prompts.json the same, over all 2,446
animation_frames.json the same, over all 2,446
animation_bones.json the 65 bone names used by every animation
metadata.csv browsable index of all 2,446 animations
characters.csv browsable index of all 114 characters
characters.json filename -> character name + uuid
character_bones.json filename -> that character's bone list
character_bone_fix_applied.txt the 27 characters whose bones were renamed
character_nonstandard_rig.txt the 4 characters not using `mixamorig:` naming
scripts/ download, indexing, normalisation and validation code
Every JSON index is keyed by FBX filename and maps 1:1 onto the files. The animation_motion_*
pair covers exactly the 2,317 files in animation_motion/; the unsuffixed pair covers all 2,446.
Files in animation_motion/ are the same bytes as their counterparts in animation/.
The 129 pose files were found by decoding every animation curve and measuring its peak-to-peak
range, not by filename β the split is unambiguous (largest static reading 0.024, smallest moving
one 1.115, nothing between). Quiet clips like breathing idles and held guards are kept.
static_clips.csv lists all 129 with the measurement and the reason.
Two CSVs make the dataset browsable in the dataset viewer and loadable without downloading any
FBX. metadata.csv β one row per animation, covering all 2,446 files:
| column | meaning |
|---|---|
file | path to the FBX, e.g. animation/Jab_Cross.fbx |
prompt | Mixamo's catalogue name |
description | Mixamo's longer description (empty for 51 clips) |
text | description if present, else prompt β a ready-to-use label |
frames | keyframe count |
motion_id | Mixamo motion UUID |
characters.csv β one row per character, with bone_count and covers_animation_rig
(true for the 97 characters whose skeleton covers all 65 animation bones).
from datasets import load_dataset
anims = load_dataset("Linzhan/Mixamo-Animations-Characters", "animations", split="train")
chars = load_dataset("Linzhan/Mixamo-Animations-Characters", "characters", split="train")
mid = anims.filter(lambda r: 30 <= r["frames"] <= 300) # 1β10 s at 30 fps
ok = chars.filter(lambda r: r["covers_animation_rig"] == "true") # drop-in retargetable
mixamorig rig in every clipanimation_motion/Files are named after the motion, e.g. Jab_Cross.fbx; distinct motions sharing a Mixamo name
get a numeric suffix (Waving.fbx, Waving_2.fbx).
animation_motion_prompts.json"180_Turn_W_Briefcase.fbx": {
"prompt": "180 Turn W/ Briefcase",
"description": "180 Turn With Briefcase",
"motion_id": "c9c9f110-b96c-11e4-a802-0aaa78deedf9"
}
| field | meaning |
|---|---|
prompt | Mixamo's catalogue name. Present for every clip; short (mean 2.6 words), sometimes abbreviated (W/, 2hand, L/R) |
description | Mixamo's longer description; fuller and usually more specific. Present for every entry β filled with prompt where Mixamo ships none, so it can be read without a fallback |
motion_id | Mixamo's internal motion UUID |
For text-conditioned tasks, description or prompt is the more discriminative label
(2,134 unique strings vs 1,541 from prompt alone).
animation_motion_frames.json"180_Turn_W_Briefcase.fbx": 68 β keyframe count parsed from each FBX, not a nominal duration.
animation_bones.json{ "mixamo": ["mixamorig:Head", "mixamorig:HeadTop_End", "mixamorig:Hips", ...] } β the 65
bone names present in every animation: hips/spine/neck/head chain, both arms with full
four-joint fingers, and both legs with toes.
animation_motion_ybot/)The raw animation FBXs carry no mesh, so this folder ships every clip in animation_motion/
baked onto character_refined/Y_Bot.fbx β the character whose skeleton the animations are
authored on, so no retargeting touches the motion. One FBX per clip, same stems as
animation_motion/: armature, skinned mesh, materials and the full-length clip in a single
ready-to-play file (~3 MB each, 6.8 GB total). Drop one into Blender or any FBX viewer and
press play; these are also the exact inputs the renders below were made from.
animation_motion_render/)A four-view render of every clip in animation_motion/, driven on Y Bot
(the files in animation_motion_ybot/). One folder per clip, named after the FBX stem:
animation_motion_render/Jab_Cross/
v000.mp4 v000.json front (azimuth -90Β°)
v001.mp4 v001.json back (azimuth +90Β°)
v002.mp4 v002.json left (azimuth 180Β°)
v003.mp4 v003.json right (azimuth 0Β°)
Rendered with Blender EEVEE at 512Γ512, 30 fps, elevation 0, and composed into one H.264 MP4
per view β the transparent-film frames flattened onto a light-grey background, since H.264
carries no alpha. The MP4s preview each motion directly on the Hub; the per-frame RGBA PNGs
behind them are not hosted (they would add over 800k files), so extract stills from the MP4s
(ffmpeg -i v000.mp4 frames/%04d.png) if you need them.
Rendering covers the first 200 frames of a clip (~6.7 s); 375 of the 2,317 clips are longer
and are truncated β frame_start/frame_end in the per-view JSON record the covered range.
Frame counts otherwise match animation_motion_frames.json exactly.
Each v00X.json holds the camera in NeRF convention: view, azimuth/elevation (radians),
resolution, camera_angle_x (horizontal FoV, radians), the 4Γ4 camera-to-world
transform_matrix, the scene_scale/scene_offset that normalised the character into frame,
and frame_start/frame_end/fps.
characters.json maps each file to its Mixamo name and uuid; character_bones.json lists the
actual bone names per character.
character/ vs character_refined/27 of the 114 characters export with a numbered bone namespace β mixamorig1:Hips instead
of mixamorig:Hips β which does not match the animations, so retargeting silently fails.
character/ keeps the files exactly as exported; character_refined/ renames the namespace
back to mixamorig: with a surgical binary-FBX rewrite that leaves every non-string property
byte-identical (verified both ways by scripts/verify_refined.py). Use character_refined/.
The affected files are listed in character_bone_fix_applied.txt.
character_refined_glb/The same 114 characters converted one-to-one to GLB β mesh, rig and materials with textures embedded, no animation β for toolchains that read glTF rather than FBX. Same stems as the FBXs.
character_tpose/One 1024Γ1024 PNG per character, named after the FBX stem: a 2Γ2 grid of its rest pose β
front and back on the top row, left and right below β rendered (EEVEE) from
character_refined/. A visual index of the 114 characters.
| count | notes | |
|---|---|---|
| Cover all 65 animation bones | 97 / 114 | drop-in retargetable |
Reduced mixamorig rig | 13 | 37β64 bones, nearly always fewer finger joints. Retargeting works; absent bones simply receive no data |
| Different bone naming | 4 | listed in character_nonstandard_rig.txt; three use standard names with a different prefix, one (Aiden) uses 3ds Max Biped naming |
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 mixamo
bash data_process/scripts/run_export.sh mixamo
import json
prompts = json.load(open("animation_motion_prompts.json"))
frames = json.load(open("animation_motion_frames.json"))
# text label for a motion-conditioned model
text = {f: (v.get("description") or v["prompt"]) for f, v in prompts.items()}
# clips between 60 and 300 frames
clips = [f for f, n in frames.items() if 60 <= n <= 300]
Load an animation onto a character in Blender:
import bpy
bpy.ops.import_scene.fbx(filepath="character_refined/Adam.fbx")
bpy.ops.import_scene.fbx(filepath="animation_motion/Jab_Cross.fbx")
# both armatures now share the `mixamorig:` bone namespace
description; 23 of those share a prompt with other clips and cannot
be told apart from text alone. Even preferring description, 341 clips share a label with
another clip.animation_motion_prompts.json, Female/Male style prefixes and leading
Sequence - markers have been stripped from prompt/description β they describe
animation style, not motion semantics. animation_prompts.json, metadata.csv and the
filenames keep the original Mixamo labels.MotionPack bundles are excluded, as their constituent clips are present individually.Exported from Mixamo through its own export API (format=fbx7_2019, skin=false for
animations, skin=true for characters), retargeted onto the standard Y Bot skeleton. Every FBX
parses without truncation, every index key matches its file, and all names/ids were
cross-checked against the Mixamo API; scripts/ reproduces the download, the indexes and all
checks.
Mixamo content is provided by Adobe and remains subject to Adobe's Mixamo terms. This repository is a convenience mirror for research use; consult those terms before redistributing or using the assets in a product.
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:
@misc{mixamo_animations_characters,
title = {Mixamo Animations and Characters},
author = {Linzhan Mou},
year = {2026},
url = {https://huggingface.co/datasets/Linzhan/Mixamo-Animations-Characters},
note = {FBX motion clips and rigged characters exported from Adobe Mixamo}
}
A complete snapshot of the Mixamo library: 2,317 motion clips and
114 rigged characters, exported as binary FBX (FBX 7.7 / fbx7_2019) with per-file metadata.
All animations share one uniform 65-joint mixamorig skeleton, so any clip can drive any
compatible character without remapping.
Use animation_motion/ and character_refined/. The full export contains 2,446 animation
files, but 129 are single-pose assets that carry no motion (Mixamo's *_Pose* library, plus
T-Pose and Leaning); animation_motion/ is the 2,317 that actually move.
animation_motion/ 2,317 .fbx clips that move <- use this
animation/ 2,446 .fbx the full export, poses included
character/ 114 .fbx T-pose characters with skin mesh, as exported
character_refined/ 114 .fbx same characters, bone namespaces normalised <- use this
character_refined_glb/ 114 .glb character_refined/ converted to GLB, same stems
character_tpose/ 114 .png rest-pose render grid per character
animation_motion_ybot/ 2,317 .fbx every moving clip baked onto Y Bot β mesh + motion
in one ready-to-play file
animation_motion_render/ 2,317 dirs four-view render of every moving clip on Y Bot
(MP4 + camera JSON per view)
animation_motion_prompts.json filename -> text label + Mixamo id, 2,317 entries
animation_motion_frames.json filename -> keyframe count, 2,317 entries
static_clips.csv the 129 files left out, with the measurement behind it
animation_prompts.json the same, over all 2,446
animation_frames.json the same, over all 2,446
animation_bones.json the 65 bone names used by every animation
metadata.csv browsable index of all 2,446 animations
characters.csv browsable index of all 114 characters
characters.json filename -> character name + uuid
character_bones.json filename -> that character's bone list
character_bone_fix_applied.txt the 27 characters whose bones were renamed
character_nonstandard_rig.txt the 4 characters not using `mixamorig:` naming
scripts/ download, indexing, normalisation and validation code
Every JSON index is keyed by FBX filename and maps 1:1 onto the files. The animation_motion_*
pair covers exactly the 2,317 files in animation_motion/; the unsuffixed pair covers all 2,446.
Files in animation_motion/ are the same bytes as their counterparts in animation/.
The 129 pose files were found by decoding every animation curve and measuring its peak-to-peak
range, not by filename β the split is unambiguous (largest static reading 0.024, smallest moving
one 1.115, nothing between). Quiet clips like breathing idles and held guards are kept.
static_clips.csv lists all 129 with the measurement and the reason.
Two CSVs make the dataset browsable in the dataset viewer and loadable without downloading any
FBX. metadata.csv β one row per animation, covering all 2,446 files:
| column | meaning |
|---|---|
file | path to the FBX, e.g. animation/Jab_Cross.fbx |
prompt | Mixamo's catalogue name |
description | Mixamo's longer description (empty for 51 clips) |
text | description if present, else prompt β a ready-to-use label |
frames | keyframe count |
motion_id | Mixamo motion UUID |
characters.csv β one row per character, with bone_count and covers_animation_rig
(true for the 97 characters whose skeleton covers all 65 animation bones).
from datasets import load_dataset
anims = load_dataset("Linzhan/Mixamo-Animations-Characters", "animations", split="train")
chars = load_dataset("Linzhan/Mixamo-Animations-Characters", "characters", split="train")
mid = anims.filter(lambda r: 30 <= r["frames"] <= 300) # 1β10 s at 30 fps
ok = chars.filter(lambda r: r["covers_animation_rig"] == "true") # drop-in retargetable
mixamorig rig in every clipanimation_motion/Files are named after the motion, e.g. Jab_Cross.fbx; distinct motions sharing a Mixamo name
get a numeric suffix (Waving.fbx, Waving_2.fbx).
animation_motion_prompts.json"180_Turn_W_Briefcase.fbx": {
"prompt": "180 Turn W/ Briefcase",
"description": "180 Turn With Briefcase",
"motion_id": "c9c9f110-b96c-11e4-a802-0aaa78deedf9"
}
| field | meaning |
|---|---|
prompt | Mixamo's catalogue name. Present for every clip; short (mean 2.6 words), sometimes abbreviated (W/, 2hand, L/R) |
description | Mixamo's longer description; fuller and usually more specific. Present for every entry β filled with prompt where Mixamo ships none, so it can be read without a fallback |
motion_id | Mixamo's internal motion UUID |
For text-conditioned tasks, description or prompt is the more discriminative label
(2,134 unique strings vs 1,541 from prompt alone).
animation_motion_frames.json"180_Turn_W_Briefcase.fbx": 68 β keyframe count parsed from each FBX, not a nominal duration.
animation_bones.json{ "mixamo": ["mixamorig:Head", "mixamorig:HeadTop_End", "mixamorig:Hips", ...] } β the 65
bone names present in every animation: hips/spine/neck/head chain, both arms with full
four-joint fingers, and both legs with toes.
animation_motion_ybot/)The raw animation FBXs carry no mesh, so this folder ships every clip in animation_motion/
baked onto character_refined/Y_Bot.fbx β the character whose skeleton the animations are
authored on, so no retargeting touches the motion. One FBX per clip, same stems as
animation_motion/: armature, skinned mesh, materials and the full-length clip in a single
ready-to-play file (~3 MB each, 6.8 GB total). Drop one into Blender or any FBX viewer and
press play; these are also the exact inputs the renders below were made from.
animation_motion_render/)A four-view render of every clip in animation_motion/, driven on Y Bot
(the files in animation_motion_ybot/). One folder per clip, named after the FBX stem:
animation_motion_render/Jab_Cross/
v000.mp4 v000.json front (azimuth -90Β°)
v001.mp4 v001.json back (azimuth +90Β°)
v002.mp4 v002.json left (azimuth 180Β°)
v003.mp4 v003.json right (azimuth 0Β°)
Rendered with Blender EEVEE at 512Γ512, 30 fps, elevation 0, and composed into one H.264 MP4
per view β the transparent-film frames flattened onto a light-grey background, since H.264
carries no alpha. The MP4s preview each motion directly on the Hub; the per-frame RGBA PNGs
behind them are not hosted (they would add over 800k files), so extract stills from the MP4s
(ffmpeg -i v000.mp4 frames/%04d.png) if you need them.
Rendering covers the first 200 frames of a clip (~6.7 s); 375 of the 2,317 clips are longer
and are truncated β frame_start/frame_end in the per-view JSON record the covered range.
Frame counts otherwise match animation_motion_frames.json exactly.
Each v00X.json holds the camera in NeRF convention: view, azimuth/elevation (radians),
resolution, camera_angle_x (horizontal FoV, radians), the 4Γ4 camera-to-world
transform_matrix, the scene_scale/scene_offset that normalised the character into frame,
and frame_start/frame_end/fps.
characters.json maps each file to its Mixamo name and uuid; character_bones.json lists the
actual bone names per character.
character/ vs character_refined/27 of the 114 characters export with a numbered bone namespace β mixamorig1:Hips instead
of mixamorig:Hips β which does not match the animations, so retargeting silently fails.
character/ keeps the files exactly as exported; character_refined/ renames the namespace
back to mixamorig: with a surgical binary-FBX rewrite that leaves every non-string property
byte-identical (verified both ways by scripts/verify_refined.py). Use character_refined/.
The affected files are listed in character_bone_fix_applied.txt.
character_refined_glb/The same 114 characters converted one-to-one to GLB β mesh, rig and materials with textures embedded, no animation β for toolchains that read glTF rather than FBX. Same stems as the FBXs.
character_tpose/One 1024Γ1024 PNG per character, named after the FBX stem: a 2Γ2 grid of its rest pose β
front and back on the top row, left and right below β rendered (EEVEE) from
character_refined/. A visual index of the 114 characters.
| count | notes | |
|---|---|---|
| Cover all 65 animation bones | 97 / 114 | drop-in retargetable |
Reduced mixamorig rig | 13 | 37β64 bones, nearly always fewer finger joints. Retargeting works; absent bones simply receive no data |
| Different bone naming | 4 | listed in character_nonstandard_rig.txt; three use standard names with a different prefix, one (Aiden) uses 3ds Max Biped naming |
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 mixamo
bash data_process/scripts/run_export.sh mixamo
import json
prompts = json.load(open("animation_motion_prompts.json"))
frames = json.load(open("animation_motion_frames.json"))
# text label for a motion-conditioned model
text = {f: (v.get("description") or v["prompt"]) for f, v in prompts.items()}
# clips between 60 and 300 frames
clips = [f for f, n in frames.items() if 60 <= n <= 300]
Load an animation onto a character in Blender:
import bpy
bpy.ops.import_scene.fbx(filepath="character_refined/Adam.fbx")
bpy.ops.import_scene.fbx(filepath="animation_motion/Jab_Cross.fbx")
# both armatures now share the `mixamorig:` bone namespace
description; 23 of those share a prompt with other clips and cannot
be told apart from text alone. Even preferring description, 341 clips share a label with
another clip.animation_motion_prompts.json, Female/Male style prefixes and leading
Sequence - markers have been stripped from prompt/description β they describe
animation style, not motion semantics. animation_prompts.json, metadata.csv and the
filenames keep the original Mixamo labels.MotionPack bundles are excluded, as their constituent clips are present individually.Exported from Mixamo through its own export API (format=fbx7_2019, skin=false for
animations, skin=true for characters), retargeted onto the standard Y Bot skeleton. Every FBX
parses without truncation, every index key matches its file, and all names/ids were
cross-checked against the Mixamo API; scripts/ reproduces the download, the indexes and all
checks.
Mixamo content is provided by Adobe and remains subject to Adobe's Mixamo terms. This repository is a convenience mirror for research use; consult those terms before redistributing or using the assets in a product.
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:
@misc{mixamo_animations_characters,
title = {Mixamo Animations and Characters},
author = {Linzhan Mou},
year = {2026},
url = {https://huggingface.co/datasets/Linzhan/Mixamo-Animations-Characters},
note = {FBX motion clips and rigged characters exported from Adobe Mixamo}
}