| name | googly-eye-loop |
| description | motion-graphic primitive — pair of eyes (sclera + pupils) where each pupil tracks a periodic path with asymmetric independent offset to break the "doll-eyes" feel. canonical mascot beat (sp-a marshmallow). distinct sub-type of character-loop. |
googly-eye-loop
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,
"cycle_frames": 75,
"asymmetric_pupil_offset_px": 4,
"easing": "ease-out-cubic"
}
Behaviour
- Render two circles (scleras) side by side at
spacing_px apart.
- 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
- 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.