Purpose
Animate two googly-style eyes whose pupils wander on a periodic path inside their scleras. The key detail: each pupil moves independently with a small asymmetric offset, so the eyes don't look like a stamp.
Params
{
"sclera_color": "#FFFFFF",
"pupil_color": "#0F0F0F",
"eye_radius_px": 200,
"pupil_radius_px": 80,
"spacing_px": 60, // horizontal gap between the two eyes
"cycle_frames": 75, // ~2.5s at 30fps for a full pupil tour "asymmetric_pupil_offset_px": 4, // 2nd eye's pupil is offset by N px from 1st "easing": "ease-out-cubic" }
## Behaviour
1. Render two circles (scleras) side by side at `spacing_px` apart.
2. For each sclera, render a smaller pupil that moves along a periodic path:
- center → left → right → down → center
- Each leg takes `cycle_frames / 4` frames
3. Pupil 2 has a constant offset applied to break symmetry.
The asymmetry is the whole point. Two pupils moving in lock-step look mechanical / dead. Tiny decorrelation = alive.
## Style pack overrides
- **SP-A (marshmallow)** — sclera white, pupils ink, spacing 60, cycle 75 frames.
- Other packs: rare, occasional in SP-G as illustration mascot.
## Quality Checks
- Two eyes visible side-by-side.
- Pupils move in a periodic loop with full traversal.
- Asymmetric offset ≥ 2 (without it, eyes look like a doll's).
- Pupils don't exit their sclera bounds (clip inside).
## Failure Modes
- **Eyes look like a stamp.** No asymmetric offset; pupils move in lockstep. Set `asymmetric_pupil_offset_px ≥ 2`.
- **Pupil escapes sclera.** Path range too wide. Reduce so `pupil_pos + pupil_radius < eye_radius`.
- **Eyes feel nervous.** Cycle too fast. Bump to 75+ frames.
- **Eyes feel dead.** Cycle too slow (150+ frames). Reduce.