Skip to content
Docs
Open Promoeyes
Train Platform at Dusk

Train Platform at Dusk

A phone on a bench at a station platform at dusk: a low sun through the far glazing, sodium pendants and a granite floor mirroring the hall, with a strong depth of field.

A train station platform at dusk with a steel bench, a polished granite floor full of reflections, warm sodium pendants and a low sun raking through the far glazing, with a train waiting in the hazy distance. One continuous 13 s take in four beats: a backlit macro along the bench into bokeh, a rise and hold, a pull out to the wide platform, then a slow low drift over the stone.

Length
13 s
Scenes
1
Device
iphone
Style
realistic place
Camera
push in, rack focus, low angle

The AI keeps this film's shots, timing and camera, and puts your app in it.

//
    REALISM PLATFORM — "Train platform at dusk" (see SCENE.md)

    The third set of the realism series: a built interior seen directly. The hamburg_hbf_1k station
    hall is mounted as a grounded dome; a low sun rakes in through the far end's glazing, sodium
    pendants hang over the platform, and a polished granite island under the bench must mirror the
    hall (roof glazing, pendants, the red train) in every render path. Strong depth of field: the
    subject is 0.5–3.5 m away, the hall 10–15 m. Props: TRELLIS from FLUX (models/, models.json);
    the bench is primitives so its seat is exactly 450 and its steel is real metal.

    SUN  hamburg_hbf_1k's brightest texel is (127, 205) of 1024 × 512: 17.8° up, φ = −135° in
         three's equirect lookup → direction (−0.673, 0.306, −0.673). The HDR floor carries that
         sun's own pool 4–10 m out along the same line, so the key is laid along it.
    SET  the dome's capture point is the origin; the platform runs along x (tracks at z ≈ −6.6 m and
         z ≈ +4.5 m, from the HDR's floor rows). The bench stands at the origin, its long axis
         R = (−0.707, 0, −0.707), its front F = (0.707, 0, −0.707): a bench-local (bx, bz) is
         x = −0.707 (bx − bz), z = −0.707 (bx + bz); yaw 135 maps local x → R, local z → F.
         The sun comes in along +R: from the right of the wide, shadows fall left.
    Y    seat top 450 (slats 26 thick, centred 437); props y = surface + scale × |minY|.
    SCREEN  Ferro, a fictional rail-ticket app (realism-platform.screens.html → scripts/html-screens.mts);
         while the camera holds on the phone the platform changes 7 → 4 and the ticket turns "Boarding".

    Authored look is the series' common case: no tone curve (sRGB only), SSAA 4. Everything else is a
    render-time switch on the URL (gpu/realism, gpu/pathtrace).
    Preview: http://localhost:4444/runtime?project=projects/templates/realism-platform/realism-platform.promo
promo#realism-platform(width=1920 height=1080 fps=30)

  scene#platform(duration=13 transition=none)
    renderer(tone_mapping=None exposure=1 shadow_map=true shadow_map_type=pcf-soft)
    // Four beats (bench-local in brackets: bx along the bench, bz toward its front):
    //   0–2.4 s   backlit macro along the seat toward the sun end, 560 high [bx −640, bz 170], a slow drift;
    //             gloves soft in front, the cup sharp, the hall end blown into bokeh. fov 30, focus ≈ 540
    //   2.4–4.0   rise over the phone, 330 mm off its glass from the bench's front; hold to 6.6
    //             (the platform turns 7 → 4 at 4.8, "Boarding" at 5.4)
    //   6.6–9.6   pull out to the wide from the front-right [bx 900, bz 3300], the train and far end behind; hold to 10
    //   10–13     a slow low drift toward the stone, the reflections sliding over it
    // Focus follows the look-at, so the raster DOF stays on the subject.
    camera(dof_pass=three type=perspective fov=30 near=10 far=90000 position="714 560 445" look_at="141 505 226" dof_range=110 dof_blur=9)
      properties
        frame(smooth=0.3)
          keyframes
            kf(time=0 position="714 560 445" look_at="141 505 226" fov=30 dof_range=110 dof_blur=9)
            kf(time=2.4 position="700 575 375" look_at="141 505 226" fov=30 dof_range=110 dof_blur=9 easing=easeInOutSine)
            kf(time=4.0 position="-18 790 -216" look_at="-78 456 -106" fov=30 dof_range=160 dof_blur=6 easing=easeInOutCubic)
            kf(time=6.6 position="-13 788 -216" look_at="-78 456 -106" fov=30 dof_range=160 dof_blur=6 easing=easeInOutSine)
            kf(time=9.6 position="1697 1500 -2970" look_at="0 480 0" fov=34 dof_range=700 dof_blur=13 easing=easeInOutCubic)
            kf(time=10 position="1697 1500 -2970" look_at="0 480 0" fov=34 dof_range=700 dof_blur=13)
            kf(time=13 position="990 1200 -2700" look_at="71 380 71" fov=34 dof_range=700 dof_blur=13 easing=easeInOutSine)
    postprocessing
      step(name=render)
      step(name=unreal_bloom