Skip to content
Docs
Open Promoeyes
wrap

wrap

morph="wrap" — peel off like a sticker, wrap a glossy solid (match-morph-wrap.ts).

Read the rig's notes
One densely subdivided sheet: every vertex has a home on the outgoing frame,
on the incoming frame, and on a parametric solid at the same UV. A peel front
travels diagonally across the picture — the band lifts toward the camera and
curls over, behind it the picture lies on the solid's skin. The covered solid
floats in front of the frame, tilts, turns under a glossy studio look, a wipe
with a hot edge swaps its skin for the incoming picture, and a second front
peels it back off, flat, into the incoming element. Exact at both ends.

  morph-shape    sphere | torus | cylinder | cube   (sphere)
  morph-size     solid radius × √(w·h) of the frame  (0.34)
  morph-spread   turns while covered                (1)
  morph-color    backing where the picture is transparent (snapshot average)
  morph-seed     jitters the peel directions

ONE scene, in-scene `morph-to` links, so mid-morph frames can be shot. A
round trip, one shape per hand-off (the SOURCE owns each link's knobs):

  1.2 → 3.0    stat card → iphone       sphere (defaults)
  4.0 → 5.8    iphone → app-grid card   torus
  6.8 → 8.6    app-grid card → ipad     cube   morph-spread=0.75
  9.6 → 11.4   ipad → stat card         cylinder · morph-size=0.3
Camera never stops: linear kfs orbit r 1051 around 0 0 0, each hand-off swings side to side (+26°→−33°, −22°→+38°, +29°→−24°, −36°→+31°) through a 0.92r dip at its midpoint.

Preview: http://localhost:4444/runtime?project=promos/primitives/morphs/wrap.promo
Topic
morphs
Scenes
1
Kind
reference rig
//
    morph="wrap" — peel off like a sticker, wrap a glossy solid (match-morph-wrap.ts).

    One densely subdivided sheet: every vertex has a home on the outgoing frame,
    on the incoming frame, and on a parametric solid at the same UV. A peel front
    travels diagonally across the picture — the band lifts toward the camera and
    curls over, behind it the picture lies on the solid's skin. The covered solid
    floats in front of the frame, tilts, turns under a glossy studio look, a wipe
    with a hot edge swaps its skin for the incoming picture, and a second front
    peels it back off, flat, into the incoming element. Exact at both ends.

      morph-shape    sphere | torus | cylinder | cube   (sphere)
      morph-size     solid radius × √(w·h) of the frame  (0.34)
      morph-spread   turns while covered                (1)
      morph-color    backing where the picture is transparent (snapshot average)
      morph-seed     jitters the peel directions

    ONE scene, in-scene `morph-to` links, so mid-morph frames can be shot. A
    round trip, one shape per hand-off (the SOURCE owns each link's knobs):

      1.2 → 3.0    stat card → iphone       sphere (defaults)
      4.0 → 5.8    iphone → app-grid card   torus
      6.8 → 8.6    app-grid card → ipad     cube   morph-spread=0.75
      9.6 → 11.4   ipad → stat card         cylinder · morph-size=0.3
    Camera never stops: linear kfs orbit r 1051 around 0 0 0, each hand-off swings side to side (+26°→−33°, −22°→+38°, +29°→−24°, −36°→+31°) through a 0.92r dip at its midpoint.

    Preview: http://localhost:4444/runtime?project=promos/primitives/morphs/wrap.promo
promo#morph-wrap
  scene#one(duration=12.4)
    camera(type=perspective fov=42 near=8.5 far=17000 position="517.5 182.5 896.4" look_at="0 0 0")
      properties
        frame
          keyframes
            kf(time=0 easing=linear position="517.5 182.5 896.4" look_at="0 0 0")
            kf(time=1.2 easing=linear position="456.2 146.3 935.4" look_at="0 0 0")
            kf(time=2.1 easing=linear position="-33.7 67.4 964.0" look_at="0 0 0")
            kf(time=3.0 easing=linear position="-570.2 -91.6 878.1" look_at="0 0 0")
            kf(time=4.0 easing=linear position="-382.0 254.3 945.5" look_at="0 0 0")
            kf(time=4.9 easing=linear position="16.8 101.1 961.5" look_at="0 0 0")
            kf(time=5.8 easing=linear position="646.7 -36.7 827.7" look_at="0 0 0")
            kf(time=6.8 easing=linear position="504.6 -146.3 910.3" look_at="0 0 0")
            kf(time=7.7 easing=linear position="-16.8 84.3 963.1" look_at="0 0 0")
            kf(time=8.6 easing=linear position="-408.8 307.3 918.2" look_at="0 0 0")
            kf(time=9.6 easing=linear position="-616.3 73.3 848.2" look_at="0 0 0")
            kf(time=10.5 easing=linear position="33.3 151.3 954.4" look_at="0 0 0")
            kf(time=11.4 easing=linear position="537.3 -128.1 894.2" look_at="0 0 0")
            kf(time=12.4 easing=linear position="624.7 -164.4 829.0" look_at="0 0 0")
    background(top=#101626 bottom=#05070d)
    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.4 position="-900 400 -1600" color=#3b5bff size="120000 100000" pulse=0 decay=0)
    haze#hz1(blend=add opacity=0.3 position="900 -500 -1700" color=#9b3bff size="110000 90000" pulse=0 decay=0)
    text#title(text="wrap" kind=layer font="Roboto" size=200 worldHeight=40 color=#e8eefc weight=700 align=center position="0 400 0")
    text#sub(text="peel like a sticker · wrap a glossy solid · turn · swap the skin · unwrap" kind=layer font="Roboto" size=110 worldHeight=18 color=#8ea3c8 weight=500 align=center position="0 360 0")

    //