Y
🎬
Module 1

Advanced 2D AnimationTraditional Principles Meet Digital Pipeline

⏱️ 12–16 hours📊 Beginner🧩 3 Code Blocks🏗️ 1 Project

🎯 Learning Objectives

  • Master the 12 Principles of Animation — the foundation used at every major studio.
  • Understand frame timing, spacing, and the difference between animating on 1s, 2s, and 3s.
  • Learn digital vector animation and puppet rigging in Toon Boom Harmony.
  • Build a professional walk cycle and character acting shot from scratch.
  • Understand the studio pipeline: from storyboard to final composite.

📋 Prerequisites

A drawing tablet (Wacom/iPad) OR mouseBasic computer skillsNo animation experience required — we start from frame one!

📐 Technical Theory

🎬 What is Animation? (The Industry Perspective)

Animation is NOT just "making things move." At a professional level, animation is the art of creating the ILLUSION of life. Every frame is a deliberate decision — there are no accidents in great animation. The pipeline at a major studio like Pixar or Disney follows strict phases: 1. Story & Script → What are we telling? 2. Storyboarding → Visual blueprint of every shot 3. Pre-visualization (Pre-viz) → Rough 3D/2D timing pass 4. Layout → Camera placement and staging 5. Blocking → Key poses only (the "storytelling" pass) 6. Splining → Smooth interpolation between keys 7. Polish → Micro-details, overlapping action, secondary motion 8. Rendering & Compositing → Final output Whether you work in 2D or 3D, this pipeline is universal. Master it once, and you can work anywhere.

📐 The 12 Principles of Animation

Created by Disney legends Frank Thomas and Ollie Johnston in the 1930s, these principles are STILL the foundation of every animation you see today — from Pixar films to video games. Think of these as the "grammar" of animation. You can break the rules creatively, but only AFTER you understand them.
#PrincipleWhat It DoesExample
1Squash & StretchGives a sense of weight and flexibilityA bouncing ball squashes on impact, stretches in the air
2AnticipationPrepares the audience for a major actionA character crouches before jumping
3StagingPresents an idea so it is clearSilhouette test — can you read the pose in shadow?
4Straight Ahead vs Pose-to-PoseTwo animation methodsStraight Ahead = wild/organic, Pose-to-Pose = controlled
5Follow Through & Overlapping ActionParts of the body move at different ratesHair keeps moving after the head stops
6Slow In / Slow Out (Ease)Motion accelerates and deceleratesA car eases into motion, doesn't teleport
7ArcsNatural motion follows curved pathsAn arm swings in an arc, not a straight line
8Secondary ActionSupporting actions reinforce the main oneWalking (primary) + swinging arms (secondary)
9TimingThe number of frames per action = mood/weightFast = light/snappy, Slow = heavy/dramatic
10ExaggerationPush beyond reality for impactA surprised character's eyes go 3× their size
11Solid Drawing / Solid PosingForms have weight, depth, and balanceAvoid "twinning" — never make both arms identical
12AppealCharacters must be interesting to watchClear design, strong silhouette, readable expressions

⏱️ Timing & Spacing — The Secret Weapon

Timing and Spacing are what separate amateur animation from professional work. They are arguably MORE important than drawing skill. • Timing = HOW MANY frames an action takes (e.g., a punch in 4 frames vs 12 frames) • Spacing = WHERE the object is on each frame (even spacing = mechanical, uneven = organic) Frame Rate Standards: • Film: 24 fps (frames per second) • TV Animation: 24 fps, often animated on 2s (12 unique drawings per second) • Games: 30 or 60 fps • Web: 24 fps Animating "on 1s" means a new drawing every frame (24 drawings/sec) — smooth but expensive. Animating "on 2s" means a new drawing every OTHER frame (12 drawings/sec) — the standard for TV.
Timing StyleFramesFeelUsed In
On 1s24 drawings/secSilky smooth, cinematicDisney features, fast action
On 2s12 drawings/secSnappy, energeticAnime, TV animation, most 2D
On 3s8 drawings/secChoppy, stylizedSpider-Verse, limited animation
MixedVaries per shotDynamic, deliberateBest studios mix freely

🖥️ Digital 2D Pipeline — Vector vs Raster

Modern 2D animation uses two primary approaches: 1. Frame-by-Frame (Raster): Draw every frame individually. Maximum artistic freedom but extremely labor-intensive. Used for: hand-drawn features, key emotional moments. 2. Puppet/Rigging (Vector): Build a character out of reusable parts (head, arms, legs, eyes) connected by joints. Animate by moving the joints. Used for: TV series, web content, games. Both are valid professional techniques. Most studios use a HYBRID — puppet rigs for dialogue scenes and frame-by-frame for action. Industry Tools: • Toon Boom Harmony — The industry standard for 2D (used by Disney TV, Cartoon Network) • Adobe Animate — Web animation, simple projects • TVPaint — Frame-by-frame specialist (used by Studio Ghibli) • OpenToonz — Free, used by Studio Ghibli

🏃 The Walk Cycle — Animator's Rite of Passage

The walk cycle is the single most important exercise in animation. Why? Because it tests EVERY principle simultaneously: • Timing (step duration) • Weight (how heavy is the character?) • Personality (confident? tired? sneaky?) • Follow-through (arms, hair, clothing) • Arcs (hips, shoulders, head) • Balance (center of gravity over the contact foot) A standard walk cycle has 4 key poses: 1. Contact — Front foot strikes the ground 2. Down — Body at its lowest point (weight transfer) 3. Passing — Back leg passes under the body 4. Up — Body at its highest point (push-off) In a typical walk at 24fps animated on 2s, one full step = 12 frames, one complete cycle (left+right) = 24 frames = 1 second.

💻 Implementation

Step 1: Setting Up a 2D Animation Project

Step 1: Setting Up a 2D Animation Project
javascript
// ── After Effects Expression: Smooth Loop ─────────────
// Apply this expression to any animated property
// to create a perfectly seamless loop.

// Ping-Pong Loop (goes forward then backward)
loopOut("pingpong");

// Cycle Loop (repeats from start)
loopOut("cycle");

// ── Bounce Expression (Physics-based) ─────────────────
// Apply to Position Y for a realistic bouncing ball
// Uses real physics: gravity + energy loss per bounce
var gravity = 2000;        // pixels per second²
var bounceHeight = 400;    // initial drop height
var dampening = 0.7;       // energy retained (0-1)
var bounceFreq = 2.5;      // bounces per second

var t = time - inPoint;
var amplitude = bounceHeight;
var decay = Math.pow(dampening, t * bounceFreq);

// Simulate bounce with sine wave + decay
value + [0, -amplitude * Math.abs(Math.sin(bounceFreq * t * Math.PI)) * decay];

// ── Walk Cycle Timing Template ────────────────────────
// Standard walk at 24fps, animated on 2s:
//
// Frame 01: Contact Pose (Right foot forward)
// Frame 03: Down Pose (Weight drops)
// Frame 07: Passing Pose (Left leg swings through)
// Frame 09: Up Pose (Push off, highest point)
// Frame 13: Contact Pose (Left foot forward)  ← MIRROR
// Frame 15: Down Pose
// Frame 19: Passing Pose
// Frame 21: Up Pose
// Frame 25: = Frame 01 (cycle complete)
//
// Total: 24 frames = 1 second per full cycle

🔧 Troubleshooting

❌ Error:Expression error: undefined value🔍 Cause:Expression applied to wrong property type✅ Fix:Ensure the expression is on Position, not Opacity or Rotation
❌ Error:Walk cycle doesn't loop cleanly🔍 Cause:First and last frames don't match✅ Fix:Ensure Frame 25 is identical to Frame 1, then set loop to (1, 24)

Step 2: Puppet Rigging in Toon Boom Harmony

Step 2: Puppet Rigging in Toon Boom Harmony
python
# ── Toon Boom Harmony — Puppet Rig Setup Guide ───────
# While Harmony uses a visual rigging interface,
# you can automate rig setup with its scripting API.

# Harmony Script: Auto-Peg Setup for Character Rig
# This creates the standard hierarchy for a puppet rig.

def create_character_rig(character_name):
    """
    Creates a professional puppet rig hierarchy.
    
    Standard Hierarchy:
    └── Master_Peg (move entire character)
        ├── Body_Peg
        │   ├── Torso
        │   │   ├── Head_Peg
        │   │   │   ├── Head
        │   │   │   ├── Eyes_Peg
        │   │   │   │   ├── Eye_L
        │   │   │   │   └── Eye_R
        │   │   │   ├── Mouth_Peg
        │   │   │   │   └── Mouth (swap library)
        │   │   │   └── Hair_Peg
        │   │   │       └── Hair (with deformers)
        │   │   ├── Arm_L_Peg
        │   │   │   ├── Upper_Arm_L
        │   │   │   ├── Forearm_L
        │   │   │   └── Hand_L (swap library)
        │   │   └── Arm_R_Peg
        │   │       └── (mirror of Arm_L)
        │   ├── Hips_Peg
        │   │   ├── Leg_L_Peg
        │   │   │   ├── Thigh_L
        │   │   │   ├── Shin_L
        │   │   │   └── Foot_L
        │   │   └── Leg_R_Peg
        │   │       └── (mirror of Leg_L)
        │   └── Shadow
        └── Effects_Peg
            ├── Motion_Blur
            └── Particles
    """
    
    # Create pegs for each body part
    pegs = {
        "Master":   f"{character_name}_Master_Peg",
        "Body":     f"{character_name}_Body_Peg",
        "Head":     f"{character_name}_Head_Peg",
        "Arm_L":    f"{character_name}_Arm_L_Peg",
        "Arm_R":    f"{character_name}_Arm_R_Peg",
        "Leg_L":    f"{character_name}_Leg_L_Peg",
        "Leg_R":    f"{character_name}_Leg_R_Peg",
    }
    
    print(f"✅ Rig hierarchy created for: {character_name}")
    print(f"   Total pegs: {len(pegs)}")
    print(f"   Deformer zones: Hips, Shoulders, Wrists")
    print(f"   Swap libraries: Mouth (visemes), Hands (poses)")
    
    return pegs

# ── Deformer Setup Notes ──────────────────────────────
# Bone Deformers: Use for limbs (smooth bend at elbows/knees)
# Curve Deformers: Use for hair, tails, tentacles (fluid motion)
# Envelope Deformers: Use for facial expressions (lattice warp)
#
# PRO TIP: Always place deformers ABOVE the artwork in
# the node view, never below. Deformers flow top-down.

🔧 Troubleshooting

❌ Error:Drawing appears behind other layers🔍 Cause:Z-depth ordering incorrect✅ Fix:Use the Top/Side view to adjust Z-depth, or reorder in the Timeline panel
❌ Error:Deformer causes artwork to "tear"🔍 Cause:Deformer influence radius too small✅ Fix:Increase the deformer envelope size in the Rigging tool options

Step 3: Understanding Animation Curves (F-Curves)

Step 3: Understanding Animation Curves (F-Curves)
python
# ── Animation Curves: The Animator's Control Panel ────
# F-Curves (Function Curves) are the GRAPH representation
# of your animation over time. Mastering them is essential.

import numpy as np
import matplotlib.pyplot as plt

def visualise_easing_curves():
    """
    Visualise the 4 fundamental easing types.
    Every motion in animation uses one of these.
    """
    t = np.linspace(0, 1, 100)  # Normalised time (0 to 1)
    
    # 1. Linear — Constant speed (robotic, unnatural)
    linear = t
    
    # 2. Ease In — Starts slow, ends fast (acceleration)
    #    Think: a ball dropped from height (gravity)
    ease_in = t ** 2.5
    
    # 3. Ease Out — Starts fast, ends slow (deceleration)
    #    Think: a ball thrown upward (slowing down)
    ease_out = 1 - (1 - t) ** 2.5
    
    # 4. Ease In-Out — Slow start, fast middle, slow end
    #    Think: a car starting and stopping at a light
    ease_in_out = np.where(
        t < 0.5,
        2 * t ** 2,           # First half: ease in
        1 - (-2 * t + 2) ** 2 / 2  # Second half: ease out
    )
    
    # ── Plot ───────────────────────────────────────────
    fig, axes = plt.subplots(1, 4, figsize=(20, 4))
    curves = [
        (linear, "Linear\n(Robotic)", "#ff4444"),
        (ease_in, "Ease In\n(Accelerate)", "#44aaff"),
        (ease_out, "Ease Out\n(Decelerate)", "#44ff88"),
        (ease_in_out, "Ease In-Out\n(Natural)", "#ffaa44"),
    ]
    
    for ax, (curve, title, color) in zip(axes, curves):
        ax.plot(t, curve, color=color, linewidth=3)
        ax.set_title(title, fontsize=12, fontweight="bold")
        ax.set_xlabel("Time →")
        ax.set_ylabel("Value →")
        ax.grid(True, alpha=0.2)
        ax.set_xlim(0, 1)
        ax.set_ylim(0, 1)
    
    plt.suptitle(
        "The 4 Fundamental Easing Curves",
        fontsize=14, fontweight="bold", y=1.05,
    )
    plt.tight_layout()
    plt.savefig("easing_curves.png", dpi=150)
    plt.show()

visualise_easing_curves()
print("\n💡 PRO TIP: 90% of all animation uses Ease In-Out.")
print("   The curve editor is where good animation becomes GREAT.")
print("   Spend time here — it's worth it.")

🔧 Troubleshooting

❌ Error:Animation looks "floaty" or "swimmy"🔍 Cause:Bezier handles are too long, creating overshoots✅ Fix:Shorten the tangent handles or switch to "Weighted Tangents" mode
❌ Error:Motion feels robotic/linear🔍 Cause:Default interpolation is linear (no easing)✅ Fix:Select all keyframes → Right-click → Set to "Auto Bezier" or "Ease In/Out"

🏗️ Professional Project

Professional Walk Cycle & Acting Shot

Create a complete character walk cycle (24-frame loop) plus a 3-second acting/emotion shot. This is the exact portfolio piece studios look for when hiring junior animators. You'll practice timing, spacing, arcs, overlapping action, and personality — all in one assignment.

Professional Walk Cycle & Acting Shot
markdown
# ── DELIVERABLES ──────────────────────────────────────
# 1. Walk Cycle (24 frames, seamless loop)
# 2. Acting Shot (72 frames / 3 seconds)
# 3. Timing Charts for both

# ── WALK CYCLE SPECIFICATION ─────────────────────────
# Format:     1920×1080 (HD)
# Frame Rate: 24 fps
# Duration:   24 frames (1 second loop)
# Style:      On 2s (12 unique drawings)
# View:       Side profile (for clarity)

# Key Poses (MUST include):
# ┌─────────────────────────────────────────────────┐
# │ Frame 01 → Contact     (front foot strikes)     │
# │ Frame 03 → Down        (weight drops, lowest)   │
# │ Frame 07 → Passing     (swing leg passes body)  │
# │ Frame 09 → Up          (push-off, highest)      │
# │ Frame 13 → Contact     (MIRROR of frame 01)     │
# │ Frame 15 → Down        (MIRROR of frame 03)     │
# │ Frame 19 → Passing     (MIRROR of frame 07)     │
# │ Frame 21 → Up          (MIRROR of frame 09)     │
# └─────────────────────────────────────────────────┘

# ── CHECKLIST ─────────────────────────────────────────
# □ Head bobs up and down (Down pose = lowest, Up = highest)
# □ Arms swing OPPOSITE to legs (counter-balance)
# □ Hips shift side-to-side on passing position
# □ Shoulders tilt opposite to hips (contrapposto)
# □ Feet follow arcs, never slide on ground contact
# □ Hair/clothing follows through 2-3 frames late
# □ Loop is seamless — Frame 25 = Frame 01
# □ Silhouette reads clearly at every key pose

# ── ACTING SHOT SPECIFICATION ────────────────────────
# Duration:  72 frames (3 seconds)
# Emotion:   Choose one: Joy → Surprise → Sadness
# Must show: Clear emotional transition
#            At least 2 distinct poses
#            Facial expression change
#            Secondary action (fidgeting, looking away)

# ── GRADING RUBRIC ────────────────────────────────────
# Weight & Balance        25%  (Does the character feel heavy?)
# Timing & Spacing        25%  (Are the curves clean?)
# Personality / Appeal    20%  (Is it interesting to watch?)
# Overlap & Follow-Thru   15%  (Do parts move independently?)
# Technical Polish        15%  (Clean arcs, no pops, smooth loop)

🔧 Troubleshooting

❌ Error:Walk cycle "pops" at the loop point🔍 Cause:First and last frame positions don't match exactly✅ Fix:Copy frame 1 to frame 25 in the dope sheet, then trim to 24 frames
❌ Error:Character looks like they're "ice skating"🔍 Cause:Feet are sliding on the ground plane✅ Fix:Lock the contact foot position — it MUST stay planted until lift-off

Topics Covered

#12 Principles#Walk Cycle#Timing & Spacing#Toon Boom#After Effects#Puppet Rigging#Storyboards