complex-models
complex-models
SCENES — big environment GLBs (rooms, streets, kits, hero props) loaded as `asset(asset="model:…")` and re-lit / re-skinned with `material_overrides`. Ten scenes, one recipe each; every one is a faithful port or a kit-bash of a CC0 / permissively-licensed model, downloaded into assets/models/ (which is git-ignored — re-fetch with the URLs in each scene's header).
Read the rig's notes
THE RECIPE (every scene):
asset#x(asset="model:<name>" scale=<units→mm>) the GLB, at real size
material_overrides optional re-skin
override
select_mesh(name=… | name_contains=… | has_map=…)
material(ref=basic|standard|physical … map="image:…")
environment(hdr=…) and/or real lights or the GLB is a black cutout
renderer(tone_mapping=… exposure=… shadow_map=…)
UNITS: 1 authored unit = 1 mm. Metre models take scale=1000, Sponza (cm)
scale=10. Point/spot intensity with decay=2 scales × k² (see the hangar);
area / directional / hemisphere intensities do not. Transmission
`thickness` is LOCAL (three multiplies it by the node scale) — leave it in
the model's own units; `attenuation-distance` is world mm.
OVERRIDE SELECTORS ARE BY MESH NAME. That is the one thing to check before
committing to a model: dump the glTF's node names (a 10-line node script
against the JSON chunk). Sponza is ONE mesh with 103 primitives and Bistro
is 2909 meshes all called "subset" — neither can be re-skinned per part;
ABeautifulGame (King_W, Pawn_Body_B3 …), FlightHelmet (GlassPlastic_low …),
Poly Haven (classic_laptop_screen) and Kenney (one mesh per part) can.
EVERY SCENE DEMOS AN APP. The environment is the set; the UI is the subject —
each scene ends with the camera diving onto its app (frame kf node=…), and the
app does something (a chart draws, a cursor clicks a CTA, a status flips).
s01 Bay Ops console on the GLB monitor · s02 product card by the bottle
s03 audio-guide iPhone · s04 café POS in a chrome window
s05 crane-ops holo panel · s06 chess analysis panel
s07 spec card per helmet · s08 Focus app on the laptop lid
s09 launch telemetry + pad laptop · s10 pad-control laptop (night)
SCENE INDEX
s01-hangar Quaternius Modular Sci-Fi Megakit layout (CC0), demo90 rig: 9 clustered
point lights, area roof strip, directional + shadow, screens carry live ui
s02-soda Patrick Ryan's soda bottle (Babylon demo): two-pass glass via a second
asset instance, VSM shadow, HDR skybox
s03-sponza Intel/Crytek Sponza (Khronos glTF-Sample-Assets, metres via a 0.008 root): sun + shadow,
hemisphere fill, fog, dolly through the atrium
s04-bistro Amazon Lumberyard Bistro (Ludicon glTF mirror, CC-BY; AVIF → 8-bit WebP): the GLB's own
camera and sun, a street at dusk
s05-hangar-b a SECOND Megakit layout on the s01 rig — swap `asset=`, keep the lights
s06-chess Khronos ABeautifulGame: named pieces re-skinned (gold king, glass queen)
s07-helmets DamagedHelmet · FlightHelmet · SciFiHelmet: hero props, one override each
s08-tabletop Poly Haven props (CC0) kit-bashed into a desk, laptop screen driven by a
live `ui` stage via map_from
s09-spaceport Kenney Space Kit (CC0) kit-bash, day: flat-shaded parts re-tinted whole
s10-spaceport-n the same layout at night, match-moved — lights and palette swapped
SOURCES
Megakit layouts raw.githubusercontent.com/CedricGuillemet/dump/master/demo90/
Sponza/Chess/Helmets raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/
Bistro media.githubusercontent.com/media/Ludicon/bistro-gltf/main/ (LFS)
Poly Haven api.polyhaven.com/files/<id> → gltf.1k
Kenney kenney.nl/assets/space-kit (zip → Models/GLTF format)
soda bottle patrickryanms.github.io/BabylonJStextures/Demos/sodaBottle/assets/gltf/
NOT HERE: Quaternius's other kits (Corridor / Lab / Spaceship) ship only as a
Google-Drive zip and Sketchfab downloads need a login — neither is fetchable
headlessly, so they stay on the shopping list.
KNOWN BROKEN — s04-bistro. The Ludicon glTF mirror is damaged: 32 accessors
carry float-sentinel min/max, ~500 vertices are NaN/1e38 (they poison every
bounding sphere → frustum-culled), one 116 m primitive is mislocated, and the
textures are 10-bit AVIF that headless Chromium refuses. This repo's copy has
been patched (textures → 8-bit WebP, EXT_texture_webp; bad prims dropped; bad
verts zeroed; accessor bounds recomputed → bistro.gltf + bistro.bin) and the
runtime now loads it with no failures — but it still renders NOTHING at any
camera we tried, and the in-page bounds probe OOMs the headless tab. The scene
is kept as the authored port; swap the asset for a clean Bistro export (the
NVIDIA ORCA original, converted with gltf-transform) and it should light up
as-is. Until then this scene is a sky gradient. The 444 MB tree stays on
disk for local playback and is dockerignored (not baked into the image).
Preview: /packages/runtime/index.html?project=promos/primitives/scenes/scenes.promo- Topic
- scenes
- Scenes
- 10
- Kind
- reference rig
//
SCENES — big environment GLBs (rooms, streets, kits, hero props) loaded as
`asset(asset="model:…")` and re-lit / re-skinned with `material_overrides`.
Ten scenes, one recipe each; every one is a faithful port or a kit-bash of
a CC0 / permissively-licensed model, downloaded into assets/models/ (which
is git-ignored — re-fetch with the URLs in each scene's header).
THE RECIPE (every scene):
asset#x(asset="model:<name>" scale=<units→mm>) the GLB, at real size
material_overrides optional re-skin
override
select_mesh(name=… | name_contains=… | has_map=…)
material(ref=basic|standard|physical … map="image:…")
environment(hdr=…) and/or real lights or the GLB is a black cutout
renderer(tone_mapping=… exposure=… shadow_map=…)
UNITS: 1 authored unit = 1 mm. Metre models take scale=1000, Sponza (cm)
scale=10. Point/spot intensity with decay=2 scales × k² (see the hangar);
area / directional / hemisphere intensities do not. Transmission
`thickness` is LOCAL (three multiplies it by the node scale) — leave it in
the model's own units; `attenuation-distance` is world mm.
OVERRIDE SELECTORS ARE BY MESH NAME. That is the one thing to check before
committing to a model: dump the glTF's node names (a 10-line node script
against the JSON chunk). Sponza is ONE mesh with 103 primitives and Bistro
is 2909 meshes all called "subset" — neither can be re-skinned per part;
ABeautifulGame (King_W, Pawn_Body_B3 …), FlightHelmet (GlassPlastic_low …),
Poly Haven (classic_laptop_screen) and Kenney (one mesh per part) can.
EVERY SCENE DEMOS AN APP. The environment is the set; the UI is the subject —
each scene ends with the camera diving onto its app (frame kf node=…), and the
app does something (a chart draws, a cursor clicks a CTA, a status flips).
s01 Bay Ops console on the GLB monitor · s02 product card by the bottle
s03 audio-guide iPhone · s04 café POS in a chrome window
s05 crane-ops holo panel · s06 chess analysis panel
s07 spec card per helmet · s08 Focus app on the laptop lid
s09 launch telemetry + pad laptop · s10 pad-control laptop (night)
SCENE INDEX
s01-hangar Quaternius Modular Sci-Fi Megakit layout (CC0), demo90 rig: 9 clustered
point lights, area roof strip, directional + shadow, screens carry live ui
s02-soda Patrick Ryan's soda bottle (Babylon demo): two-pass glass via a second
asset instance, VSM shadow, HDR skybox
s03-sponza Intel/Crytek Sponza (Khronos glTF-Sample-Assets, metres via a 0.008 root): sun + shadow,
hemisphere fill, fog, dolly through the atrium
s04-bistro Amazon Lumberyard Bistro (Ludicon glTF mirror, CC-BY; AVIF → 8-bit WebP): the GLB's own
camera and sun, a street at dusk
s05-hangar-b a SECOND Megakit layout on the s01 rig — swap `asset=`, keep the lights
s06-chess Khronos ABeautifulGame: named pieces re-skinned (gold king, glass queen)
s07-helmets DamagedHelmet · FlightHelmet · SciFiHelmet: hero props, one override each
s08-tabletop Poly Haven props (CC0) kit-bashed into a desk, laptop screen driven by a
live `ui` stage via map_from
s09-spaceport Kenney Space Kit (CC0) kit-bash, day: flat-shaded parts re-tinted whole
s10-spaceport-n the same layout at night, match-moved — lights and palette swapped
SOURCES
Megakit layouts raw.githubusercontent.com/CedricGuillemet/dump/master/demo90/
Sponza/Chess/Helmets raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/
Bistro media.githubusercontent.com/media/Ludicon/bistro-gltf/main/ (LFS)
Poly Haven api.polyhaven.com/files/<i