ry-anim
Animation module for Ry-Dit - 12 Disney Principles + Visual Effects + Science Animations

Overview
ry-anim is a comprehensive animation library implementing the 12 principles of Disney animation, visual effects (bloom, chromatic aberration, motion blur), optical illusions, science-based animations, and sprite animation systems.
Designed for game engines and creative coding, it provides 58+ tested functions covering easing, squash & stretch, anticipation, follow-through, arcs, secondary action, timing, exaggeration, and more.
Features
🎨 12 Disney Animation Principles
| Principle |
Function |
Description |
| Squash & Stretch |
squash(), stretch() |
Deformation while maintaining volume |
| Anticipation |
anticipate() |
Wind-up before main action |
| Follow Through |
follow_through() |
Parts continue moving after stop |
| Overlapping Action |
overlapping_action() |
Different parts at different speeds |
| Slow In & Slow Out |
ease_in(), ease_out(), ease_in_out() |
Easing functions |
| Arcs |
arc_path() |
Curved trajectories |
| Secondary Action |
secondary_action() |
Supporting movements |
| Timing |
timing() |
Keyframe interpolation |
| Exaggeration |
exaggerate() |
Amplify motion for appeal |
| Solid Drawing |
solid_rotation() |
3D perspective awareness |
| Appeal |
appeal() |
Make shapes more attractive |
| Pose-to-Pose |
pose_to_pose() |
Interpolation between key poses |
✨ Visual Effects
- Bloom - Diffuse glow on bright areas
- Chromatic Aberration - RGB channel separation
- Motion Blur - Directional blur for movement
- Neon Glow - Configurable neon effect
- Particle Trails - Trailing particle effects
- Morph Shapes - Smooth shape transitions
🔬 Science Animations
- Wave Interference - Physics wave patterns
- Pendulum Waves - Synchronized pendulum motion
- Cell Division - Biological mitosis animation
- Chemical Crystallization - Crystal formation
- L-System Trees - Procedural plant growth
- Tusi Couple - Historical mathematical mechanism
- Walk Cycle - Fauna walking animation
- Flight Pattern - Bird flapping animation
🎭 Optical Illusions
- Rotating Snakes - Circular motion illusion
- Café Wall - Parallel lines appear tilted
- Troxler Fading - Disappearance by fixation
- Pulsing Star - Pulsating star effect
- Zöllner Effect - Non-parallel line illusion
- Motion-Induced Blindness - Disappearing dots
🎬 Sprite Animation System
- Frame Animation - Frame-by-frame sprite playback
- Sprite Sheet Parser - Parse sprite sheet images
- Animation State Machine - Manage animation states
- Animation Blending - Smooth transitions between states
- Sprite Events - Trigger events at specific frames
- Sprite Flip - Horizontal/vertical sprite flipping
Installation
[dependencies]
ry-anim = "0.7.34"
ry-core = "0.8.2"
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
Quick Start
Easing Functions
use ry_anim::AnimModule;
use ry_core::RyditModule;
use serde_json::json;
let anim = AnimModule;
let eased = anim.execute("ease_in", json!([0.5]))?;
assert_eq!(eased.as_f64().unwrap(), 0.25);
let eased = anim.execute("ease_out", json!([0.5]))?;
assert_eq!(eased.as_f64().unwrap(), 0.75);
let eased = anim.execute("ease_in_out", json!([0.5]))?;
assert_eq!(eased.as_f64().unwrap(), 0.5);
Squash & Stretch
let squash = anim.execute("squash", json!([2.0]))?;
let stretch = anim.execute("stretch", json!([1.5]))?;
Anticipation
let anticipate = anim.execute("anticipate", json!([100.0, 200.0, 20.0]))?;
Arc Path
let arc = anim.execute("arc_path", json!([0.0, 0.0, 10.0, 0.0, 5.0, 0.5]))?;
Keyframe Timing
let keyframes = json!([[0.0, 0.0], [30.0, 100.0], [60.0, 0.0]]);
let value = anim.execute("timing", json!([keyframes, 15.0]))?;
Sprite Animation
let frame = anim.execute("frame_animation", json!([0, 10, 5]))?;
let flipped = anim.execute("sprite_flip", json!(["horizontal"]))?;
API Reference
Core Module
All functions are accessed through the AnimModule struct implementing RyditModule:
pub struct AnimModule;
impl RyditModule for AnimModule {
fn name(&self) -> &'static str { "anim" }
fn version(&self) -> &'static str { "0.12.0" }
fn register(&self) -> HashMap<&'static str, &'static str>;
fn execute(&self, command: &str, params: Value) -> ModuleResult;
}
Available Commands
Easing
| Command |
Parameters |
Returns |
Description |
ease_in |
[t: f64] |
f64 |
Quadratic ease in: t² |
ease_out |
[t: f64] |
f64 |
Quadratic ease out: t(2-t) |
ease_in_out |
[t: f64] |
f64 |
Quadratic ease in-out |
Deformation
| Command |
Parameters |
Returns |
Description |
squash |
[factor: f64] |
[f64, f64] |
[scale_x, scale_y] for squash |
stretch |
[factor: f64] |
[f64, f64] |
[scale_x, scale_y] for stretch |
Motion
| Command |
Parameters |
Returns |
Description |
anticipate |
[pos, target, amount] |
f64 |
Anticipated position |
follow_through |
[amp, decay, freq, t] |
f64 |
Follow-through oscillation |
overlapping_action |
[base, offsets, t] |
f64 |
Layered movement |
arc_path |
[sx, sy, ex, ey, curvature, t] |
[f64, f64] |
Position on arc |
secondary_action |
[primary, offset, amp, t] |
[f64, f64] |
[primary, secondary] |
timing |
[keyframes, frame] |
f64 |
Interpolated value |
exaggerate |
[base, factor, t] |
f64 |
Exaggerated value |
solid_rotation |
[x, y, z, angle] |
[f64; 3] |
3D rotation |
appeal |
[shape, factor] |
Value |
Enhanced shape |
pose_to_pose |
[pose1, pose2, t] |
Value |
Interpolated pose |
Visual Effects
| Command |
Parameters |
Returns |
neon_glow |
[color, intensity, spread] |
Value |
motion_blur |
[direction, strength] |
Value |
chromatic_aberration |
[offset] |
Value |
bloom_effect |
[threshold, intensity] |
Value |
particle_trails |
[count, length, color] |
Value |
morph_shapes |
[shape1, shape2, t] |
Value |
Science
| Command |
Parameters |
Returns |
wave_interference |
[sources, resolution] |
Value |
pendulum_waves |
[count, duration] |
Value |
cell_division |
[stage] |
Value |
chemical_crystallization |
[progress] |
Value |
lsystem_tree |
[iterations, angle] |
Value |
tusi_couple |
[radius, angle] |
Value |
walk_cycle |
[phase, speed] |
Value |
flight_pattern |
[wing_angle, speed] |
Value |
Optical Illusions
| Command |
Parameters |
Returns |
rotating_snakes |
[count, radius, t] |
Value |
cafe_wall |
[rows, cols, offset] |
Value |
troxler_fading |
[fixation, elements] |
Value |
pulsing_star |
[size, phase] |
Value |
zollner_effect |
[lines, hatch_angle] |
Value |
motion_blindness |
[targets, t] |
Value |
Sprites
| Command |
Parameters |
Returns |
frame_animation |
[total, current, speed] |
Value |
sprite_sheet_parse |
[path, cols, rows] |
Value |
animation_state |
[state, params] |
Value |
animation_blend |
[from, to, t] |
Value |
sprite_events |
[frame, events] |
Value |
sprite_flip |
[direction] |
Value |
Performance
- Zero allocations in easing functions (pure math)
- JSON-based command interface for scripting flexibility
- 58 unit tests ensuring correctness across all functions
- 2900+ lines of production-ready animation code
Dependencies
| Crate |
Version |
Purpose |
ry-core |
0.8.2 |
Module trait system |
serde_json |
1.0 |
JSON serialization |
serde |
1.0 |
Derive macros |
Examples
Ball Bounce Animation
use ry_anim::AnimModule;
use ry_core::RyditModule;
use serde_json::json;
let anim = AnimModule;
let mut y = 0.0;
let mut velocity = 0.0;
let gravity = 9.8;
for frame in 0..120 {
let t = frame as f64 / 60.0;
velocity += anim.execute("ease_in", json!([gravity * 0.016]))?
.as_f64().unwrap();
y += velocity;
if y >= 100.0 {
y = 100.0;
velocity *= -0.7; let squash = anim.execute("squash", json!([1.3]))?;
println!("Bounce! Squash factor: {:?}", squash);
}
}
Smooth Camera Follow
let camera_pos = 50.0;
let player_pos = 150.0;
let anticipate = anim.execute("anticipate",
json!([camera_pos, player_pos, 10.0]))?;
let arc = anim.execute("arc_path",
json!([camera_pos, 0.0, player_pos, 0.0, 20.0, 0.5]))?;
println!("Camera moves from {} along arc {:?}", camera_pos, arc);
Walk Cycle Animation
for phase in 0..100 {
let t = phase as f64 / 100.0;
let walk = anim.execute("walk_cycle", json!([t, 1.0]))?;
}
Roadmap
Contributing
Contributions are welcome! This crate is part of the Ry-Dit game engine project.
Please read CONTRIBUTING.md for guidelines.
License
MIT License - See LICENSE for details.
Related Crates
| Crate |
Description |
| ry-core |
Core traits and module system |
| ry-gfx |
Graphics layer with GPU instancing |
| ry-physics |
Physics simulation |
| ry-backend |
Dual backend (raylib + SDL2) |
| migui |
Immediate mode GUI |
ry-anim - Bringing Disney magic to Rust game development 🎬✨
58 tests · 2900+ lines · 12 Disney principles · 6 optical illusions · 8 science animations