Anim2D

Anim2D

A 2D skeletal animation editor that reads Spine 3.8 and 4.0 JSON and exports Spine 4.0 JSON or binary (.skel), or Spine 3.8 JSON, with a texture packer and the FX library built in. Exports play in Spine 4.0 runtimes such as spine-unity 4.0 (or 3.8 runtimes when exported as 3.8).

Setup mode

.venv\Scripts\anim2d
.venv\Scripts\anim2d path\to\skeleton.json      # open a Spine 3.8 or 4.0 JSON export
.venv\Scripts\anim2d path\to\project.anim2d

Layout

Area What it does
SETUP / ANIMATE (top left) Switches mode (Ctrl+Tab). Each mode has its own layout; see Setup and Animate
Tool bar (bottom of the viewport) Tools (Pose, Weights, Create), Transform (Rotate, Translate, Scale, Shear with their values and, in Animate mode, key buttons), Axes, Compensate, Options; see Tool bar. Keys: Translate W, Rotate E, Scale R, Shear Q, Pose P, Weights Shift+W, Create C, Select (all gizmos) V; any key can be changed (see Keyboard shortcuts)
Tree (right) The hierarchy, with search, filters, an eye column, skin marks and the New… / Set Parent / Add to Skin / Split buttons; see Tree. Properties of the selection sit below it
Viewport Right/middle drag to pan, wheel to zoom, F to frame all. View → Appearance… (the Appearance page of Settings) sets the interface theme (Studio Grey, Midnight, Charcoal, Light, Ocean), the viewport background (Default, Charcoal, Slate, Mid grey, Light, Checker or any colour) and the grid (Subtle, Blueprint, High contrast, Warm, Dots, any colour, or Off), shown live and kept between sessions; View → Grid switches the grid quickly. The FX Preset Builder uses the same theme. Appearance The zoom bar on the left has + / slider / −, 🔍 (100%) and ⛶ (fit). The selection shows a gizmo. Red border = Animate mode
Weights (left, opens with the Weights tool) See Weights view
Properties (under the tree) Edit the selection. In Animate mode, bone, slot colour and attachment changes become keys
Timeline (Animate mode) Skin picker (with This skin only: the animation list shows the chosen skin's animations, matched by name, L1_intro → skin L1, plus those of no skin; choosing a skin's animation shows that skin), animation picker, play/loop, curve presets, and a Dopesheet or Graph view (see Animating)
Dopesheet, Graph (Animate mode) Separate windows: key timing in the Dopesheet, values and bezier handles in the Graph (tabbed under the Timeline at first). Auto Key in the Timeline: on, changes become keys at once; off, changes show until you move in time and Key (K) keeps them
Moving windows Every window (Tree, Properties, Timeline, Dopesheet, Graph, Preview, Weights) can be dragged to any side, stacked as tabs, floated or closed, and made bigger or smaller by dragging its edge (controls that no longer fit scroll); View menu reopens them and View → Reset window layout puts them back. Each mode remembers its own arrangement
Preview (left, Animate mode) A second viewport that plays animations on its own (View → Preview, Ctrl+Shift+P), on a checkerboard, with its own zoom bar

The window uses a dark grey theme with blue highlights. The arrangement follows Spine's; the icons and drawing are Anim2D's own.

Tool bar

The bar along the bottom of the viewport shows the selected bone's (or region's) name, then:

Tree

Setup and Animate

Like Spine, Anim2D has two modes with their own interface:

Each mode remembers its own layout: show, hide or move panels in one mode and they stay that way the next time you switch to it. In Animate mode the tool strip has a key button (◆) beside Translate, Rotate, Scale and Shear that keys that property of the selected bone. The button is green when the property has a key at the current frame, yellow when it has keys elsewhere in the animation, and grey when it has none.

Animate mode

Gizmos

The selected bone (or region attachment) shows a gizmo. Drag a handle to change only what it controls:

Gizmo Handles
Translate (T) Red arrow: X only. Green arrow: Y only (both along the parent's axes). Yellow centre square: free
Rotate (R) Blue ring: rotate
Scale (S) Red box: scale X. Green box: scale Y (along the bone's own axes). Yellow centre box: both
Shear (H) Red diamond: shear X. Green diamond: shear Y
Select (V) Translate arrows, rotate ring and scale boxes together

The handle under the mouse turns white. Dragging the bone itself (not a handle) still works as before with the active tool. Shear is also in Properties (Shear X / Y) and has its own keys. Region attachments have no shear, as in Spine.

Typical workflow

  1. File → Set images folder… to a folder of PNGs. They appear under Images.
  2. Select root, press C, and drag in the viewport to create bones; each new bone becomes the parent of the next.
  3. Select a bone and double-click an image to give it a slot with that image. Move, rotate or scale the attachment with the tools while in Setup mode.
  4. Create an animation (Edit → New animation, or right-click Animations) and switch to Animate.
  5. Scrub to a frame and pose bones with T/R/S. Keys are set automatically, or press K to key the selected bone's current pose. Change slot colour or attachment in Properties to key them.
  6. Select keys and pick a curve (Linear, Stepped, Ease in/out/in-out). Drag keys to retime them.
  7. File → Save writes a .anim2d project (older .rig2d projects still open). File → Export… (Ctrl+E) writes the skeleton for the game: see Export.

Animating: dopesheet, graph and preview

Graph editor and preview

Dopesheet

Graph (the Dopesheet / Graph switch on the timeline bar)

Preview (shown in Animate mode; View → Preview)

IK constraints

IK legs in Animate mode

Select the bone at the end of a chain (a shin or forearm) and press Ctrl+K, or right-click it → Add IK constraint….

Poses are solved with a port of the official Spine runtime's IK solver and update order, including bone transform modes and shear. The editor therefore shows the pose the game will show.

Meshes, weights and deform keys

Mesh weights

New UVs are clamped to the image.

Adding vertices

Mesh deform in Animate mode

Transform and path constraints

Path constraint, transform constraint and weight painting

Right-click a bone → Add transform constraint… or Add path constraint… (or right-click Constraints). Choose the constrained bones and the target.

Pose tool

Pose (P): drag a bone and it rotates, together with its parent, so that its tip follows the mouse, like a temporary IK chain.

Shapes: paths, bounding boxes, clipping and points

Right-click a slot → Add shape. Shapes are drawn over the images (the game does not draw them), and in Setup mode they are edited directly:

Skins

Skins list under Skins in the hierarchy. Double-click a skin (or Edit and show this skin) to edit it: the viewport then shows that skin on top of the default skin, and new attachments go into it.

Weight painting and mesh tracing

Weights view

Weights view

The Weights tool (Shift+W) opens the Weights view, laid out like Spine's.

FX inside the editor

FX → Insert FX into skeleton… (Ctrl+I, or right-click a bone → Insert FX here…)

Insert FX

Rigging and animation tools

Tool Where What it does
Draw-order keys Tree slot menu in Animate mode (Draw earlier/later/back/front, then key) Keys the draw order at the current time; the draw-order group shows the animated order
Events Tree event menu → Open the Events window (View → Events) Events with int/float/string/audio/volume/balance defaults; keys at the current time, edited in place. 🔊 Audio folder… sets where audio paths are found (default: an audio folder next to the images); ▶ Play sound tries one
Event sounds 🔊 next to Loop in the Timeline and Preview Events with an audio path play their sound (WAV, MP3, OGG) when the playhead passes them; key volume overrides the event's. Balance is kept but not heard
Image sequences Tree slot menu → Add image sequence… Numbered images (fire_01.png …) become attachments keyed as a flip-book: frame rate, forward/reverse/ping-pong, repeats, keep or hide the last frame
Onion skin Timeline 👻 Onion button (▸ menu: frames before/after, step, strength, selected only, in front) Ghosts of nearby frames, red before and green after. With Selected only (on by default) only the selected bone and its children, or the selected slot, are ghosted; with nothing selected, everything is
Copy / paste pose Edit → Copy pose (Ctrl+Shift+C), Paste pose (Ctrl+Shift+V), Paste pose mirrored (Ctrl+Alt+V) Copies the selected bone and its children; mirrored pastes onto the other side's bones (L_/R_, _l/_r, Left/Right)
Mirror bones Edit → Mirror bones… Copies a bone chain with its slots and attachments, reflected across a vertical line; weighted meshes follow
Bake / Simplify Edit → Bake constraints to keys, Simplify keys Keys every frame with IK/transform/path applied and turns those constraints off in the animation; Simplify removes keys within 0.1° / 0.1 px
Animation layers Preview → Layer on top Plays a second animation on a track above: the timelines it keys replace the first animation's
Bone chains Tree bone menu → Add bone chain…; path attachment menu → Bone chain along this path… A chain out of the bone's tip (count, length, curl), or along a path's curve
Rig mesh Tree mesh menu → Rig to the bones over it Binds the mesh to the bones that reach it, weighted by distance
Physics Tree bone menu → Physics…; Preview → Physics; Edit → Bake physics to keys Springy bones (stiffness, damping, inertia, mass, gravity, wind, limit, mix) for hair, cloth and tails. The Preview simulates them; Spine 3.8/4.0 runtimes have no physics, so bake them to rotate keys before exporting (exports leave the constraints out and say so)
History View → History Every undo step; click one to go back or forward to it
Motion paths View → Motion paths (Ctrl+Alt+M), Animate mode The selected bone's path over the animation: a dot per frame, an orange diamond at each key. Drag a dot to move the bone at that frame (it sets the translate key there, whatever the parents do)
Ease presets Timeline → Curve… Ease in/out (normal and strong), Overshoot, Anticipate, Anticipate + overshoot for the selected keys. Bounce and Elastic add keys between each selected key and the next (bone timelines)
Copy / paste curve Timeline → Curve… → Copy curve, Paste curve Copy the shape after one key and give it to other keys, on any timeline
Retime Edit → Retime… (Ctrl+Alt+T) Scale time (speed factor or new length), reverse, or loop a section, for the whole animation or the selected keys; curves keep their shape
Live layer sync File → Import PSD / OpenRaster… Imported .psd and .ora files (Photoshop, Krita, GIMP) are followed: saving one updates the images in Anim2D, moving layers by as much as they moved in the file, so bones, weights, keys and your own moves stay. New layers become new slots. File → Sync layered images now does it by hand
Command search Help → Search commands (Ctrl+Space) Type part of any command's name and press Enter to run it
Reference footage (rotoscoping) View → Reference footage… (Ctrl+Alt+R) A video (MP4, MOV, AVI, WebM …), a numbered image sequence or one image behind the skeleton (or in front), at the frame matching the timeline time. Opacity, scale, position, start offset, speed, mirror; Fit to view and Match animation length. Saved with the project; the footage itself is not copied or exported

File menu

File menu

Item What it does
New Project (Ctrl+Shift+N) An empty project
Open Project… (Ctrl+O), Recent Projects Opens a .anim2d (or an older .rig2d). Recent Projects lists the last ones (Settings sets how many)
Save Project (Ctrl+S), Save Project As… (Ctrl+Shift+S) Writes the .anim2d
New Skeleton (Ctrl+N) An empty skeleton that keeps the current images folder (a new project)
Skeletons in project Add, duplicate, rename, delete or switch between several skeletons in one project; they share the images folder and each has its own undo. Export writes the one being edited
Import Project… Opens a Spine project (.spine, Spine 3.8.x or 4.2.x) or a Spine JSON export as a new project; see Spine projects
Import Data… Adds another Spine project's or Spine JSON's bones, slots, constraints, skins, events and animations to the open skeleton. What already exists is kept; a clashing animation name gets a number. One Undo removes it
Import PSD… Each Photoshop layer becomes an image (in a folder named after the PSD), a slot and an attachment placed where the layer sits; the canvas centre is the origin. 8-bit RGB or grayscale, uncompressed or RLE
Export… (Ctrl+E) See Export
Unity Bridge…, Export to Unity (Ctrl+Alt+E) See Unity bridge
Texture Packer… (Ctrl+P) Packs every PNG/JPEG in a folder (with subfolders) into an atlas; see Texture Packer
Texture Unpacker… Writes every region of a .atlas (4.0 or 3.8) back out as its own PNG, at its original size with whitespace and rotation restored and premultiplied alpha undone. A region with an index is written as name_<index>.png
Settings… (F12) One window with a page per topic; see Settings

Autosave (off by default) writes <project>.anim2d.autosave next to a saved project that has changes, every N minutes. The project file itself changes only when you save.

Settings

File → Settings… (F12) opens every preference in one window, a page per topic. OK keeps the changes; Cancel puts Appearance back the way it was.

Page What's on it
General Recent projects count (and Clear recent projects), undo levels, FPS of new skeletons, autosave, and Folders: where projects, FX templates, FX output and the log are, each with an Open button
Appearance Interface theme, viewport background and grid, shown live (also View → Appearance…)
Shortcuts Opens the keyboard shortcut editor and the list of current keys
Updates Your version, the last check, Check now, Install update when one is waiting, the daily check on or off, and stop skipping a version you skipped
Plugins The built-in integrations for now: the Unity bridge and your FX templates folder. Plugin support is planned
About Version, links to the website, bug reports and release notes, the licence, and Copy system info for bug reports

Updates. Installed copies check GitHub once a day, a few seconds after starting. When a release is out, a dialog shows its notes, and an ⬆ Update to … button stays in the status bar. Install update downloads the installer, checks it against the release's SHA-256 checksums, asks to save your project, closes Anim2D, and the installer updates it in place, keeping the apps and shortcuts you chose, then starts it again. Skip this version stops it being offered until a newer one is out; Help → Check for Updates… always shows it. If there's no connection, the daily check stays quiet and Settings → Updates says what went wrong. The portable program downloads the new portable program next to itself instead; running from source never checks by itself.

Keyboard shortcuts

Edit → Keyboard Shortcuts… (Ctrl+Alt+K) lists every command with its key. Click a key and press the new one, or clear it; a key used twice is refused. Reset all restores the defaults. The keys are kept between sessions; Help → Shortcuts shows the current ones. The Help menu also has Check for Updates…, Report a Bug… and About Anim2D.

Space (Edit → Deselect) clears the selection: bones, slots, attachments, mesh vertices and selected keys. In a text box Space still types a space.

Keyboard shortcuts

Spine projects (.spine)

Imported 4.2 project

File → Import Project… opens Spine editor project files directly, so you can carry on with a project without exporting it from Spine first.

Spine does not publish the .spine format. Anim2D reads it from how Spine writes its projects, and checks the result against Spine's own exports: see Verification.

Export

File → Export… (Ctrl+E). Choose a format on the left; its options are on the right.

Export dialog

Data: JSON and Binary

Option Choices
Output folder, Extension The file is <folder>/<project name><extension> (.json or .skel by default). ★ keeps favourite folders
Format JSON, or JavaScript: names without quotes (smaller; not strict JSON). Pretty print indents
Version Spine 4.0 (4.0.64, default). Spine 3.8 (3.8.99): 3.8 runtimes. Spine 3.8.75: importing into the Spine 3.8.75 editor (official 3.8 runtimes refuse data stamped 3.8.75). Binary is 4.0 only
Nonessential data Off leaves out what only the editor uses: fps, images path, bone and shape colours, mesh edges and sizes
Animation clean up Leaves out keys that change nothing (a key equal to its neighbours where the curves are linear or stepped). The motion is unchanged
Warnings Shows the export's notes
Texture atlas: Pack Packs the images into <name>.atlas and pages instead of copying them to images/. Pack settings… opens the Texture Packer settings

3.8 export: some Spine 4.0 curves and timelines have no exact 3.8 form. Examples are split X/Y timelines, separate RGB and alpha timelines, and curves whose handles differ per channel. These are converted to extra linear keys, so 3.8 plays the same motion within 0.01 px or degree. The export lists what was converted.

Image and video

Formats: GIF, PNG (one file per frame, or packed into an atlas), APNG, PSD (one layer per frame, the first on top), JPEG (one file per frame), WebP, AVI (Motion JPEG, or uncompressed with alpha), MOV (PNG with alpha, or JPEG) and MP4 (H.264).

Option What it does
Export type Animation, Current pose (the timeline's time) or Setup pose. Defaults resets the format; Preview plays what will be written
Animations Current, All, or the one chosen in the list
Skins Current, All, or All + (also without a skin)
Output type Single file (everything in one file) or File per animation and skin (name_<animation>_<skin>)
Output file / prefix One file, or the prefix of the frame files (prefix_0000.png …)
Animation repeat, Pause after Plays the animation N times; holds the last frame for N seconds
Render Bones, Images, Others (bounding boxes, clipping, paths, points), Linear filtering (off: nearest pixels)
Multisample AA Renders 2x–16x larger and scales down for smoother edges
Viewport: Crop Exports only the area the viewport shows
Size Scale (percent of world size), Width or Height in pixels
Frames: Range Only frames N to M
Colors, Color dither, Alpha threshold, Alpha dither, Quality (GIF) Palette size; dithering on or off; pixels below the alpha threshold become transparent, with ordered dithering of the soft edges; quality picks the palette method
Background Transparent, or a colour. GIF Matte blends soft edges toward a colour. JPEG, MP4, Motion JPEG AVI and JPEG MOV always have a background
Compression (PNG, APNG, MOV PNG), Quality (JPEG, WebP, AVI, MOV JPEG)
FPS, Playback Frames per second; Forever loops (GIF, APNG, WebP); Include last frame adds the frame at the animation's end
Texture atlas: Pack (PNG, JPEG) Packs the frames into an atlas; with Use indexes each frame is one region with an index

Unity bridge

File → Unity Bridge… exports straight into a Unity project for spine-unity: choose the project folder (the one with Assets/), a folder in Assets (default Assets/Spine), the spine-unity version (4.0 or 3.8; detected when spine-unity is installed), premultiplied alpha and atlas scale. Each skeleton goes to its own subfolder as <name>.json, <name>.atlas.txt and the atlas PNGs, which spine-unity turns into a SkeletonData asset. With Export to Unity every time the project is saved on, saving also exports; Export to Unity (Ctrl+Alt+E) exports at any time. The settings are saved in the project.

Unity notices the new files when it comes to the front. Install auto-refresh script in Unity adds Assets/Editor/Anim2DBridge.cs, which refreshes Unity's assets after each export even while it is in the background (delete the file to stop it).

Texture Packer

File → Texture Packer… (Ctrl+P) packs a folder; Pack settings… in the Export dialog uses the same settings.

Texture Packer settings

Section Settings
Regions Strip whitespace X / Y (crop transparent borders; the runtime puts the image back in place), Rotation (turn regions 90° when they fit better), Alias (identical images share one region), Ignore blank images, Alpha threshold (pixels at or below it count as whitespace)
Region Padding Padding X / Y between regions; Edge padding (also around the page edge); Duplicate padding (repeat edge pixels into the padding)
Pages Min / Max width and height, Power of two, Divisible by 4, Square
Runtime Filter min / mag, Wrap X / Y (written as repeat:), Format (written as format:)
Output Format PNG or JPG pages, Packing Rectangles (MaxRects) or Grid, Premultiply alpha (pma: true; turn PMA on in the runtime too), Bleed (transparent pixels take their neighbours' colour), up to five Scales with a Suffix and Resample filter each (one atlas per scale)
Options Atlas extension, Flatten paths (region names without folders), Use indexes (run_3 → region run, index: 3), Debug (outlines the regions on the pages), Fast (one packing pass instead of trying three), Limit memory

Region names are the image paths (parts/arm), as the Spine runtimes look them up. Spine's Polygons packing is not available; Grid packing is.

What is supported

Feature Status
Bones: create, rename, reparent (keeps world pose), delete, colour, length ✅
Slots: image region attachments, colour, blend mode, draw order ✅
Animation: rotate / translate / scale keys (shear kept), colour and attachment keys, events, curves ✅
Undo/redo for every edit, project save/load ✅
Dopesheet box select, select all, copy/paste of keys (onto other bones), retiming ✅
Graph editor: per-channel curves, key values, bezier handles, adding keys on a curve ✅
Preview: plays animations on its own (speed, loop, skin), crossfades like the runtime's AnimationState ✅
Setup / Animate interfaces with their own layouts; key buttons per transform; gizmos for translate, rotate, scale, shear ✅
Spine-style tool bar (typed values, Local/Parent/World axes, compensation, select/visible/name options) and tree (search, filters, eye column, New…, Set Parent, Add to Skin, Split, skin placeholders, inherit flags) ✅
Spine 3.8 and 4.0 JSON import; 4.0 JSON and binary (.skel) export; 3.8 JSON export ✅
Texture packer: atlas pages, whitespace strip, rotation, padding, scale, power of two, premultiplied alpha ✅
FX presets and Spine templates inserted into a character animation ✅
Meshes: grid creation from regions, vertex editing, weights (auto bind, per-vertex), deform keys ✅ drawn textured, solved like the runtime
Adding/removing mesh vertices (inside or on the outline), automatic re-triangulation, UV editing ✅
Custom internal edges, splitting triangles by hand ❌ not yet (re-triangulating replaces Spine's custom edges)
Bounding boxes, points, clipping polygons, paths: create, edit, draw; clipping applied when drawing ✅
Linked meshes ✅ drawn and solved (with inherited deform); edited through their parent mesh
Draw-order keys ✅ keyed from the Tree, drawn, exported
Transform constraints (world/local, absolute/relative) and path constraints (all modes), keyed mixes ✅ solved like the 4.0 runtime
Pose tool ✅
Skins: create, edit, duplicate, skin bones and constraints, per-skin deform keys ✅
Weight painting (add, subtract, replace, smooth) and mesh tracing from image alpha ✅
Weights view: strength / size / feather, Smooth, Auto, Prune, pies, overlay, selected-only, bone locks, Bind, Remove, Update Bindings ✅
Zoom bar (+ / − / slider / 100% / fit) on the viewport and Preview ✅
Export: JSON (or JavaScript), binary, nonessential data, animation clean up ✅
Image/video export: GIF, PNG (frames or atlas), APNG, PSD, JPEG, WebP, AVI, MOV, MP4; animations, skins, bones/others, MSAA, crop, size, range, repeat, pause ✅ (no audio)
Texture Packer (all of Spine's settings except Polygons packing) and Texture Unpacker ✅
File menu: recent projects, New Skeleton, Import Data, Settings, autosave ✅
Import Spine projects (.spine) from Spine 3.8.x and 4.2.x ✅ (4.2: no physics or constraint order)
IK constraints: one- and two-bone, mix, softness, bend, stretch, compress, uniform; keyed mix/bend/softness ✅
Shear, bone transform modes (only translation, no rotation, no scale …) ✅ solved like the runtime (shear keys kept; not editable in Properties)
IK inside FX templates ❌ templates with IK are rejected; build IK in the character instead
Events and audio events ✅ Events window; sounds play during playback (no balance)
Image sequences, onion skin, pose copy/paste (mirrored), mirror bones, bake, simplify, animation layers in the Preview ✅
PSD import, bone chains, mesh auto-rig ✅ (PSD: no ZIP-compressed layers, no 16-bit)
Physics constraints ✅ simulated in the Preview, baked to keys for 3.8/4.0 runtimes
Undo History window, several skeletons per project, Unity bridge ✅

Verification

Automated (pytest):

Not yet tested:

Anim2D 0.19.0 · Edit this page on GitHub