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
//
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