TopX: Text-to-Motion for Unseen Skeletons from the Skeleton File Alone
Organizations: University of Southampton · MOGO AI · Nanjing University
Abstract
Text-to-motion models generate motion only for the skeletons they were trained on, while a new character arrives as a skeleton file and nothing else. We study text-to-motion for skeletons unseen in training, without clips of the character, templates, retargeting or fine-tuning. We present TopX, a 73M-parameter flow-matching transformer that generates joint rotations and a root trajectory for any skeleton from its kinematic tree, rest pose and joint names. Motion is normalised by the rest pose and the size of the skeleton, and the rest pose is encoded as a world-frame descriptor that is independent of how the rig's author oriented each joint, while rest conventions are randomised during training. Attention is factorised over the joints and the frames of a motion. Across joints, queries and keys are rotated by HK-RoPE, a heat-kernel rotary encoding of the skeleton graph that is defined for every tree and does not change with the order of its joints or the eigenbasis of its Laplacian; across frames, they are rotated by a rotary encoding of frame order. To evaluate this generalisation, we build SkelShift, which unifies four motion corpora under one codec and holds out whole skeletons, tree classes and species, so that each test bucket isolates one kind of skeleton shift: topology, joint count, body plan, species or rig source. It scores motion quality without a learned evaluator. A single model animates every benchmark skeleton (4--117 joints) directly from its skeleton file and generates up to 240 frames. On held-out game species its motion is about as close to the real clips as two halves of the real clips are to each other (kernel distance 0.127 against 0.124), and text-to-motion retrieval reaches R@1 0.953, compared with 0.929 for real motion. Project page: https://chdtevior.github.io/TopX-page/.
Figures & tables
| Bucket | Source | Unseen at test time | Clips dev / test | Rigs | Trees | Joints | TED | Reused motion |
| ID-clip | UniML3D | clips of training rigs | 70 / 172 | 135 | 79 | 10–60 | 0 | 26% |
| ID-tree | UniML3D | rigs whose tree is seen | 255 / 508 | 759 | 140 | 6–60 | 0 | 63% |
| OOD-tree | UniML3D | tree classes (bipeds, quadrupeds) | 213 / 320 | 333 | 266 | 11–60 | 2 | 15% |
| OOD-plan | UniML3D | tree classes of rare body plans | 40 / 62 | 70 | 63 | 5–60 | 5 | 2% |
| OOD-J 60 (Mixamo) | UniML3D | rigs of one 65-joint humanoid tree | 155 / 350 | 250 | 1 | 65 | 5 | 51% |
| OOD-J 60 (other) | UniML3D | rigs above the corpus’s joint range | 166 / 512 | 464 | 184 | 61–117 | 7 | 33% |
| UniMate tuned on FID kin | UniMate tuned on FID desc | |||||||||||||
| FID desc | FID kin | Pen. | FID desc | FID kin | Pen. | |||||||||
| Test clips | Clips | R–R | Ours | Uni. | Ours | Uni. | Ours | Uni. | Ours | Uni. | Ours | Uni. | Ours | Uni. |
| All | 1,062 | 0.48 | 4.83 | 6.06 | 2.00 | 2.05 | 0.24 | 0.33 | 4.83 | 4.32 | 2.00 | 2.52 | 0.24 | 0.28 |
| ID-clip | 172 | 2.83 | 7.18 | 9.09 | 2.40 | 2.49 | 0.25 | 0.34 | 7.18 | 5.96 | 2.40 | 2.57 | 0.25 | 0.27 |
| No training clip | 890 | 0.55 | 4.58 | 5.73 | 0.55 | 0.48 | 0.24 | 0.33 | 4.58 | 4.22 | 0.55 | 1.48 | 0.24 | 0.28 |
| novel motion | 453 | 1.13 | 9.63 | 10.70 | 1.15 | 0.89 | 0.27 | 0.35 | 9.63 | 7.95 | 1.15 | 2.17 | 0.27 | 0.29 |
| Bucket | Rigs / clips | KID desc (real–real) | Slip (real) | Pen. | Float (real) | Speed |
| ID-clip | 93 / 172 | 0.950 (0.455) | 0.309 (0.353) | 0.204 | 0.110 (0.128) | 0.87 |
| ID-tree | 504 / 508 | 0.145 (0.002) | 0.304 (0.349) | 0.172 | 0.021 (0.039) | 0.90 |
| OOD-tree | 218 / 320 | 1.74 (0.142) | 0.310 (0.366) | 0.200 | 0.045 (0.078) | 0.77 |
| OOD-plan | 45 / 62 | 10.9 (6.04) | 0.176 (0.280) | 0.251 | 0.106 (0.164) | 0.81 |
| OOD-J 60 (Mixamo) | 172 / 350 | 0.664 (0.874) | 0.311 (0.363) | 0.131 | 0.024 (0.050) | 0.82 |
| OOD-J 60 (other) | 351 / 512 | 0.240 (0.092) | 0.275 (0.333) | 0.162 | 0.021 (0.029) | 0.77 |
| Arm | OOD- tree | OOD- plan | New species | OOD- rig | Rest |
| Real | 0.142 | 6.04 | 104 | 0.914 | – |
| Full model | 1.78 | 11.1 | 82.4 | 1.01 | 0.44 |
| Learned frame table | 1.88 | 11.7 | 84.4 | 1.59 | – |
| Learned joint table | 1.87 | 11.5 | 83.7 | 1.12 | – |
| Eigenvectors + SignNet | 1.83 | 11.5 | 83.6 | 1.17 | – |
| augmentation | 1.95 | 12.1 | 91.8 | 1.03 | 0.89 |
Appendix figures & tables14 assets
Supplementary material from the paper’s appendix.
Appendix
| Slice | Content | Rows |
| 0:3 | position: XZ from the smoothed root track, Y absolute | all |
| 3:9 | rotation , continuous 6D | all |
| 9:12 | world velocity (supervision only) | all |
| 12 | contact: height , speed /s | all |
| 13:15 | smoothed root track XZ | root |
| 15:17 | heading | root |
| Width , blocks , heads | 512, 10, 8 (73.3M parameters) |
| Frames | 1 rest frame + target frames |
| Heat-kernel diffusion times | , |
| Temporal rotary base | 700 |
| Caption dropout | 0.1 |
| Epochs, draws per epoch | 600, 55,984 (437 steps of 128; the last 48 dropped) |
| Optimiser | AdamW, weight decay 0.01 |
| Bucket | T0 | T1 | T2a | T2b |
| ID-clip, ID-tree | 1,005 | – | – | – |
| OOD-tree | – | 169 | 145 | 219 |
| OOD-plan | – | 8 | 32 | 62 |
| OOD-J 60 (Mixamo) | – | 505 | – | – |
| OOD-J 60 (other) | – | 356 | 120 | 202 |
| OOD-J 5 | – | 1 | – | 1 |
| FID desc | Skate | Slide | Cov. | Pen. | Float | Speed | KID desc | |
| Real clips | – | 0.254 | 1.71 | 0.442 | 0.000 | 0.050 | 1 | 0.091 |
| 1.88 | 0.231 | 1.60 | 0.452 | 0.179 | 0.025 | 0.78 | 0.149 | |
| 1.71 | 0.243 | 1.74 | 0.441 | 0.170 | 0.030 | 0.84 | 0.142 | |
| 1.79 | 0.260 | 2.02 | 0.417 | 0.172 | 0.039 | 0.95 | 0.176 |
| Evaluations | Seconds | |
| TopX, 20 steps | 40 | 0.67 |
| TopX, 50 steps | 100 | 1.63 |
| TopX, 100 steps | 200 | 3.23 |
| TopX, 200 steps | 400 | 6.43 |
| TopX, 400 steps | 800 | 12.82 |
| UniMate, guidance 3 | 366.4 | 6.13 |
| FID desc | FID kin , Motion2Motion | FID kin , Bailando | ||||||
| Test clips | Clips | Ours | UniMate | R–R | Ours | UniMate | Ours | UniMate |
| All | 1,062 | 4.83 | 6.06 | 0.48 | 2.00 | 2.05 | 1.85 | 1.90 |
| ID-clip | 172 | 7.18 | 9.09 | 2.83 | 2.40 | 2.49 | 2.10 | 2.14 |
| No training clip | 890 | 4.58 | 5.73 | 0.55 | 0.55 | 0.48 | 0.56 | 0.44 |
| novel motion | 453 | 9.63 | 10.70 | 1.13 | 1.15 | 0.89 | 1.05 | 0.77 |
| reused motion | 437 | 0.65 | 1.64 | 0.60 | 0.06 | 0.24 | 0.08 | 0.27 |
| Pen. | Skate | Cov. | Speed | |||||||
| Test clips | Ours | UniMate | Ours | UniMate | Real | Ours | UniMate | Real | Ours | UniMate |
| All | 0.24 | 0.33 | 0.33 | 0.35 | 0.35 | 0.60 | 0.58 | 0.64 | 0.93 | 1.08 |
| ID-clip | 0.25 | 0.34 | 0.34 | 0.37 | 0.33 | 0.52 | 0.51 | 0.55 | 0.98 | 1.23 |
| No training clip | 0.24 | 0.33 | 0.33 | 0.34 | 0.35 | 0.61 | 0.59 | 0.66 | 0.92 | 1.06 |
| novel motion | 0.27 | 0.35 | 0.26 | 0.33 | 0.30 | 0.52 | 0.47 | 0.57 | 0.90 | 1.13 |
| reused motion | 0.23 | 0.32 | 0.39 | 0.35 | 0.39 | 0.69 | 0.70 | 0.75 | 0.94 | 1.02 |
| FID desc | FID kin M2M | FID kin Bk. | Pen. | Skate | Speed | |||||||||
| Test clips | Clips | Ours | Uni. | Ours | Uni. | Ours | Uni. | Ours | Uni. | Ours | Uni. | Real | Ours | Uni. |
| All | 1,062 | 4.83 | 4.32 | 2.00 | 2.52 | 1.85 | 2.18 | 0.24 | 0.28 | 0.33 | 0.24 | 0.35 | 0.93 | 0.85 |
| ID-clip | 172 | 7.18 | 5.96 | 2.40 | 2.57 | 2.10 | 2.22 | 0.25 | 0.27 | 0.34 | 0.25 | 0.33 | 0.98 | 0.93 |
| No training clip | 890 | 4.58 | 4.22 | 0.55 | 1.48 | 0.56 | 1.13 | 0.24 | 0.28 | 0.33 | 0.24 | 0.35 | 0.92 | 0.83 |
| novel motion | 453 | 9.63 | 7.95 | 1.15 | 2.17 | 1.05 | 1.70 | 0.27 | 0.29 | 0.26 | 0.21 | 0.30 | 0.90 | 0.83 |
| reused motion | 437 | 0.65 | 1.21 | 0.06 | 0.72 | 0.08 | 0.47 | 0.23 | 0.27 | 0.39 | 0.27 | 0.39 | 0.94 | 0.83 |
| Method | FID desc | Skate | Slide | Cov. |
| Rigs unseen by all three: capybara and emu, 6 rigs, 635 clips | ||||
| Real clips | – | 0.213 | 1.03 | 0.199 |
| AnyTop † [ 12 ] | 24.63 | 0.759 | 10.65 | 0.358 |
| UniMate [ 31 ] | 3.32 | 0.268 | 1.59 | 0.220 |
| TopX | 1.19 | 0.208 | 1.27 | 0.234 |
| Trained on by both baselines: 6 Truebones rigs, 62 clips | ||||
| Bucket | Rigs / clips | Real–real | Full | Frame table | Joint table | Eigvec. + SignNet | aug. |
| OOD-tree | 218 / 320 | 0.142 | 1.78 0.03 | 1.88 0.03 | 1.87 0.04 | 1.83 0.03 | 1.95 0.04 |
| OOD-plan | 45 / 62 | 6.04 | 11.1 0.2 | 11.7 0.1 | 11.5 0.3 | 11.5 0.2 | 12.1 0.2 |
| OOD-new-species ∗ | 9 / 47 | 104 | 82.4 0.8 | 84.4 1.0 | 83.7 0.7 | 83.6 1.3 | 91.8 1.8 |
| OOD-rig ∗ | 6 / 62 | 0.914 | 1.01 0.11 | 1.59 0.04 | 1.12 0.11 | 1.17 0.15 | 1.03 0.03 |
| Mesh (author) | Licence | Figure |
| Defeat Idle (vicente betoret ferrero) | CC BY 4.0 | 2 (a) |
| Lowpoly Dog Walk (timesen) | CC BY 4.0 | 2 (a) |
| Dey Flair Dancing (jdey123) | CC BY 4.0 | 2 (a) |
| Back Flip To Uppercut (1) (marcolinadesign) | CC BY 4.0 | 2 (a) |
| Low poly fox running animation (dragonsnap) | CC BY 4.0 | 3 |
| fario3 (masterdef) | CC BY 4.0 | 3 |
| All | Emu | |||
| R@1 | Shuf. | R@1 | Shuf. | |
| Real clips, first 60 frames | 0.896 | – | 0.871 | – |
| Real clips, full length | 0.929 | – | 0.933 | – |
| TopX, generating 60 frames | 0.915 0.007 | 0.122 | 0.928 0.006 | 0.137 |
| TopX, clip length, first 60 frames | 0.932 0.007 | 0.113 | 0.922 0.016 | 0.127 |
| TopX, clip length, full | 0.953 0.004 | 0.120 | 0.954 0.013 | 0.137 |
Text-to-Motion Generation
Text-to-motion generation converts natural-language descriptions into semantically aligned, temporally coherent 3D human movement.
See all 96 papers