Appearance
How-to guides
Task-focused recipes for solving production problems with the Anim language and CLI.
Table of Contents
- How to Import Adobe After Effects / Lottie Animations
- How to Build and Animate 2D Deformable Meshes (
mesh2d&deform2d) - How to Render Frame Sequences and Video Outputs
- How to Generate Parametric Layouts with Collection Functions
- How to Model Custom Pure Functions and 3D Transformations
1. How to Import Adobe After Effects / Lottie Animations
Anim includes a built-in fail-closed converter for supported Lottie JSON files (anim import-lottie).
Step 1: Convert Lottie JSON to .anim Source
Run the import-lottie subcommand, passing your input JSON file and specifying an output file with an .anim extension:
sh
anim import-lottie skater-girl.json -o skater_girl.anim --forceStep 2: Inspect the Output
The converter generates clean, fully editable .anim source code representing shapes, keyframes, signals, and compositions:
anim
// Generated by anim import-lottie
let layer_0_pos_x = tween(from: 100px, to: 450px, start: 0s, end: 2s);
let layer_0_pos_y = tween(from: 200px, to: 200px, start: 0s, end: 2s);
export let main = composition(
width: 1920px,
height: 1080px,
duration: 5s,
fps: 60fps,
scene: stack(children: [ ... ])
);Step 3: Validate and Render
sh
anim check skater_girl.anim
anim render skater_girl.anim --frame 30 -o skater_frame_30.pngNOTE
The Lottie importer enforces a strict fail-closed profile. Unsupported features such as bitmap image layers, gradients, text, and effects return a structured JSON path such as $.assets[0].
2. How to Build and Animate 2D Deformable Meshes (mesh2d & deform2d)
Anim supports mass-spring skeletal mesh physics with mesh2d and deform2d for realistic rubber-hose character animation and bending surfaces. Scrub the live physics render below to observe 120 Hz spring-mass solver results:
Rendered SVG2D Skeletal Physics Mesh Deformation (120 Hz Solver)
Step 1: Define the Rest Mesh Topology
Specify 2D vertices (with mobility coefficients Q16 Q0..1) and triangle indices:
anim
let character_mesh = mesh2d(
vertices: [
{x: 100px, y: 100px, mobility: 0.2},
{x: 200px, y: 100px, mobility: 0.8},
{x: 150px, y: 250px, mobility: 1.0}
],
triangles: [
{a: 0, b: 1, c: 2, fill: #e11d48}
]
);Step 2: Define Animated Target Control Points
Create dynamic target positions for the root and bone tips using signals:
anim
let sway = tween(from: -30px, to: 30px, start: 0s, end: 1.5s);
let root_pos = target2d(x: 150px, y: 100px);
let tip_pos = target2d(x: 150px + sway, y: 250px);Step 3: Solve the Deformable Physics Simulation
Invoke deform2d to bind mesh vertices to control targets using deterministic spring constraints:
anim
let deformed_character = deform2d(
mesh: character_mesh,
skeleton: rig,
root: root_pos,
tips: [tip_pos],
tick: 1s / 120,
iterations: 4,
edge_stiffness: 0.35,
area_stiffness: 0.15,
tether_stiffness: 0.20,
soft_damping: 0.12
);3. How to Render Frame Sequences and Video Outputs
Anim supports CPU raster rendering, single-frame SVG output, PNG sequences, and streaming video via FFmpeg integration.
Scenario A: Exporting High-Resolution PNG Sequence
To export a range of frames (e.g. frames 0 to 120) with padded frame numbers:
sh
mkdir -p output
anim render my_scene.anim --range 0..120 -o output/frame_%04d.png --forceScenario B: Exporting Vector SVG Output
To export a specific frame as standalone SVG:
sh
anim render my_scene.anim --frame 45 -o output/frame_45.svgScenario C: Exporting MP4 / WebM Video
To export video directly using installed FFmpeg:
sh
anim render my_scene.anim --range 0..300 -o animation.mp4 \
--video raster \
--video-codec libx264 \
--background "#ffffff"4. How to Generate Parametric Layouts with Collection Functions
Anim supports pure functional operations (map, filter, fold, scan, zip, range) to construct repetitive graphics programmatically without imperative loops. Here range and map line up a whole parade of hopping penguins from a single template:
Live canvasPenguin Parade with map & range
5. How to Project Source-Defined 3D Data
Anim's renderer is 2D, but pure records and functions can model points and project them into 2D geometry. This is how the gallery's cube example creates an isometric scene without implying a depth buffer or general 3D renderer.
Step 1: Define Pure Vector Helper Functions
anim
let vector(x, y, z) = {x: x, y: y, z: z};
let project_3d(v) = {
x: 400px + (v.x - v.z) * 87px,
y: 300px + (v.x + v.z) * 50px - v.y * 100px
};Step 2: Map 3D Vertices to 2D Primitives
anim
let point_3d = vector(x: 1, y: 1 / 2, z: 2);
let projected = project_3d(v: point_3d);
let point_node = ellipse(
x: projected.x - 5px,
y: projected.y - 5px,
width: 10px,
height: 10px,
fill: #f59e0b
);Use the reference manual for the implemented syntax, constructors, diagnostic codes, and CLI flags.