emerge-demo
emerge-demo
emerge-demo — the ENGINE VERIFICATION reel for transition="emerge", the mirror of transition="through".
Read the rig's notes
Where `through` flies the camera INTO an element of the scene it is leaving and
grows that element's silhouette into a window onto the next one, `emerge` starts
with an element of the NEXT scene engulfing the lens and pulls the camera back
OUT of it: the scene you are leaving is held INSIDE the shrinking silhouette and
collapses into the element as the new world grows around it.
Three gaps, one per class of anchor the mask pass has to handle — the same three
`through` is verified against, because the mask pass is shared:
1 → 2 text glyph ALPHA the word "MADE" — chunky, short, heavy strokes
2 → 3 a solid PRIMITIVE a disc, which writes clean opaque alpha
3 → 4 a multi-mesh OUTLINE an <iphone>, whose silhouette is many meshes
What to look for at each gap (p = progress through the 1.2s gap):
p=0.0 100% of the OUTGOING scene — the anchor is at the lens and the mask
is wide open. Anything less means the near-plane clamp left the
anchor short of covering and the opening ramp is doing the work.
p=0.5 the outgoing frame is visibly SHRINKING inside the element's shape,
tracking it exactly, while the incoming scene fills in around it.
p=1.0 100% of the incoming scene at its authored framing, and the anchor
must NOT pop — it is drawn throughout, unlike `through`, which drops
its anchor from the outgoing pass.
Authoring contract: `through="<node-id>"` still lives on the scene that OWNS
the gap (the outgoing one), but names a node in the FOLLOWING scene, and that
node must be on screen and opaque at that scene's t=0 — no reveal, no delayed
entrance — or the solve has no bounds on the first gap frame.
Every element is keyframed EXPLICITLY rather than through a motion preset, for
one reason that matters to this reel specifically: the outgoing scene is FROZEN
at its final local time for the whole gap, so anything a preset schedules to
exit at `end` is already gone on the frame the window is widest — the gap would
open onto an empty stage and prove nothing. Everything here holds its pose to
the last frame of its scene.
Palette: void #0b0e17 · violet #8a5fe0 · cyan #37e3ff · text #f5f5f7 / #a1a1a6.
Preview: /packages/runtime/index.html?project=promos/new/emerge-demo/emerge-demo.promo- Scenes
- 4
- Kind
- reference rig
//
emerge-demo — the ENGINE VERIFICATION reel for transition="emerge", the mirror
of transition="through".
Where `through` flies the camera INTO an element of the scene it is leaving and
grows that element's silhouette into a window onto the next one, `emerge` starts
with an element of the NEXT scene engulfing the lens and pulls the camera back
OUT of it: the scene you are leaving is held INSIDE the shrinking silhouette and
collapses into the element as the new world grows around it.
Three gaps, one per class of anchor the mask pass has to handle — the same three
`through` is verified against, because the mask pass is shared:
1 → 2 text glyph ALPHA the word "MADE" — chunky, short, heavy strokes
2 → 3 a solid PRIMITIVE a disc, which writes clean opaque alpha
3 → 4 a multi-mesh OUTLINE an <iphone>, whose silhouette is many meshes
What to look for at each gap (p = progress through the 1.2s gap):
p=0.0 100% of the OUTGOING scene — the anchor is at the lens and the mask
is wide open. Anything less means the near-plane clamp left the
anchor short of covering and the opening ramp is doing the work.
p=0.5 the outgoing frame is visibly SHRINKING inside the element's shape,
tracking it exactly, while the incoming scene fills in around it.
p=1.0 100% of the incoming scene at its authored framing, and the anchor
must NOT pop — it is drawn throughout, unlike `through`, which drops
its anchor from the outgoing pass.
Authoring contract: `through="<node-id>"` still lives on the scene that OWNS
the gap (the outgoing one), but names a node in the FOLLOWING scene, and that
node must be on screen and opaque at that scene's t=0 — no reveal, no delayed
entrance — or the solve has no bounds on the first gap frame.
Every element is keyframed EXPLICITLY rather than through a motion preset, for
one reason that matters to this reel specifically: the outgoing scene is FROZEN
at its final local time for the whole gap, so anything a preset schedules to
exit at `end` is already gone on the frame the window is widest — the gap would
open onto an empty stage and prove nothing. Everything here holds its pose to
the last frame of its scene.
Palette: void #0b0e17 · violet #8a5fe0 · cyan #37e3ff · text #f5f5f7 / #a1a1a6.
Preview: /packages/runtime/index.html?project=promos/new/emerge-demo/emerge-demo.promo
promo#emerge-demo(width=1280 height=720 fps=30 coordinate-system=world-y-up)
// =============================================================
// 1. THE WORLD — a full composition, so there is something to lose.
// Collapses into scene 2's word.
// =============================================================
scene#emg-world(duration=4.4 transition=emerge through=emg-word transition-duration=1.2)
camera(type=perspective fov=32 near=8.5 far=17000 position="0 0 850" look_at="0 0 0")
position
0 0 0 850
4.4 easeInOutCubic 0 0 799
background(color=#0b0e17)
haze#emg-world-hz1(opacity=0.24 position="-544 221 -1147" color=#7a4fd4 size="115600 88400" pulse=0 decay=0)
position
0 -544 221 -1147
4.4 easeInOutCubic -476 179 -1147
haze#emg-world-hz2(opacity=0.20 position="493 -187 -1147" color=#0e86b8 size="108800 88400" pulse=0 decay=0)
position
0 493 -187 -1147
4.4 easeInOutCubic 433 -144 -1147
text#emg-world-l0(text="Everything you build" kind=layer color=#f5f5f7 weight=700 size=240 worldHeight=73.1 padding=102 align=center position="0 61.2 0")
position
0.2 0 73.1 -46.75
0.95 easeOutCubic 0 61.2 0
4.4 0 61.2 0
opacity
0.2 0.0001
0.9 easeOutQuad 1
4.4 1
blur
0.2 8
0.95 easeOutCubic 0
4.4 0
text#emg-world-l1(text="every screen, every idea, every late night" kind=layer