# anymove

Adopt this skill: https://proskills.md/skills/other/patch-gg-anymove-skills-anymove

Page: https://proskills.md/skills/other/patch-gg-anymove-skills-anymove
This document is the public skill bundle for that page. It contains SKILL.md and every helper file the catalog carries. No login is required.

## File: skills/anymove/SKILL.md
size: 6052
sha: 6954e2413a5185b85b864ee48ed1ab3fcd0b3e70
upstream: https://github.com/patch-gg/anymove/blob/main/skills/anymove/SKILL.md

````text
---
name: anymove
description: Motion capture for any creature from one AI video, with the anymove repo. A video model films a rigged 3D creature from two cameras in one frame, a DINOv2 joint reader trained on that creature finds every joint in both views, and the rig is fitted to them and exported as a GLB. Use when someone wants to animate a non-human creature (dragon, spider, wolf, monster) from a text prompt or an AI video, asks how anymove works, or needs to know which step comes next; it routes to anymove-rig, anymove-film, anymove-reader, anymove-capture, anymove-pack and anymove-lora.
license: Apache-2.0
compatibility: Needs an NVIDIA GPU with CUDA (12 GB to train a reader, 24 GB is safer), Blender 5.x, Python 3.11, and a fal.ai key for video generation. Runs on Linux and on Windows in Git Bash.
---

# anymove

Animate any rigged creature from one AI video. The trick is the frame: one image holds two orthographic views of the
creature at the same scale, front on the left and side on the right, sharing the vertical axis. A joint sits on the
same pixel row in both halves, so the front view gives left-right and height, the side view gives front-back and
height, and together they pin the joint in 3D. The method is @CanItCode's; the LoRA step is @Graalitoo's idea.

## The pipeline

| step | once per | what happens | skill |
|---|---|---|---|
| 1. mesh | creature | a textured 3D model (Tripo H3.1 from one image, or your own GLB), facing -Y, real size | anymove-rig |
| 2. skeleton | creature | joints placed in `assets/<c>/rig.json`, rig built and skinned in Blender | anymove-rig |
| 3. limb colours | creature | each limb painted its own colour so left and right never swap | anymove-rig |
| 4. two cameras | move | the painted reference frame plus a strict prompt go to MiniMax H3 Max on fal | anymove-film |
| 5. teach a reader | creature | 2,200 random poses rendered with known joints; DINOv2 learns this creature | anymove-reader |
| 6. read every joint | clip | the reader finds every joint in both views, every frame | anymove-capture |
| 7. two views, 3D | clip | shared heights tie the views; the pair gives each joint in 3D | anymove-capture |
| 8. the rig follows | clip | forward kinematics in torch fitted to both views; GLB out | anymove-capture |
| 9. the pack | creature | score the takes, keep the best, cut loops and root motion; one GLB with every move | anymove-pack |
| optional | creature | a MiniMax H3 LoRA that keeps the two-camera layout and colours more reliably | anymove-lora |

## Before anything

0. **Check it's the right tool.** If the person only wants a creature, look in Patch's Assets first: nine are ready.
   anymove suits big single gestures, and doesn't do eight-legged walking, lying down, bird wings or tail swipes (see the
   README). Check there's an NVIDIA card before anything else; without one, stop and say so.
1. Work in an anymove checkout. If the working directory has no `tools/capture.sh`, clone it:
   `git clone https://github.com/Patch-gg/anymove && cd anymove`.
2. Set up once: `python3.11 -m venv .venv`, then
   `.venv/bin/pip install torch==2.11.0 --index-url https://download.pytorch.org/whl/cu128` and
   `.venv/bin/pip install -r requirements.txt`. Blender 5.x must be on PATH, or set `BLENDER=/path/to/blender`.
   **On Windows,** run everything in Git Bash, use `py -3.11 -m venv .venv` and `.venv/Scripts/` where these say
   `.venv/bin/`, and set `BLENDER`. `tools/*.sh` handle the rest. If you call Blender yourself rather than through them,
   give it absolute paths: on Windows it reads a relative output path from the drive root.
3. For video generation and LoRA training, put `FAL_KEY=...` in `.env` (git ignores it) or export it. Never print it.
4. Every command takes a creature name; its config is `assets/<c>/creature.json` and every output lands in
   `runs/<c>/` (reference frame, dataset, `reader.pt`, videos, clips). The scripts set `MOCAP_CREATURE` for you; when
   you run a `python -m mocap...` module by hand, set `MOCAP_CREATURE=assets/<c>` first, or the wolf's layout applies.

## Which step next

- No `assets/<c>/model.glb`: make or fetch the mesh. Examples: `tools/fetch_examples.sh <c>` (wolf, dragon, spider,
  demon). New creature: anymove-rig.
- No `assets/<c>/rigged/rigged.blend` or `runs/<c>/ref/ref.png`: `tools/prep.sh <c>` then `tools/rig.sh <c>`
  (anymove-rig).
- No `runs/<c>/reader.pt`: anymove-reader (about 45 min on one RTX 4090), or `tools/fetch_examples.sh <c> --readers`.
- No clip for the move: anymove-film (about $0.26 a 5 s clip, and about 7 clips for a usable move).
- A clip: anymove-capture, `tools/capture.sh <c> <video.mp4> <name>`.
- Several good takes: anymove-pack, `tools/pack.sh <c>`.
- Clips keep swapping limb colours or the halves drift apart: anymove-lora.

## Try it without a GPU

The repo carries the dragon's roar as read by its reader. Fit it on the CPU in about a minute and a half:

```bash
mkdir -p runs/dragon/clips/roar
MOCAP_CREATURE=assets/dragon .venv/bin/python -m mocap.solve examples/dragon_roar/det.npz \
  assets/dragon/rigged/rig_info.json runs/dragon/clips/roar/motion.json
```

It prints the paw agreement (about 0.93) and the reprojection error per view; `motion.json` holds the keyframes.

## Costs and time (October 2026, one RTX 4090)

**Quote the all-in numbers, not the price of one clip:** about $3 for a usable move, and about $17 and a couple of hours
for a new creature with about 5 moves (about $11 of AI services on the person's own card). A move took about 7 clips on
average ($1.80), and 58% of captured clips passed the checks.

- Tripo H3.1 mesh with HD texture: $0.40. MiniMax H3 Max clip: about $0.26 for 5 s (H3: $0.30).
- Dataset and reader training: about 75 min on one RTX 4090. Reading a clip: about 12 s. Fitting: about 45 s. GLB and
  renders: about 3 min.
- A LoRA: $0.01 a training step, so 1,200 steps cost about $12 and take about 2 h on fal.

Say what a step will cost before calling fal, and confirm with the person before spending on a batch.
````

## File: README.md
upstream: https://github.com/patch-gg/anymove/blob/main/README.md

````text
<picture>
  <source media="(prefers-color-scheme: dark)" srcset="docs/readme/header-evening.png">
  <img alt="patch. anymove. motion capture for any creature, from one AI video." src="docs/readme/header-day.png" width="800">
</picture>

<br><br>

<img alt="Six panels: a dragon, a giant spider, a fire demon and a wolf, all moving; then an AI video shows the dragon from the front and the side at once; every joint is found in both views; the two views stand up as walls and pin each joint in 3D; the rig lands on the points; a fire demon, a spider and a wolf move the same way." src="docs/anymove.gif" width="800">

**@patch_gg** · dragon, giant spider, fire demon, wolf · about $3 for a usable move, all in.

anymove turns one AI video into an animation for any rigged creature, wings, tails and eight legs included. A video
model films the creature from two cameras in one frame, front on the left and side on the right. A joint reader
trained on that one creature finds every joint in both views. A joint sits at the same height in both, so the pair
pins it in 3D, and the rig is fitted to those joints frame by frame and exported as a GLB.

The method is [@CanItCode](https://www.youtube.com/watch?v=AS92HYsEBqo)'s; the MiniMax H3 LoRA step is
[@Graalitoo](https://x.com/Graalitoo/status/2112548557576380659)'s idea. This repo is our working version of both, with
the agent skills to run it.

**Just want the creatures?** [Nine are ready in Patch's Assets](https://staging.patch.gg/create/toolbox/assets?source=anymove),
with 4 to 7 moves each: T-rex, knight, horse, centaur, woman, ogre, ape, mech and scorpion.

## before you start.

- **You need:** an NVIDIA card (12 GB to train a reader, 24 GB is safer), Blender 5.x, Python 3.11 and a
  [fal](https://fal.ai) key. Without the card it doesn't run, and there's no cloud version.
- **It costs about $3 for a usable move, all in,** and about $17 and a couple of hours for a new creature with about 5
  moves. [The numbers are below](#what-it-costs).
- **Most clips don't make it.** A move took about 7 clips on average, and 58% of captured clips passed the checks.

## what it's good at, and what it isn't.

**Good at:** big single gestures on any body plan: roars, slams, rearing up, chest beats, stomps, taking off. Walks and
runs work on two and four legs. You get a real animation on a real skeleton, in a file any engine plays.

**Not good at:**

- **Eight-legged walking.** The two views disagree about which legs are up (0.36-0.49). Scorpions and spiders can rear,
  bite and strike, but they don't walk.
- **Lying down.** The reader learns from random poses inside the joint limits, which don't include lying on a side.
- **Bird wings.** The eagle's wings don't fit (15-30 px off), and it was left out of the nine. Bat-like wings do fit, on
  the dragon and the demon.
- **Tail swipes.** The two views disagree about where the tail tip is. The T-rex's was dropped after six tries.
- **Fine foot contact.** Feet slide 1 to 2 cm a step and nothing pins them yet. That's fine for most uses, and visible up
  close.
- **Fast runs.** Runs look like fast walks in places: the video model doesn't lower the body on a run.
- **Moving an animation to another creature.** An animation only fits the creature it was made for, and a new model
  needs a new reader.
- **Light files.** Generated creatures are 55,000 to 60,000 triangles with 4K textures, which is heavy for a browser
  game, and there are no lighter versions yet.

## how it works.

| | |
|---|---|
| <img src="docs/steps/step-1.png" width="320" alt="A concept picture of a dragon, an arrow, and the textured 3D model it became."> | **1 · a 3d model.**<br>One picture becomes a textured mesh at real size.<br><sub><picture><source media="(prefers-color-scheme: dark)" srcset="docs/readme/marks/bfl-white.png"><img src="docs/readme/marks/bfl-black.png" height="14" alt=""></picture> flux 3 picture, <picture><source media="(prefers-color-scheme: dark)" srcset="docs/readme/marks/tripo-white.png"><img src="docs/readme/marks/tripo-black.png" height="14" alt=""></picture> tripo h3.1 mesh · $0.40</sub> |
| <img src="docs/steps/step-2.png" width="320" alt="The dragon as a faint x-ray with its white skeleton inside."> | **2 · a skeleton.**<br>Bones placed on grid views, skinned in <picture><source media="(prefers-color-scheme: dark)" srcset="docs/readme/marks/blender-white.png"><img src="docs/readme/marks/blender-black.png" height="14" alt=""></picture> Blender.<br><sub>42 bones: legs, wings, tail</sub> |
| <img src="docs/steps/step-3.png" width="320" alt="The dragon with each leg and wing painted its own colour, the right wing labelled."> | **3 · limb colours.**<br>Every limb its own colour, so left and right never swap.<br><sub>6 limbs, 6 colours</sub> |
| <img src="docs/steps/step-4.png" width="320" alt="The dragon from above, one camera at its face and one at its right flank."> | **4 · two cameras.**<br>One camera at the front, one at the side, both views in one frame; a video model animates both at once from a prompt.<br><sub><picture><source media="(prefers-color-scheme: dark)" srcset="docs/readme/marks/minimax-white.png"><img src="docs/readme/marks/minimax-black.png" height="14" alt=""></picture> minimax h3 max on <picture><source media="(prefers-color-scheme: dark)" srcset="docs/readme/marks/fal-white.png"><img src="docs/readme/marks/fal-black.png" height="14" alt=""></picture> fal · 5 s, $0.26</sub> |
| <img src="docs/steps/step-5.png" width="320" alt="A random training pose of the dragon in both views with its true joints drawn on."> | **5 · teach a reader.**<br>A vision model learns this one dragon from random poses whose joints are known; its average miss falls from 40 px to 6 px.<br><sub><picture><source media="(prefers-color-scheme: dark)" srcset="docs/readme/marks/meta-white.png"><img src="docs/readme/marks/meta-black.png" height="14" alt=""></picture> dinov2 · 2,200 poses · 20 min on one gpu</sub> |
| <img src="docs/steps/step-6.png" width="320" alt="The AI clip with a white skeleton drawn over the dragon in both views."> | **6 · read every joint.**<br>The reader finds every joint in both views, in every frame.<br><sub>50 joints · 10 s a clip</sub> |
| <img src="docs/steps/step-7.png" width="320" alt="The two views stood up as walls at a right angle, the nose ringed on both, and the two lines meeting at the nose in 3D."> | **7 · two views, 3d.**<br>Stand the two views up as walls at a right angle: each joint is where its two lines meet. The front gives side to side, the side gives nose to tail.<br><sub>x from the front, y from the side, z from both</sub> |
| <img src="docs/steps/step-8.png" width="320" alt="The rig as an x-ray, its bones landed on the 3D points, stray points in grey."> | **8 · the rig follows.**<br>The rig bends its bones onto the points, ignores the strays, and exports for any engine.<br><sub>glb, 24 fps, no hand edits · under a minute a clip</sub> |

Then the best takes become one file, with seamless loops and root motion ([docs/PACKS.md](docs/PACKS.md)).
[docs/PIPELINE.md](docs/PIPELINE.md) has the file-by-file version.

## quick start.

You need an NVIDIA GPU with CUDA (12 GB to train a reader, 24 GB is safer; reading and fitting need much less), Python
3.11, [Blender](https://www.blender.org) 5.x on your `PATH` (or `BLENDER=/path/to/blender`), and a
[fal](https://fal.ai) key to make new clips.

```bash
git clone https://github.com/Patch-gg/anymove && cd anymove
python3.11 -m venv .venv
.venv/bin/pip install torch==2.11.0 --index-url https://download.pytorch.org/whl/cu128
.venv/bin/pip install -r requirements.txt
cp .env.example .env                                  # then add your FAL_KEY; git ignores .env
```

**On Windows,** use [Git Bash](https://git-scm.com/downloads/win), and the same commands with the venv's other folder.
Every `tools/*.sh` finds the venv and handles Blender's paths and Python's line endings. Blender usually isn't on your
`PATH`, so point at it:

```b
````
