Animator is a browser-based 3D posing, lightweight animation, runtime preview, and export sandbox made of four connected tools:
index.html: the main editor, labeled in the UI as Fast Poserripper.html: a motion-capture helper, labeled in the UI as Motion RipperPlayground.html: a playable runtime test scene, labeled in the UI as PlaygroundAutoRigScene.html: a skinned rig preview and export helper, labeled in the UI as Auto Rig Scene
The project is designed for fast previs and experimentation rather than full character animation production. You can manually pose simple box-rig characters, build keyframed animations, save reusable poses and timelines, import and export JSON assets, generate new animation clips from reference video by using browser screen sharing plus MediaPipe pose tracking, test those clips in a small playable arena, and convert them into simple skinned GLB exports.
Fast Poser now uses a small Vite + TypeScript + Tailwind build so its HTML, styling, and application logic stay separate. The companion tools are still plain browser pages, and Vite serves the whole repo so they can share the same origin.
Animator gives you a quick way to do all of the following without leaving the browser:
- Block out a pose on a simple humanoid rig
- Build short animations by recording keyframes on a timeline
- Reuse saved poses across scenes
- Reuse saved animations across sessions in the same browser
- Import and export pose and animation assets as JSON files
- Stage scenes with more than one character
- Capture rough motion from a reference clip through Motion Ripper
- Move animation clips from Motion Ripper back into the main editor
- Test bundled or imported clips as playable runtime actions in Playground
- Auto-build a generated cube rig or auto-weighted imported 3D model from an animation and export it as GLB through Auto Rig Scene
- Preserve character count, character colors, playback speed, and animation timing inside exported assets
- Play back special animation metadata such as the included
arcane-summoneffect preset when present in an imported file
| Path | Purpose |
|---|---|
index.html |
Main Fast Poser app for manual posing, scene staging, timeline editing, and asset library management |
ripper.html |
Motion Ripper app for screen-share pose tracking and animation capture |
Playground.html |
Runtime test arena for trying walk, action, interaction, and summon clips in a playable scene |
AutoRigScene.html |
Auto Rig Scene app for building a generated cube rig or auto-weighted imported 3D model from a Fast Poser animation and exporting GLB |
Animations/ |
Bundled sample animation JSON files you can import into Fast Poser, Playground, and Auto Rig Scene |
Animations/*.animation.json |
Example clips such as walks, flips, kicks, two-character spear actions, and an effect-driven summon animation |
flowchart LR
A["Fast Poser<br/>index.html"] --> B["Save pose to browser library"]
A --> C["Save animation to browser library"]
A --> D["Export .pose.json / .animation.json"]
E["Motion Ripper<br/>ripper.html"] --> F["Track reference video with MediaPipe"]
F --> G["Record compatible animation JSON"]
G --> C
G --> D
H["Animations/ sample files"] --> A
H --> I["Playground<br/>Playground.html"]
H --> J["Auto Rig Scene<br/>AutoRigScene.html"]
C --> J
D --> I
D --> J
J --> K["Export skinned .glb"]
The normal workflow is:
- Open
index.htmlto pose characters and work on the timeline. - Open
ripper.htmlwhen you want to pull motion from a reference video. - Save or export a captured clip from Motion Ripper.
- Load that clip back into Fast Poser to preview, edit, combine, or re-export it.
- Open
Playground.htmlwhen you want to test clips as runtime actions with a controllable player and NPCs. - Open
AutoRigScene.htmlwhen you want to build a skinned preview rig from a clip and export it as GLB.
Install dependencies once, run the Vite dev server, and open the pages in the same browser.
Why this is recommended:
- the browser tools rely on browser APIs and bundled frontend dependencies
- Motion Ripper needs screen-sharing support
- the shared pose and animation libraries use
localStorage, so using the same origin matters - the main editor lives at
index.html, so the host root URL can open it directly - the Fast Poser dev server watches
Animations/**/*.jsonand hot-reloads changed pose or animation assets into the running editor
From the repo root:
npm install
npm run devThen visit:
http://localhost:PORT/http://localhost:PORT/ripper.htmlhttp://localhost:PORT/Playground.htmlhttp://localhost:PORT/AutoRigScene.html
Useful scripts:
npm run dev: serves the editor and companion pages locallynpm run build: typechecks and builds the deployable site intodist/npm run preview: serves the production build
- Open the main editor at
index.htmlor the site root. - Use the same browser and the same origin for
index.html,ripper.html, andAutoRigScene.htmlif you want the shared browser animation library to work. - Motion Ripper depends on MediaPipe assets loaded from the internet, so an offline browser session will not fully work.
- Playground and Auto Rig Scene load bundled sample animation files from
Animations/, so serve the whole repository folder rather than a single file.
Fast Poser is the manual editing side of the project. It opens a 3D scene with a simple humanoid box rig, a pose library, an animation library, and a bottom timeline.
| Feature | What It Does | How To Use It |
|---|---|---|
| Add Character | Creates another simple humanoid rig in the scene | Click Add Character |
| Multi-character staging | Supports scenes with several characters at once | Add multiple characters, then pose each one separately |
| Automatic placement | Places new characters in preset positions so they do not overlap immediately | Just keep clicking Add Character; placement is automatic |
| Random starting colors | New characters are created with distinct random colors unless a loaded asset specifies colors | Add a character or load an asset with saved colors |
| Clear Scene | Removes all characters and also clears the current animation timeline | Click Clear Scene |
| Selectable joints | Every limb segment can be selected with the mouse | Left-click a body part in the viewport |
| Transform gizmo | Lets you rotate or translate the selected joint | Select a body part, then use the gizmo |
| Camera orbit controls | Lets you inspect the pose from different angles | Right-click drag to pan and use the mouse wheel to zoom |
| Feature | What It Does | How To Use It |
|---|---|---|
| Rotate mode | Rotates the selected joint in local space | Click Rotate (R) or press R |
| Move mode | Pulls the rig from the selected body part so the torso and hips lean/follow instead of the limb detaching | Click Move (T) or press T |
| Selection readout | Shows the currently selected body part name | Look at the top-right selection panel |
| Deselect | Clears the current joint selection | Click empty space or press Esc |
| Live keyframe editing | If a keyframe is selected, moving the rig updates that keyframe immediately | Select a keyframe, pose the character, and the frame is updated |
| Feature | What It Does | How To Use It |
|---|---|---|
| Record Keyframe | Stores the current pose at the current timeline time | Move the rig, set the time, then click Record Keyframe |
| Timeline scrubbing | Moves the playhead and previews the pose at that time | Click or drag on the timeline |
| Keyframe selection | Lets you focus a specific frame for editing or deletion | Click a keyframe marker |
| Keyframe retiming | Drag keyframe markers left or right to change timing | Drag the diamond markers on the timeline |
| Playback | Plays the animation from the current time | Click Play or press Space |
| Stop | Stops playback without clearing the animation | Click Stop or press Space again |
| Speed control | Changes playback speed from 0.25x to 2.5x |
Adjust the Speed slider |
| Time input | Lets you type an exact current time | Edit the Time field |
| Delete selected frame | Removes the currently selected keyframe | Click Delete Selected or press Delete / Backspace |
| Clear Anim | Clears all keyframes and resets the timeline | Click Clear Anim |
| Auto-expanding timeline | Grows the visible duration to fit the animation or current scrub time | Happens automatically while editing |
| Interpolated playback | Blends positions linearly and rotations with quaternion slerp between keyframes | Create at least two keyframes and press play |
| Feature | What It Does | How To Use It |
|---|---|---|
| Save Pose | Saves the current scene pose into the browser pose library | Enter a name and click Save Pose |
| Apply Pose | Applies a saved pose to the current scene | Select a saved pose and click Apply Pose |
| Export Pose | Downloads a saved pose as JSON | Select a pose and click Export Pose |
| Import Pose | Reads a pose JSON file and adds it to the library | Click Import Pose and choose a file |
| Delete Pose | Removes the selected pose from the browser library | Select it and click Delete Pose |
| Auto-apply on import | Imported poses are immediately loaded into the current scene | Import a pose JSON file |
| Name replacement behavior | Saving a pose with an existing name replaces the earlier one | Reuse the same pose name and save again |
| Feature | What It Does | How To Use It |
|---|---|---|
| Save Anim | Saves the current timeline as an animation asset | Enter a name and click Save Anim |
| Load Anim | Loads a saved animation into the scene | Select an animation and click Load Anim |
| Export Anim | Downloads the selected animation as JSON | Select an animation and click Export Anim |
| Import Anim | Reads an animation JSON file and adds it to the library | Click Import Anim and choose a file |
| Delete Animation | Removes the selected animation from the browser library | Select it and click Delete Animation |
| Auto-load on import | Imported animations are immediately loaded into the scene | Import an animation JSON file |
| Scene sync on load | Character count and colors are recreated from the asset if needed | Load a clip created for one or more characters |
| Shared format with companion tools | Motion Ripper exports animation JSON that Fast Poser, Playground, and Auto Rig Scene can load directly | Export or save from ripper.html, then load the clip in the tool you need |
| Input | Result |
|---|---|
R |
Switch to rotate mode |
T |
Switch to move mode |
Space |
Play or stop the animation |
Delete / Backspace |
Delete the selected keyframe when not typing in a field |
Esc |
Deselect the current joint |
| Left click on rig | Select a joint |
| Left drag on gizmo | Manipulate the selected joint |
| Right click drag | Pan the camera |
| Mouse wheel | Zoom camera |
Motion Ripper is the capture side of the repo. Instead of hand-posing a rig, you share a screen or window that contains a reference video, let MediaPipe estimate the performer pose, and record the tracked result as a Fast Poser animation asset.
| Feature | What It Does | How To Use It |
|---|---|---|
| Share Screen / Window | Starts browser screen capture for a reference clip | Click Share Screen / Window and choose the source |
| Stop Share | Stops the current screen share without deleting an already recorded take | Click Stop Share |
| MediaPipe warmup | Preloads the pose tracker on page load | Open ripper.html and wait for the ready status |
| GPU with CPU fallback | Tries GPU first and falls back to CPU if needed | Happens automatically |
| Pose overlay | Draws a cyan skeleton over the shared video feed | Share a source and wait for tracking to lock |
| Tracking status | Shows whether tracking is waiting, searching, or locked | Watch the Tracked and Confidence cards |
| Confidence readout | Shows approximate tracking confidence as a percentage | Watch the Confidence card |
| Rig preview | Shows the mapped box character on the right side | Follow the performer and inspect the preview |
| Feature | What It Does | How To Use It |
|---|---|---|
| Animation naming | Gives the take a human-readable name | Type your own name or use the auto-generated default |
| Auto-generated names | Creates names like rip-YYYYMMDD-HHMM when the field is empty |
Leave the field blank |
| Character Color | Sets the exported preview character color | Use the color picker before saving or exporting |
| Sample Rate | Records at either 10 fps or 5 fps |
Choose a rate from the dropdown |
| Pose Smoothing | Blends tracked motion to reduce jitter | Adjust the slider while previewing |
| Root motion tracking | Moves the hips in X, Y, and Z relative to a neutral frame | Leave Track root motion enabled |
| Neutral capture | Stores the baseline body position used for root motion | Click Set Neutral once tracking is stable |
| Start Record / Stop Record | Begins and ends keyframe capture | Click Start Record, play the reference, then click again to stop |
| Clear Capture | Clears recorded frames and resets the preview character | Click Clear Capture |
| Save To Library | Saves the resulting animation into the same browser animation library used by Fast Poser | Click Save To Library, then open index.html in the same browser |
| Export JSON | Downloads the recorded animation as a .animation.json file |
Click Export JSON |
- Open
ripper.html. - Wait until the status says MediaPipe is ready.
- Click
Share Screen / Windowand choose the window where your reference video is playing. - Wait until the cyan skeleton follows the performer reliably.
- Click
Set Neutralbefore recording if you want root motion to feel stable. - Set
Sample Rate,Pose Smoothing,Character Color, and the take name. - Click
Start Record. - Play the reference clip.
- Click
Stop Recordwhen the motion is finished. - Click
Save To Libraryto make the clip appear in Fast Poser, or clickExport JSONto save a file.
- Use a reference video with a single clearly visible person.
- Keep the whole body in frame when possible.
- Capture neutral before recording if root motion looks jumpy.
- Turn root motion off if you only care about limb animation.
- Increase smoothing if the pose looks noisy.
- Use the same origin and same browser as Fast Poser if you want
Save To Libraryto show up immediately in the main app.
Playground is the runtime testing side of the repo. It turns the bundled Fast Poser animation files into a small playable arena with a controllable player, wandering NPCs, action triggers, two-character interactions, and the summon effect.
| Feature | What It Does | How To Use It |
|---|---|---|
| Player movement | Lets you move the player character around the arena | Use WASD |
| Camera orbit | Lets you inspect the runtime scene from different angles | Drag and zoom with the mouse |
| Auto-loaded animation pools | Loads bundled walk, jump, interaction, and summon clips from Animations/ |
Serve the repo and open Playground.html |
| Manual JSON loading | Falls back to user-selected animation files if browser auto-load is blocked | Click Load JSON Files and select clips from Animations/ |
| Random action trigger | Plays a random jump, flip, or kick style clip | Press Space or click Space Jump |
| Summon trigger | Plays the bundled summoning animation and visual effect metadata | Press H or click H Summon |
| NPC interactions | Finds a nearby NPC and plays a two-character spear interaction clip | Move near an NPC, then press E or click E Interact |
| Wandering NPCs | Keeps the arena alive with several simple runtime characters | Open the page after assets load |
| Reshuffle NPCs | Repositions and reassigns NPC idle behavior | Click Reshuffle NPCs |
| Reset arena | Returns the player and NPCs to a clean starting state | Press R or click Reset Arena |
| Live status panels | Shows the player state, current clip, nearest NPC, interaction readiness, and loaded pool counts | Watch the right-side runtime panel |
- Serve the repository and open
Playground.html. - Wait for the bundled clips in
Animations/to load. - Move with
WASDand orbit the camera with the mouse. - Press
Space,H, andEto test single-character actions, the summon effect, and nearby NPC interactions. - If auto-load is blocked, click
Load JSON Filesand choose the animation JSON files manually.
Auto Rig Scene is the export side of the repo. It takes Fast Poser-compatible animation JSON, builds a simple generated rig or fits an imported 3D model to generated bones and weights, previews the motion, and exports the result as a GLB file for game-engine or DCC experiments.
| Feature | What It Does | How To Use It |
|---|---|---|
| Bundled clip catalog | Lists sample animation files from Animations/ |
Open AutoRigScene.html |
| Browser library loading | Reads clips saved by Fast Poser or Motion Ripper from localStorage |
Use the same browser and origin as index.html |
| Import JSON | Adds a local .animation.json file to the rig builder |
Click Import JSON and choose a file |
| 3D model import | Loads OBJ, GLB, GLTF, or FBX character meshes for auto skinning | Click Import Model and choose the model file; include MTL, BIN, and texture files when the format references them |
| 3D models folder source | Exposes the included Tripo OBJ from 3D models/ as a selectable mesh source |
Choose 3D Models / Tripo OBJ in the mesh source dropdown |
| Import loading state | Shows a loading overlay before heavy model parsing and skinning starts | Import or select a model and wait for the overlay to clear |
| Refresh List | Reloads bundled and browser-library animation sources | Click Refresh List |
| Auto build on select | Builds the rig as soon as a catalog item is selected | Keep Auto build on select enabled |
| Build Rig | Creates a skinned character from generated cubes or the selected imported mesh | Select a clip and click Build Rig |
| Weighted cube mesh | Generates segmented cube geometry with bone weights for limbs, spine, head, and hips | Happens automatically during rig build |
| Auto-weighted model mesh | Fits imported upright character models to the Auto Rig skeleton, auto-aligns the model's horizontal axis so forward motion matches the model front, detects a model rest pose, and creates spatial skin weights, including neck, shoulder, hand, and foot bones | Choose or import a model before building the rig |
| Rest-pose retargeting | Keeps imported meshes in their detected bind pose, preserves root-motion offsets, and applies authored limb rotations from the clip | Build a rig from an imported model and scrub or play the timeline |
| Multi-character support | Builds one skinned character per character stored in the animation asset | Load a multi-character clip such as spear.animation.json |
| Preview toggles | Shows or hides rig helper lines and mesh rendering | Use Show rig lines and Show mesh |
| Timeline playback | Plays, loops, and scrubs the generated animation clip | Use Play, Loop clip, and the timeline slider |
| Rig stats | Reports clip name, animation source, model source, character count, bones per character, keyframes, and duration | Read the Rig Stats panel |
| Export GLB | Downloads the generated skeleton, skinned mesh, and animation as a .glb file |
Build a rig, then click Export GLB |
- Open
AutoRigScene.html. - Choose generated cubes, the bundled Tripo OBJ, or import a local model.
- Choose a bundled, library, or imported animation clip.
- Click
Build Rigif auto-build is not already enabled. - Preview the mesh, rig lines, looping, and timeline scrub.
- Click
Export GLBto download the skinned result.
The Animations/ folder is effectively a starter pack for trying the project.
| File | Characters | Notes |
|---|---|---|
forwardflip.animation.json |
1 | Single-character flip sample |
forwardflip-realistic.animation.json |
1 | Refined single-character flip sample |
slash.animation.json |
1 | Dynamic single-character sword slash with anticipation, impact, and recovery |
spinningkick.animation.json |
1 | Single-character kick sample |
spinningkick-realistic.animation.json |
1 | Refined kick sample |
spinningslash.animation.json |
1 | Single-character spinning blade slash with an attached weapon |
spinningslash-overdrive.animation.json |
1 | Copy of spinningslash.animation.json with blade-storm trails, sparks, shader glow, and a shockwave |
walking-anim.animation.json |
1 | Single-character walk sample |
walking-realistic.animation.json |
1 | Refined walk sample |
spear.animation.json |
2 | Two-character spear interaction sample |
spear-realistic.animation.json |
2 | Refined two-character spear interaction |
powerbomb.animation.json |
2 | Two-character powerbomb with level change, lift, shoulder stack, drop, impact, and recoil beats |
powerbombv2.animation.json |
2 | More physical powerbomb variant with stronger footwork, lift acceleration, snap-down timing, impact compression, and rebound |
powerbombin3.animation.json |
3 | Three-character powerbomb setup sample |
two-character-fight.animation.json |
2 | Two-character hand-to-hand fight with approach, block, counter, kick, and reset beats |
summoning-magic.animation.json |
1 | Demonstrates the built-in arcane-summon animation effect metadata |
- Open
index.html. - In the
Animation Librarysection, clickImport Anim. - Choose any file from
Animations/. - The animation is added to the browser library and loaded immediately.
- Press
Playto preview it.
Fast Poser and Motion Ripper share a plain JSON asset format, and the animation assets are also consumed by Playground and Auto Rig Scene.
Exported pose files look like this in principle:
{
"format": "fast-poser-asset",
"version": 1,
"type": "pose",
"name": "Guard Stance",
"savedAt": "2026-04-18T18:00:00.000Z",
"scene": {
"characterCount": 1,
"characterColors": ["#5eead4"]
},
"pose": {
"Hips_0": {
"position": [0, 2.6, 0],
"quaternion": [0, 0, 0, 1]
}
}
}Exported animation files look like this in principle:
{
"format": "fast-poser-asset",
"version": 1,
"type": "animation",
"name": "Kick Combo",
"savedAt": "2026-04-18T18:00:00.000Z",
"scene": {
"characterCount": 1,
"characterColors": ["#5eead4"]
},
"playbackSpeed": 1,
"effects": null,
"keyframes": [
{
"time": 0,
"pose": {
"Hips_0": {
"position": [0, 2.6, 0],
"quaternion": [0, 0, 0, 1]
}
}
}
]
}Joint names follow the pattern <JointName>_<CharacterIndex>. Examples:
Hips_0Spine_0Head_0Left_Upper_Arm_0Right_Lower_Leg_1
This is how multi-character scenes are stored in a single asset.
Animation files may optionally include an effects object.
The bundled summoning-magic.animation.json uses:
{
"preset": "arcane-summon",
"targetCharacter": 0,
"startTime": 0.4,
"peakTime": 2.8,
"endTime": 4.2
}The bundled spinningslash-overdrive.animation.json also uses the blade-storm preset to render a weapon trail, glowing blade shader, spark particles, and a ground shockwave without changing the original movement keyframes.
At the moment, the runtime can play these effects when they are present in an imported animation, but the current UI does not expose a dedicated authoring panel for creating or editing effects by hand.
- Vite-served HTML with JavaScript and TypeScript modules
- Three.js for 3D rendering, controls, lighting, and rig transforms
- Tailwind CSS for the Fast Poser UI styling
- MediaPipe Tasks Vision Pose Landmarker for Motion Ripper pose tracking
- Browser
localStoragefor pose and animation libraries - Browser file APIs and blob downloads for import/export
This project is intentionally lightweight, and that shows up in a few important ways:
- The generated fallback rig is a simple blocky humanoid; imported models use automatic spatial skin weights rather than authored deformation weights.
- There is no backend or project file system beyond browser storage and exported JSON files.
- The shared pose and animation libraries are browser-local, not synced across machines.
- Motion Ripper tracks a single performer and records a single character per take.
- Motion Ripper depends on screen sharing, WebGL, MediaPipe, and internet-loaded assets.
- Playground is a runtime testbed, not a full game or behavior system.
- Auto Rig Scene exports generated skeletons, skin weights, imported meshes when selected, and animation tracks; it is still not a production-grade retargeting or deformation tool.
- Fast Poser supports playback of imported effect metadata, but there is no full effect editor in the UI yet.
- There is no formal build, test, or packaging pipeline in the repo right now.
Use a normal local server and open the tools from the same origin in the same browser. localStorage is where the libraries live.
Check the internet connection first. The page loads MediaPipe code and the pose model from external URLs.
Make sure the browser allows screen sharing and retry from http://localhost or another trusted context.
Fast Poser needs at least two keyframes to produce visible playback. A single keyframe can still be loaded, edited, and re-recorded.
Track the performer until the skeleton is stable, then click Set Neutral before recording. If you only want upper-body and limb motion, disable Track root motion.
This repo now uses index.html as the main entry, so the site root should open Fast Poser directly. If it does not, make sure your host is serving the built dist/ directory rather than the raw repository root.
Animator is especially useful for:
- blocking out action beats for a game or animation idea
- building rough previs for short moves
- capturing approximate motion from a reference clip
- creating reusable pose libraries for recurring characters
- testing timing before moving into a heavier DCC pipeline
- sharing animation ideas as small JSON files
If you want the shortest possible description of the project:
Animator is a no-build browser toolset for posing simple 3D humanoids, creating timeline-based animations, extracting rough animation clips from reference video, testing them in a runtime playground, and exporting simple skinned GLB rigs from the same shared JSON asset format.