Skip to content
Docs
Open Promoeyes
camera-framing-dof

camera-framing-dof

Topic
camera
Scenes
2
Kind
reference rig
promo#camera-framing-dof
  // =======================================================================
  // SCENE 01 · INTO A WEBSITE — a page dived into from the side, on DOF
  // =======================================================================
  scene#d01-login(duration=20 transition=match-move transition-duration=0.8)

    // The vocabulary aimed at ONE shot: go from the whole browser window down
    // to the pixels of a single button, at a grazing angle, and let depth of
    // field carry the distance.
    // 0.0 to 1.4    the establishing pose, nearly deep focus
    // 3.0 to 5.2    the whole window, from the side — offset parks it right
    // 7.0 to 9.2    the sign-in card
    // 11.0 to 13.0  the password row
    // 14.8 to 16.6  the button — 90 mm out, on a 50° lens
    // 18.2 to 20    back out to the window
    camera(type=perspective fov=34 near=8.5 far=17000 position="0 -15 1100" look_at="0 -15 0" dof_pass=three dof_depth=scene focus=500 dof_range=200 dof_blur=22)
      properties
        frame(smooth=0.24)
          keyframes
            kf(time=0 position="0 -15 1100" look_at="0 -15 0" fov=34 dof_range=1000 dof_blur=32.4 easing=easeInOutCubic)
            
            kf(time=0.5 position="0 -15 1100" look_at="0 -15 0" fov=34 dof_range=100 dof_blur=34)
            
            kf(time=3.0 node=d01-web side=world fill=72 offset="-40 0 0" fov=40 dof_range=136 dof_blur=32.4 easing=easeInOutCubic)
            kf(time=5.2 node=d01-web side=world fill=72 offset="-40 0 0" fov=40 dof_range=200 dof_blur=32.4 easing=linear)
            kf(time=7.0 node=d01-signin side=world fill=60 fov=42 dof_range=1000 dof_blur=34.6 easing=easeInOutCubic)
            kf(time=9.2 node=d01-signin side=world fill=60 fov=42 dof_range=119 dof_blur=34.6 easing=linear)
            kf(time=11.0 node=d01-pw side=world fill=95 fov=42 dof_range=60 dof_blur=36.7 easing=easeInOutCubic)
            kf(time=13.0 node=d01-pw side=world fill=95 fov=42 dof_range=60 dof_blur=36.7 easing=linear)
            kf(time=14.8 node=d01-btn side=world fill=95 fov=50 dof_range=49 dof_blur=36.7 easing=easeInOutCubic)
            kf(time=16.6 node=d01-btn side=world fill=95 fov=50 dof_range=49 dof_blur=36.7 easing=linear)
            kf(time=18.2 node=d01-web side=world fill=72 offset="-40 0 0" fov=40 dof_range=136 dof_blur=32.4 easing=easeInOutCubic)
            kf(time=20 node=d01-web side=world fill=72 offset="-40 0 0" fov=40 dof_range=136 dof_blur=32.4 easing=linear)
    // The auto-injected DOF pass is appended to the END of this chain, and the
    // generic promo composer has no OutputPass — a chain that terminates in a
    // raw ShaderPass hits the canvas LINEAR and the whole frame reads far too
    // dark (measured here: a #0f151f page came back as rgb 1,2,3). film_grain
    // carries the ACES + linear→sRGB transform itself, so it does the output
    // duty. This reel needs a <postprocessing> block BECAUSE of the DOF.
    // DOF scenes lose MSAA (the composer target is non-multisampled), so FXAA.
    background(top=#0b1020 bottom=#05070f)
    lights
      light#amb(type=ambient color=#8fb2ff intensity=0.9)
      light#key(type=directional color=#ffffff intensity=1.9 position="340 680 510")
      light#fill(type=directional color=#7aa2ff intensity=0.8 position="-510 170 340")
    // Sized so the radial falloff is IN frame at the establishing distance — a
    // lobe wider than the shot only ever shows its core, which reads as a flat
    // colour wash rather than haze.
    haze#hz0(match=hz0 blend=add opacity=0.5 position="-620 320 -900" color=#2563EB size="2600 2100" pulse=0 decay=0)
    haze#hz1(match=hz1 blend=add opacity=0.42 position="640 -300 -900" color=#8B5CF6 size="2900 2300" pulse=0 decay=0)
    haze#hz2(match=hz2 blend=add opacity=0.3 position="60 40 -1100" color=#00C8FF size="2200 1800" pulse=0 decay=0)
    text#d01-title(text="into the screen" kind=layer size=200 worldHeight=44 color=#e8eefc weight=700 align=center position="0 300 0")