music-to-3d choreography → vrchat avatars
AI Dance Animation for VRChat
mvnt Studio generates 3D choreography from music in the browserand exports BVH or FBX.Getting that motion onto a VRChat avatar is a Unity job — here is the whole path.
VRChat is Unity with extra rules
Everything you upload to VRChat as an avatar is built in a Unity project with the VRChat SDK, installed through the Creator Companion. That has two consequences for anyone looking for AI dance animation for VRChat. First, every Unity import rule applies: metres, Y-up, the Rig tab, the Scale Factor field. Second, a clip sitting in your project does nothing on its own — VRChat plays avatar animation through playable layers described by the Avatar Descriptor, and a dance has to be wired into one of them and given something to trigger it.
mvnt Studio handles the generation half: it is a music-to-3D-choreography tool that reads a track — YouTube, Suno, and SoundCloud are among the supported sources — and produces a dance scene in the browser with nothing to install. Sign in and you can download the result as BVH or FBX, with GLB coming soon. There is no VRChat integration and no upload path from Studio; the file goes into your avatar project and up through the SDK like any other asset you made yourself.
Which download to take
The destination is a Unity project, so the format question answers itself — but the BVH is still worth having if you retarget, and GLB is coming soon.
FBX Use this one
Your avatar project is a Unity project, and Unity reads FBX natively. Importing the FBX gives you the Model, Rig, and Animation tabs, which is where the Humanoid setting and the scale factor live. Nothing about the VRChat SDK changes this — it sits on top of Unity’s import pipeline rather than replacing it.
BVH For Blender retargeting
BVH holds joint rotations and no geometry. Reach for it when you want to drive an armature you already have — import into Blender, retarget onto your avatar’s armature, and export FBX from there. If you are not retargeting in a DCC, you do not need this file.
GLB Coming soon
GLB is not available to download yet. Unity does not read GLB without a third-party package either, so a .glb would not be directly useful inside an avatar project. When it ships it will be a fast way to check the motion outside Unity — in any glTF viewer, or in Blender.
What actually stops people
Half of these are Unity problems and half are VRChat problems. The VRChat half is where most of the lost evenings are.
1. Humanoid is not optional here
On the Rig tab, set Animation Type to Humanoid. VRChat’s avatar IK and the standard emote setup are built on Unity’s humanoid Avatar system, and a Generic rig gives up the features that make an avatar an avatar. Practically this also means the same requirements Unity has anywhere else: hips, spine, head, and both arms and legs down to hands and feet must map, a rest pose close to T-pose gives you a clean Avatar, and any red slot in Configure has to be assigned by hand before the mapping is usable.
2. Humanoid clips retarget, Generic clips do not
A Humanoid AnimationClip is stored in Unity’s normalised muscle space, which is why the same dance can play on avatars with wildly different proportions. A Generic clip is bound to the exact transform paths it was authored against, so dropping one onto someone else’s avatar produces no motion at all rather than an obvious error. If you plan to share the emote or use it on more than one avatar, the clip has to come in as Humanoid.
3. Retargeting drift on unusual proportions
Muscle-space retargeting normalises by bone length rather than by absolute position, so contact points are approximate. A clap, a hand on the hip, a hand brushing the floor — these land accurately on a body close to the source proportions and drift on very tall, very short, or long-armed avatars. There is no setting that fixes this; it is a property of how humanoid retargeting works. Preview the dance on the specific avatar rather than assuming, and prefer choreography with fewer self-contact beats if the avatar is unusually proportioned.
4. The clip has to live on the Action layer
The Avatar Descriptor exposes playable layers, and a full-body dance belongs on Action. That layer is designed to take over the whole body and override locomotion while it runs, which is exactly what an emote needs. FX is the layer for things that do not move transforms — materials, blendshapes, toggles — so putting a dance there is the wrong tool. You build an Animator Controller for the Action layer, add a state that plays your clip, and transition into it.
5. Tracking control, or the dance only half plays
This is the most common single symptom people describe: the legs dance and the upper body stubbornly follows the headset and controllers. In VR, your tracked joints drive the avatar, and animation does not override that by default. The standard emote pattern is to add a VRC Animator Tracking Control behaviour on the state that starts the dance, switching head, hands, hips, and feet from Tracking to Animation, and a matching behaviour on exit that switches them back. Pair it with a VRC Playable Layer Control that raises the Action layer weight when the emote starts and lowers it when it ends. Miss either and the emote looks broken in VR while appearing fine in desktop mode, which is why it so often ships broken.
6. Write Defaults consistency
Keep the Write Defaults setting consistent across the states in a controller. Mixing it produces properties that stick after a state exits — an arm that stays raised after the dance ends, a toggle that will not clear — and the resulting bugs are intermittent enough to be genuinely hard to trace back. Pick one convention for the controller and hold it.
7. Editing an imported clip
The AnimationClip inside an imported FBX is read-only. Expand the FBX in the Project window, select the clip, and duplicate it to get a writable copy you can edit in the Animation window or reference from a controller you intend to modify. People often lose time here believing the clip is corrupt when it is simply nested inside an imported asset.
Setting it up as an emote
From download to a menu button you can press in game.
- 1 Export FBX from Studio. Generate the dance from your track in mvnt Studio, sign in, and download the FBX.
- 2 Import into the avatar project. Drop the FBX into the Unity project that has the VRChat SDK. On the Model tab check the scale against your avatar; on the Rig tab set Animation Type to Humanoid and resolve any red slots in Configure.
- 3 Get a writable clip. Expand the imported FBX in the Project window and duplicate the AnimationClip so you have a copy you can edit and reference freely.
- 4 Build the Action layer state. In the Animator Controller assigned to the avatar’s Action playable layer, add a state that plays the clip, with transitions in and out driven by a parameter.
- 5 Add the state behaviours. On the entry state, add VRC Animator Tracking Control set to Animation for head, hands, hips, and feet, plus VRC Playable Layer Control to bring the Action layer to full weight. Reverse both on exit.
- 6 Expose it in the menu. Add an expression parameter for the emote and a menu entry that drives it, so the dance can be triggered in game rather than only in the editor.
- 7 Test, then publish. Test in play mode and, ideally, in VR before uploading — tracking control problems are invisible in desktop mode. Then build and publish through the SDK.
Symptom to cause
The fast diagnosis list.
- The legs dance but the arms and head follow my controllers
- No VRC Animator Tracking Control on the state, or it is not switching hands and head to Animation.
- Nothing happens at all when the emote triggers
- The Action layer weight was never raised, or the clip is Generic rather than Humanoid and binds to nothing on this avatar.
- Something stays stuck after the dance ends
- Inconsistent Write Defaults across states, or a missing exit behaviour that never restores tracking or layer weight.
- The clip cannot be edited
- It is still inside the imported FBX. Duplicate it to make a writable copy.
- The choreography looks fine on one avatar and off on another
- Humanoid retargeting drift from differing limb proportions. Preview per avatar; there is no global fix.
Why generate rather than buy a dance asset
Bought emote packs are fixed to whatever song they were built for. Generating from a track means the motion is aligned to that track.
AI dance animation for VRChat — common questions
- Can I import a GLB dance straight into VRChat?
- No. VRChat avatars are built and uploaded from a Unity project, and Unity does not read GLB without a third-party package. Download the FBX for the avatar project.
- Does the rig have to be Humanoid?
- For a dance emote on a humanoid avatar, yes. VRChat’s IK and the standard emote layers are built on Unity’s humanoid Avatar system, and only Humanoid clips retarget across avatars. A Generic clip is bound to the specific transform hierarchy it was authored on and will not drive a different avatar.
- Why does only the lower body follow my dance animation?
- In VR your tracked head and hands keep driving those joints unless the animation explicitly takes them over. Add a VRC Animator Tracking Control behaviour to the state that plays the emote, switching head, hands, hips, and feet from Tracking to Animation, and add the reverse on exit.
- Which playable layer should a dance emote go on?
- Action. It is the layer intended to override locomotion and drive the whole body for the duration of an emote. Keep FX for material, blendshape, and toggle work.
- Will the dance look the same on every avatar?
- Close, but not identical. Unity’s humanoid retargeting normalises by bone length, so poses transfer well while contact points — claps, hands on hips, a hand near the floor — drift on avatars with unusual proportions. Preview on the actual avatar before publishing.
- Does the export include the music?
- No. BVH and FBX carry motion and, in the case of FBX, geometry — not audio. The song is handled separately, and you remain responsible for having the rights to use it wherever the dance ends up.