Skip to content
Docs
Open Promoeyes
match-morph-particles

match-morph-particles

Particle Morph — match-move pairs that dissolve into a particle swarm.

Read the rig's notes
Twenty-three scenes chained with transition="match". Three match-key chains
run through the reel and EVERY hop of each chain opts into the particle morph
via morph="particles": the outgoing element dissolves into a seeded additive
swarm that flies curved bézier paths and converges into its matched
counterpart while the counterpart fades in (source fades out over the first
~35% of the gap, the swarm alone carries the middle, the target forms over
the last ~35%).

  hero  — the large centre element (text / image / device / emoji), scenes 1→23
  flux  — a secondary element orbiting the upper corners, scenes 4→23
  spark — a small accent (shape / text / image) in the lower corners, scenes 4→23

Scenes 1-3 are the original minimal tour (text → image → device, single
chain, non-matched 
twenty-scene gauntlet: every scene carries a UNIQUE trio of elements (texts,
placeholder images, ipad/laptop/chrome/iphone rigs, emoji, rects, circles)
and all three morph simultaneously in every gap. The background haze sprites
(match keys mh-haze-a/b) colour/pose-morph the classic way in the same gaps —
proving classic pairs and particle pairs coexist.

Param showcases along the way: mm15 morph-color (flat tint), mm17
morph-count="12000", mm19 morph-spread="2.2", mm21 morph-size + normal
blending, mm22 morph-stagger="0.7". morph-seed pins a swarm layout (defaults
derive from the match key).

Longer transition_duration (1.2s vs the usual 0.65-0.85) gives the flights
room to read.
Scenes
23
Kind
reference rig
//
    Particle Morph — match-move pairs that dissolve into a particle swarm.

    Twenty-three scenes chained with transition="match". Three match-key chains
    run through the reel and EVERY hop of each chain opts into the particle morph
    via morph="particles": the outgoing element dissolves into a seeded additive
    swarm that flies curved bézier paths and converges into its matched
    counterpart while the counterpart fades in (source fades out over the first
    ~35% of the gap, the swarm alone carries the middle, the target forms over
    the last ~35%).

      hero  — the large centre element (text / image / device / emoji), scenes 1→23
      flux  — a secondary element orbiting the upper corners, scenes 4→23
      spark — a small accent (shape / text / image) in the lower corners, scenes 4→23

    Scenes 1-3 are the original minimal tour (text → image → device, single
    chain, non-matched 
    twenty-scene gauntlet: every scene carries a UNIQUE trio of elements (texts,
    placeholder images, ipad/laptop/chrome/iphone rigs, emoji, rects, circles)
    and all three morph simultaneously in every gap. The background haze sprites
    (match keys mh-haze-a/b) colour/pose-morph the classic way in the same gaps —
    proving classic pairs and particle pairs coexist.

    Param showcases along the way: mm15 morph-color (flat tint), mm17
    morph-count="12000", mm19 morph-spread="2.2", mm21 morph-size + normal
    blending, mm22 morph-stagger="0.7". morph-seed pins a swarm layout (defaults
    derive from the match key).

    Longer transition_duration (1.2s vs the usual 0.65-0.85) gives the flights
    room to read.
promo#match-morph-particles
  // 1/23 · TEXT — the headline dissolves into the swarm at the cut
  scene#mm-text(duration=4.5 transition=match)
    
    camera(type=perspective fov=30 near=8.5 far=17000 position="0 4.25 850" look_at="0 4.25 0")
    background(top=#0a1020 bottom=#050505)
    // background haze (mandatory): two additive glow lobes, classic-matched
    haze#s1-haze-a(match=mh-haze-a position="-289 153 -510" opacity=0.30 color=#123a5c size="51000 37400" pulse=0 decay=0)
    haze#s1-haze-b(match=mh-haze-b position="306 -170 -510" opacity=0.22 color=#3a1440 size="44200 34000" pulse=0 decay=0)
    text#s1-hero(text=PARTICLES kind=layer match=hero morph=particles morph-seed=7 morph-spread=1.2 gradient="#9be7ff,#3f6cff" color=#9be7ff weight=800 size=240 worldHeight=68 align=center position="0 8.5 0")
    // non-matched: rides the normal non-matched fade, not the morph
    text#s1-cap(text="01 · TEXT → IMAGE" kind=layer color=#8b93a7 weight=600 size=64 worldHeight=13.6 align=center position="0 -132 0")
  // 2/23 · IMAGE — the swarm lands here; then this image dissolves toward the device
  scene#mm-image(duration=4.5 transition=match)
    
    camera(type=perspective fov=30 near=8.5 far=17000 position="25.5 8.5 799" look_at="8.5 4.25 0")
    background(top=#0d0a20 bottom=#050505)
    haze#s2-haze-a(match=mh-haze-a position="-221 -119 -510" opacity=0.26 color=#1b2a5e size="44200 34000" pulse=0 decay=0)
    haze#s2-haze-b(match=mh-haze-b position="255 187 -510" opacity=0.26 color=#4a1638 size="51000 37400" pulse=0 decay=0)
    image#s2-art(match=hero morph=particles morph-seed=7 description="Abstract neon nebula artwork, cyan and violet light ribbons converging into a bright core over deep navy, soft volumetric haze, cinematic, no text" width=238 height=145 color=#14243d href="" position="0 8.5 0")
    text#s2-cap(text="02 · IMAGE → DEVICE" kind=layer color=#8b93a7 weight=600 size=64 worldHeight=13.6 align=center position="0 -132 0")
  // 3/23 · DEVICE — the image's swarm converges onto the phone
  scene#mm-device(duration=4.5 transition=match)
    
    camera(type=perspective fov=30 near=8.5 far=17000 position="-34 12.75 765" look_at="-8.5 0 0")
    background(top=#081418 bottom=#050505)
    haze#s3-haze-a(match=mh-haze-a position="-255 204 -510" opacity=0.24 color=#0f3d44 size="47600 34000" pulse=0 de