transition-lens
transition-lens
Transition Lens — Cameras That Cut.
Read the rig's notes
Fourteen scenes. The first twelve boundaries chain on transition="match",
each driven by a transition-camera program (engine/camera-transitions.ts):
whip pans left, right and up (plus foreground parallax whips on both sides
and a final whip encore — six whip-family cuts), crash zooms in and out, a
full barrel roll, a full orbit, a look-up-and-back and a rack focus. The
last boundary is the odd one out on purpose: transition="blur-dissolve",
a full-frame shader blend (engine/transition-shaders.ts) rather than a
camera program — the CTA softens out of focus, the sign-off resolves into
it, and the two crossfade while both are at peak blur. Being a shader gap
it is EXCLUSIVE with match, so the haze lobes and puck simply crossfade
across it instead of running on. The scenes
tell a mini product story for a fictional shipping tool ("Bolt") — the
transitions carry the story and are never named on screen.
Per-boundary gap lengths ride the new per-scene transition-duration attr
(whips 0.35-0.45s, roll/orbit/look-up ~1.0-1.2s, the closing focus
dissolve 0.9s). Camera
programs are identity at both gap ends, so every move lands exactly on the
next scene's authored camera; scene rigs hold still for the last/first beats
(except tl11's deliberate constant-velocity glide, which feeds its whip).
Continuity machinery: three glow-sprite haze lobes (match hz1/hz2/hz3) and a
small lens puck (match puck — same circle, color/pose morphing) travel
through every gap; boundary-local pairs (bars→ring dots and phone→card as
particle swarms, aisle→focus planes, tower-top→badge, streak-bars→dashes)
give each slow boundary an object to transform. Hero copy crossfades under
the programs (non-matched), entering during the incoming half of each gap.
Wall clock: 4.2 + 11x3.4 + 4.4 + 3.0 = 49.0s scenes + 8.45s gaps = 57.45s.
Preview: /packages/runtime/index.html?project=promos/foundation/transition-lens/transition-lens.promo- Scenes
- 14
- Kind
- reference rig
//
Transition Lens — Cameras That Cut.
Fourteen scenes. The first twelve boundaries chain on transition="match",
each driven by a transition-camera program (engine/camera-transitions.ts):
whip pans left, right and up (plus foreground parallax whips on both sides
and a final whip encore — six whip-family cuts), crash zooms in and out, a
full barrel roll, a full orbit, a look-up-and-back and a rack focus. The
last boundary is the odd one out on purpose: transition="blur-dissolve",
a full-frame shader blend (engine/transition-shaders.ts) rather than a
camera program — the CTA softens out of focus, the sign-off resolves into
it, and the two crossfade while both are at peak blur. Being a shader gap
it is EXCLUSIVE with match, so the haze lobes and puck simply crossfade
across it instead of running on. The scenes
tell a mini product story for a fictional shipping tool ("Bolt") — the
transitions carry the story and are never named on screen.
Per-boundary gap lengths ride the new per-scene transition-duration attr
(whips 0.35-0.45s, roll/orbit/look-up ~1.0-1.2s, the closing focus
dissolve 0.9s). Camera
programs are identity at both gap ends, so every move lands exactly on the
next scene's authored camera; scene rigs hold still for the last/first beats
(except tl11's deliberate constant-velocity glide, which feeds its whip).
Continuity machinery: three glow-sprite haze lobes (match hz1/hz2/hz3) and a
small lens puck (match puck — same circle, color/pose morphing) travel
through every gap; boundary-local pairs (bars→ring dots and phone→card as
particle swarms, aisle→focus planes, tower-top→badge, streak-bars→dashes)
give each slow boundary an object to transform. Hero copy crossfades under
the programs (non-matched), entering during the incoming half of each gap.
Wall clock: 4.2 + 11x3.4 + 4.4 + 3.0 = 49.0s scenes + 8.45s gaps = 57.45s.
Preview: /packages/runtime/index.html?project=promos/foundation/transition-lens/transition-lens.promo
promo#transition-lens
// ==================================================================
// 01 · HOOK — "Meet Bolt." · out: WHIP LEFT (0.40s)
// ==================================================================
scene#tl01-hook(duration=4.2 transition=match transition-camera=whip-left transition-duration=0.4)
camera(type=perspective fov=32 near=8.5 far=17000 position="0 12.75 850" look_at="0 8.5 0")
position
0 0 12.75 850
0.15 linear 0 12.75 850
3.9 easeOutCubic 0 10.2 791
4.2 easeInCubic 10.2 10.2 791
look_at
0 0 0.1 0
3.9 easeOutCubic 0.03 0.1 0
4.2 easeInCubic 0.08 0.1 0
fov
0 32
background(top=#0a1024 bottom=#050505)
// mandatory living haze · three matched lobes, drifting frame-left (pre-echo of the whip)
haze#tl01-hz1(match=hz1 opacity=0.052 color=#123a5c size="142800 119000" pulse=0 decay=0)
position
0 -357 187 -1146
4.2 easeInOutCubic -391 170 -1146
haze#tl01-hz2(match=hz2 opacity=0.045 color=#2a1f5e size="142800 117810" pulse=0 decay=0)
position
0 323 -170 -1146
4.2 easeInOutCubic 289 -187 -1146
haze#tl01-hz3(match=hz3 opacity=0.026 color=#175f6b size="122400 102000" pulse=0 decay=0)
position
0 42.5 25.5 -1146
4.2 easeInOutCubic 8.5 42.5 -1146
// lens puck · matched circle, travels every gap of the reel
circle#tl01-puck(match=puck position="247 115 -42.5" r=25.5 fill=#37e3ff opacity=0.85)
// hero + copy (non-matched — crossfade under the programs)
text#tl01-hero(text="Meet Bolt." kind=layer gradient="#37e3ff,#8f7bff" color=#37e3ff weight=800 size=240 worldHeight=61.2 align=center position="0 29.75 0")
position
0.3 0 -10.2 0
0.65 easeOutCubic 0 0 0
opacity
0.3 0
0.65 easeOutCubic 1
blur
0.3 5
0.65 easeOutCubic 0
text#t