Skip to content
Docs
Open Promoeyes
ferrofluid

ferrofluid

morph="ferrofluid" — the picture turns into magnetic fluid (match-morph-ferrofluid.ts).

Read the rig's notes
The outgoing picture darkens into a pool of glossy black ferrofluid and the
pool erupts into a Rosensweig field: a hexagonal lattice of sharp, flared
cones — tallest where the picture is brightest and where an invisible magnet
pole sweeps across — each one a clear-coated dark mirror lit by the scene's
HDR and lights. Under cover of the spikes the pool's silhouette swaps to the
incoming element and travels to it; the spikes sink and the fluid clears
into the incoming picture. Exact at both ends (single-frame swap).

ONE scene, in-scene `morph-to` links, so mid-morph frames can be shot:

  left   (attribute form, defaults)          card → iphone → card
  right  (nested form, tuned knobs)          ipad → card → ipad
         morph-count=20 morph-size=95 morph-spread=1.6 morph-color=#0a1430 morph-seed=7

  hand-off 1   1.6 → 3.4 s
  hand-off 2   5.0 → 6.8 s

Knobs: size (tallest spike, default 0.3 × the shorter edge) · count (spikes
across the long edge, 14) · spread (magnet sweep, 1) · color (fluid tint,
#0a0a0d) · seed.

Camera never stops (linear kfs, r 1256 about the origin): each hand-off swings
across both chains — +20°→−18°, −16°→+22° azimuth, 8% closer mid-window
(kept narrow: the fluid proxy is baked through the start camera and jumps at the swap).

Preview: http://localhost:4444/runtime?project=promos/primitives/morphs/ferrofluid.promo
Topic
morphs
Scenes
1
Kind
reference rig
//
    morph="ferrofluid" — the picture turns into magnetic fluid (match-morph-ferrofluid.ts).

    The outgoing picture darkens into a pool of glossy black ferrofluid and the
    pool erupts into a Rosensweig field: a hexagonal lattice of sharp, flared
    cones — tallest where the picture is brightest and where an invisible magnet
    pole sweeps across — each one a clear-coated dark mirror lit by the scene's
    HDR and lights. Under cover of the spikes the pool's silhouette swaps to the
    incoming element and travels to it; the spikes sink and the fluid clears
    into the incoming picture. Exact at both ends (single-frame swap).

    ONE scene, in-scene `morph-to` links, so mid-morph frames can be shot:

      left   (attribute form, defaults)          card → iphone → card
      right  (nested form, tuned knobs)          ipad → card → ipad
             morph-count=20 morph-size=95 morph-spread=1.6 morph-color=#0a1430 morph-seed=7

      hand-off 1   1.6 → 3.4 s
      hand-off 2   5.0 → 6.8 s

    Knobs: size (tallest spike, default 0.3 × the shorter edge) · count (spikes
    across the long edge, 14) · spread (magnet sweep, 1) · color (fluid tint,
    #0a0a0d) · seed.

    Camera never stops (linear kfs, r 1256 about the origin): each hand-off swings
    across both chains — +20°→−18°, −16°→+22° azimuth, 8% closer mid-window
    (kept narrow: the fluid proxy is baked through the start camera and jumps at the swap).

    Preview: http://localhost:4444/runtime?project=promos/primitives/morphs/ferrofluid.promo
promo#morph-ferrofluid
  scene#one(duration=8.4)
    camera(type=perspective fov=42 near=8.5 far=17000 position="500 261 1122" look_at="0 0 0")
      properties
        frame
          keyframes
            kf(time=0 easing=linear position="500 261 1122" look_at="0 0 0")
            kf(time=1.6 easing=linear position="423 218 1162" look_at="0 0 0")
            kf(time=2.5 easing=linear position="0 101 1151" look_at="0 0 0")
            kf(time=3.4 easing=linear position="-388 0 1195" look_at="0 0 0")
            kf(time=5 easing=linear position="-339 261 1181" look_at="0 0 0")
            kf(time=5.9 easing=linear position="20 101 1151" look_at="0 0 0")
            kf(time=6.8 easing=linear position="470 -44 1164" look_at="0 0 0")
            kf(time=8.4 easing=linear position="549 -88 1126" look_at="0 0 0")
    background(top=#1a1d24 bottom=#07080b)
    environment(hdr="studio_small_04_2k" as_background=false background_color=#05070d exposure=1.0 blurriness=0.5 intensity=0.6)
    lights
      light#amb(type=ambient color=#9fb4ff intensity=0.8)
      light#key(type=directional color=#ffffff intensity=2 position="340 680 510")
      light#fill(type=directional color=#7aa2ff intensity=0.6 position="-510 170 340")
    haze#hz0(blend=add opacity=0.12 position="-900 400 -1600" color=#3b5bff size="120000 100000" pulse=0 decay=0)
    text#title(text="ferrofluid" kind=layer font="Roboto" size=200 worldHeight=40 color=#e8eefc weight=700 align=center position="0 400 0")
    text#sub(text="picture → magnetic fluid → Rosensweig spikes → sink → picture" kind=layer font="Roboto" size=110 worldHeight=18 color=#8ea3c8 weight=500 align=center position="0 358 0")

    // ── left · attribute form · defaults ──────────────────────────────────────
    ui3d#ff-card(morph=ferrofluid morph-to=ff-phone morph-at=1.6 morph-dur=1.8 width=600 height=440 world_width=300 position="-300 20 0" rotation="0 -12 0")
      card(x=0 y=0 w=600 h=440 r=34 fill=#0b1622 stroke=#35e0ff stroke_width=3 shadow=true layout=column align=start padding="36 0 0 36" gap=16)
        card(w=hug h=hug fill=transparent shadow=false layout=row align=center gap=14)
          icon(set=tabler name=magnet size=40 color=#35e0ff stroke_width=2.4)
          text(text=Field size=32 weight=900 color=#f2fbff align=left)
        text(text="Active sessions" size=22 weight=600 color=#8fb4c6 align=left)
        text(text="24,881" size=76 weight=900 color=#f2fbff align=left)
        prog