Build Threejs Scroll Worlds
Meng ToCommunityCreated by Meng To
- Skill
- Workflow
- Software development
- MIT
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to creating real-time 3D experiences where native document scroll acts as the deterministic conductor for a persistent Three.js world. It emphasizes maintaining spatial continuity while evolving camera composition, lighting, atmosphere, and interactions across defined story beats. The workflow focuses on data-driven scene management, using a central ledger to coordinate state changes rather than scattering logic throughout the render loop.
What it does
- Maps native scroll position to a fractional chapter value for deterministic state control.
- Defines a persistent WebGL scene architecture with separate layers for environment, architecture, and interactives.
- Provides a ledger-based system to manage camera, lighting, and material states per chapter.
- Establishes a workflow for progressive asset loading and performance budgeting.
- Integrates semantic DOM content with 3D spatial narratives.
- Includes a QA framework for verifying transitions, responsive composition, and interaction stability.
When to use it
- When building 3D scrollytelling or scroll-driven WebGL worlds.
- When creating interactive portfolios or product stories that require a continuous 3D space.
- When objects must remain interactive and spatially consistent while the camera moves through multiple compositions.
- When a project requires a deterministic, reversible scroll-controlled journey.
Advantages
- Ensures spatial continuity by keeping the renderer and scene graph alive.
- Decouples story state from scroll events using a centralized conductor.
- Provides a clear structure for managing complex 3D scenes through data ledgers.
- Supports responsive design by allowing chapter-specific camera and layout overrides.
- Facilitates consistent performance through defined asset and draw call budgets.
Usage examples
- “I need to build a 3D product showcase where the user scrolls through different parts of a machine. How do I keep the camera movement smooth?”
- The agent will guide you to define a chapter ledger with camera endpoints and use a scroll-conductor to interpolate between them, ensuring smooth, deterministic movement.
- “How should I structure my Three.js scene for a multi-chapter scrollytelling site?”
- The agent will provide a scene architecture template, including a worldRoot for persistent objects and chapterSets for localized props, ensuring efficient culling and loading.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/mengto/build-threejs-scroll-worlds/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip build-threejs-scroll-worlds.zip -d .agents/skills
Documentation by Meng To
Build Three.js Scroll Worlds
Build one detailed real-time world and use native document scroll as its deterministic conductor. Keep the renderer, scene graph, and spatial continuity alive while camera composition, light, fog, animation, copy, and interaction focus move through authored chapters.
The mechanism is one persistent Three.js world + one normalized reversible scroll state. If removing either makes the experience collapse into stacked sections, this skill applies.
The exact Kage demo proves the quality bar; it is staging, not a mandatory subject or layout. Use its detailed anatomy only when the requested direction benefits from it: references/kage-anatomy.md.
Route the request correctly
Use
threejsfor a single interactive scene with no scroll-authored journey.Use
scroll-world-storytellingwhen deciding between real-time 3D, pre-rendered video, and DOM-first storytelling.Use
scroll-scrubbed-visual-sequencefor a video or image sequence whose time is scrubbed by scroll.Use
cinematic-scroll-storytellingfor DOM-first GSAP/Lenis choreography.Use this skill when objects must remain truly spatial and interactive while scroll moves through several compositions in one live WebGL world.
Do not disguise a video as Three.js. The public oso95/scroll-world project, reviewed at commit 71cc36d, is a strong reference for intake, scene ledgers, budget gates, mobile-specific composition, config-driven playback, and seam QA, but its renderer is a pre-generated video chain. This skill adopts those structural strengths while retaining real geometry, materials, lighting, raycasting, and camera control.
Read the build references
Before implementing a new world, read:
references/world-bible.md for intake, art direction, scene, material, texture, and interaction ledgers;
references/realtime-architecture.md for the scene graph, conductor, camera, loading, interaction, and lifecycle patterns;
references/quality-and-qa.md before optimization and final verification.
Copy references/scroll-conductor.js when a project needs a portable native-scroll conductor rather than a framework-specific implementation.
Start with the output, not the template
Determine what the world is for: a landing page, portfolio, museum chapter, product explanation, game teaser, editorial essay, data story, or another spatial experience. Do not force every request into a hero-plus-CTA layout.
Discover only what is unknown:
the subject, audience, and ordered story beats;
the art direction and emotional arc;
whether the world is continuous, portal-connected, or composed as adjacent sets;
the target devices and minimum acceptable hardware;
how interactive the world should be beyond scrolling;
available models, textures, brand assets, audio, and copy;
the initial-load and total-download budget.
If the user supplied an approved reference or working scene, inspect it first and carry its real geometry, materials, textures, light ratios, camera values, and motion constants into the ledger. Do not replace measured details with adjectives.
Write the world bible before code
Define one reusable visual grammar:
scale system and unit convention;
silhouette language and level of stylization;
palette and per-chapter accent progression;
material families and wear logic;
key, fill, rim, practical, and emissive light roles;
fog, haze, particles, weather, and post-processing;
typography, DOM composition, and near-plane foreground rules;
motion grammar for camera, ambient objects, and interactions.
Every visible detail must support the same world. Random noise, unrelated texture packs, arbitrary particle effects, and one-off materials create complexity without cohesion.
Author a scene ledger
Use 4–8 chapters for most experiences. Store the full contract as data rather than scattering thresholds through CSS and the render loop:
const chapters = [
{
id: "threshold",
scrollWeight: 1.25,
copy: {
eyebrow: "Chapter 01",
title: "Enter the archive",
body: "A spatial collection revealed through motion."
},
camera: {
position: [0, 3.8, 13.5],
target: [0, 2.4, -8],
fov: 38,
mobile: { position: [0, 4.8, 18], fov: 46 }
},
world: {
key: 1.0,
practicals: 0.35,
fog: 0.018,
particles: 0.25,
grade: "cold"
},
focus: ["gate", "lantern-left"],
interactions: ["inspect-gate"],
assets: ["gate-shell", "stone-1k", "mist-atlas"]
}
];For each chapter record the story beat, landmark, camera endpoint, occluders, light/fog state, active animation clips, interaction targets, DOM beat, foreground treatment, asset dependencies, and responsive override. Reject a chapter that differs only by copy.
Build one persistent spatial architecture
Create these systems once:
WebGL canvas
worldRoot
environment sky, terrain, distant silhouettes
architecture persistent landmarks and paths
chapterSets local props grouped for culling and loading
interactives raycast targets and animation state
atmosphere fog volumes, particles, weather
nearPlane3D optional camera-relative depth accents
DOM above canvas
semantic chapters headings, copy, links, media, fallback order
fixed interface progress, chapter navigation, controls
fixed cut-outs optional alpha foregrounds at viewport edgesUse one renderer and normally one scene. Use layers or render passes when transparency, post-processing, or interaction isolation requires them. Do not instantiate one renderer per chapter or rebuild the world at seams.
Choose a topology deliberately:
Continuous geography: landmarks share one navigable space; strongest presence, highest world-building cost.
Connected sets: rooms or islands are joined by tunnels, gates, fog banks, terrain folds, or darkness; easiest to art-direct and stream.
Layered reveal: the same place changes through time, scale, or state; animate materials, visibility, and light instead of moving to unrelated coordinates.
Hide unavoidable discontinuities behind occlusion, darkness, dense atmosphere, an interior threshold, or a close foreground pass. Never let an object visibly teleport in open space.
Give the world real detail
Geometry
Establish the large silhouette first, then medium forms, then small accents. A dense scatter of tiny props cannot rescue a weak silhouette.
Give architectural edges believable thickness, bevels, joints, caps, reveals, and contact points. Paper-thin roofs and floating props expose the fake immediately.
Use modular kits, instancing, merged static meshes, and LODs instead of duplicating unique geometry.
Break repetition with authored clusters, scale/rotation ranges, decals, and material variation—not unbounded randomness.
Keep collision and raycast proxies simpler than render meshes.
Materials and textures
Use a coherent PBR surface stack where it improves the image:
| map | role | common failure |
|---|---|---|
| base color | material identity and broad variation | baked highlights fight live lighting |
| normal | small directional relief | strength too high makes rubber or foil |
| roughness | controls highlight breakup and age | flat values make every object plastic |
| AO | contact and crevice grounding | multiplied too heavily makes dirty seams |
| metalness | separates conductors from dielectrics | gray values everywhere create implausible mud |
| emissive | practical lights, screens, runes | replaces light but does not illuminate nearby forms |
| alpha/transmission | foliage, cloth, glass, mist | sorting, overdraw, and depth artifacts |
Set color textures to sRGB and keep normal, roughness, AO, metalness, and data textures linear.
Keep texel density consistent within a camera range. Reserve 2K–4K maps for surfaces that genuinely fill the frame; use 512–1K atlases for most props.
Prefer KTX2/Basis compression, Meshopt/Draco geometry compression, atlases, trim sheets, decals, and baked AO/light where appropriate.
Add anisotropy only to shallow-angle surfaces that need it. Setting every texture to the maximum wastes bandwidth.
Make wear causal: exposed edges polish, recesses collect grime, water leaves vertical or pooling traces, and paths compress vegetation. Uniform grunge reads as a filter.
For foliage, use alpha-tested cards or instanced low-poly clusters before transparent blended planes. Transparency overdraw is often more expensive than geometry.
Lighting and atmosphere
Start with one authored key direction, a restrained environment/fill, and practical emissive sources. Add lights only when they create a visible relationship.
Bake static bounce and contact where possible. Keep shadow-casting dynamic lights to roughly 1–2 on mobile and 2–4 on desktop unless profiling proves more.
Use fog and haze to separate depth planes, not merely darken the scene. Keep the focal landmark inside the contrast window.
Match emissive geometry, glow sprites, actual light intensity, and bloom threshold so lamps feel luminous without bleaching the frame.
Use post-processing after the unprocessed frame is composed. Bloom, vignette, grain, chromatic separation, and depth of field must not hide weak materials or framing.
Record the detailed surface and light plan in the ledgers from references/world-bible.md.
Map native scroll to deterministic state
Measure stable section anchors only after fonts and critical media settle. Convert scrollY into a fractional chapter value such as 2.35.
Keep separate values:
rig.target = progressFromScroll(scrollY); // exact reproducible story state
rig.smooth = reduceMotion
? rig.target
: damp(rig.smooth, rig.target, 5.2, dt); // cinematic render stateUse exact progress for navigation, URLs, accessibility, foreground ownership, and interaction gating. Use smoothed progress for camera and visual interpolation only. The same scroll position must recreate the same state forward, backward, after a fast jump, and after reload.
Use references/scroll-conductor.js as the baseline implementation. Keep native scroll as the source of truth; never integrate wheel delta into story position.
Author the camera as cinematography
Compose every chapter endpoint at desktop and mobile before interpolating.
Store position, target, FOV, optional roll, lens shift, and responsive overrides.
Use Catmull–Rom curves for broad continuous travel and segment interpolation for deliberate turns.
Inspect the curve for wall penetration, ground clipping, target flips, speed spikes, and accidental close passes.
Parameterize by chapter progress, not raw curve arc length, so story pacing remains intentional.
Use
scrollWeightto give important views more dwell; do not distort the camera path just to slow a section.Add restrained pointer parallax only after the base composition works. Clamp it and blend it out near precise transitions.
On tall viewports, author a pullback/FOV override instead of accepting an arbitrary center crop.
Camera motion must expose new spatial relationships: approach, reveal, passage, scale change, inspection, horizon, departure. Six dolly-ins aimed at the same center are not six scenes.
Interpolate world state from the same conductor
Resolve the adjacent chapters once per frame and interpolate their declared values:
const { a, b, t } = segmentState(rig.smooth);
moon.scale.setScalar(lerp(a.world.moon, b.world.moon, t));
key.intensity = lerp(a.world.key, b.world.key, t);
scene.fog.density = lerp(a.world.fog, b.world.fog, t);Prefer continuous physical change: occlusion, material blend, animation mixer weight, light, fog, scale, and transform. When swapping assets, crossfade only within an occluded or atmospherically dense interval and keep both states loaded until the transition completes.
Add interactions without fighting scroll
Scroll owns macro movement. Pointer, touch, and keyboard interactions own local response.
Use raycasting against named proxy meshes, not every decorative triangle.
Define
idle,hover,focused,active, andunavailablestates for each interactive object.Let hover warm light, shift material response, reveal a label, or trigger a short animation; do not move the scroll camera away from its path.
Pause or soften pointer parallax while the user drags a control or activates a hotspot.
Gate interactions by exact chapter visibility and depth; hidden objects must not capture events.
Mirror every essential hotspot with a DOM button or link in document order. Give it a visible focus state and synchronize its state with the 3D object.
On touch, use tap-to-focus then tap-to-activate when accidental activation would be costly. Keep hit targets at least 44 CSS px in the DOM proxy.
Make decorative particle trails and cursor effects optional, camera-relative where appropriate, and disabled for coarse pointers or reduced motion.
Write the interaction matrix before implementation; use the pattern in references/world-bible.md.
Keep the DOM story semantic
Keep headings, body copy, links, controls, and the footer in real HTML above or beside the canvas. The 3D world creates place; the DOM carries meaning and fallback order.
Reveal display headings by word only when it supports the rhythm; preserve the complete accessible label.
Reveal eyebrow, heading, body, media, proof, and CTA as independent beats.
Keep the reading block stable while the camera makes its largest move.
Use optional fixed alpha cut-outs as near-plane scenery, not as a requirement of every design. When used, keep them fully opaque while active and fade/blur them out after ownership changes.
Load progressively
Make the first authored frame complete before loading the entire journey.
Inline or preload the critical shell, camera, first-scene geometry, smallest environment, and fallback poster.
Load the next chapter before it can enter; prefetch one or two chapters ahead.
Decode textures off the main interaction path and reveal a chapter only when its required assets are ready.
Keep a designed poster and semantic DOM visible if WebGL, a model, or a texture fails.
Report meaningful progress by required asset weight or completed groups, not an arbitrary timer.
Do not hide a 40 MB world behind a decorative percentage. Record the load plan in the asset ledger.
Hold a measurable performance budget
Start with these budgets, then profile on the actual target device:
| budget | mobile target | desktop target |
|---|---|---|
| DPR cap | 1.25–1.5 | 1.5–2 |
| visible triangles | 150k–300k | 500k–1.2m |
| draw calls | 50–90 | 90–160 |
| shadowed lights | 1–2 | 2–4 |
| simultaneously blended full-screen layers | 2 | 3 |
| critical initial transfer | 3–6 MB | 5–10 MB |
| steady frame time | ≤16.7 ms ideal, ≤25 ms fallback | ≤16.7 ms |
These are starting envelopes, not success claims. Measure CPU, GPU, texture memory, shader compilation, long tasks, and first-interactive frame.
Cap
dtnear1/30second after stalls.Pause on
document.hiddenand when the experience is not visible.Use a quality governor that lowers DPR and optional effects before deleting authored landmarks.
Render secondary cameras, reflections, cloth simulations, and expensive particles only while relevant.
Dispose geometries, materials, textures, render targets, observers, events, animation mixers, and RAF during teardown.
Respect motion, access, and failure
Preserve native reversible scroll; do not trap the wheel or force a custom scrollbar.
For reduced motion, snap camera/state to the nearest composed chapter, stop ambient loops and stagger/blur, and retain the complete ordered DOM story.
Keep a real heading hierarchy, landmarks, links, form controls, visible focus, and reachable footer.
Provide a composed poster or chapter stills when WebGL is unavailable.
Maintain contrast when the world changes behind copy; use authored scrims or local contrast management, not an opaque blanket over the whole scene.
Verify the whole journey
Follow references/quality-and-qa.md. At minimum verify:
every camera endpoint at 1440×900, 768×1024, and 390×844;
slow, fast, reverse, scrollbar-drag, anchor navigation, reload-at-depth, and resize between chapters;
material scale, UVs, texture color space, roughness response, contact grounding, shadow stability, fog depth, and post-processing;
hover, focus, tap, activation, chapter gating, and interaction recovery after scrolling away and back;
first-load poster, progressive chapter loading, failed asset, context loss, hidden-tab resume, and teardown;
reduced motion, WebGL fallback, keyboard order, readable DOM, reachable footer, and a clean console;
target-device frame time, draw calls, triangles, texture memory, transfer size, and shader compilation.
Use the Codex browser for visual and interaction verification. Build/DOM checks are not visual proof.
Deliver
Return:
the world bible and art-direction constants;
chapter, camera, material/texture, interaction, asset, and performance ledgers;
a layer and scene-graph map;
the working experience and local runtime assets;
desktop, tablet, and mobile evidence from representative chapters;
measured performance and loading results;
fallback/reduced-motion evidence;
remaining visual, interaction, or device gaps stated plainly.
Keep the bundled Kage demo unchanged unless the user explicitly asks to revise the reference itself.
Files
- ATTRIBUTION.mdAdded by AutoGineer876 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md18.2 KiB
- agents/openai.yaml294 B
- demo/PROMPT.md4.1 KiB
- demo/index.html233.1 KiB
- demo/preview.jpg141.0 KiB
- demo/secret-pathways-assets/fonts.css97.0 KiB
- demo/secret-pathways-assets/foreground/png/basalt-stones.webp163.9 KiB
- demo/secret-pathways-assets/foreground/png/garden-bush.webp279.7 KiB
- demo/secret-pathways-assets/foreground/png/hill.webp82.2 KiB
- demo/secret-pathways-assets/foreground/png/maple-leaves.webp174.0 KiB
- demo/secret-pathways-assets/foreground/png/pine-tree.webp191.3 KiB
- demo/secret-pathways-assets/foreground/png/sakura-branch.webp246.6 KiB
- demo/secret-pathways-assets/foreground/png/shrine-ruins.webp142.4 KiB
- demo/secret-pathways-assets/foreground/png/stone-lantern.webp146.6 KiB
- demo/secret-pathways-assets/foreground/png/tall-grass.webp343.4 KiB
- demo/secret-pathways-assets/foreground/png/temple-wall.webp84.4 KiB
- demo/secret-pathways-assets/generated/kage-approach.webp175.8 KiB
- demo/secret-pathways-assets/generated/kage-lantern-court.webp193.3 KiB
- demo/secret-pathways-assets/generated/kage-moonwater.webp99.8 KiB
- demo/secret-pathways-assets/generated/kage-sanmon-preview.webp182.0 KiB
- demo/secret-pathways-assets/three.min.jsScript593.8 KiB
- references/kage-anatomy.md7.6 KiB
- references/quality-and-qa.md11.1 KiB
- references/realtime-architecture.md15.4 KiB
- references/scroll-conductor.jsScript7.5 KiB
- references/world-bible.md12.4 KiB
references/quality-and-qa.md
Visual, interaction, and runtime QA
Use this reference after the graybox route works and again before delivery. A build, lint pass, or DOM inspection does not prove a live Three.js journey.
Contents
Evidence matrix
Endpoint composition
Transition paths
Geometry and scale
Materials and textures
Lighting and atmosphere
Interactions
DOM and accessibility
Loading and failure
Performance
Responsive behavior
Release evidence
1. Evidence matrix
Create one row per chapter and viewport:
| chapter | 1440×900 | 768×1024 | 390×844 | reverse seam | interaction | fallback | performance |
|---|---|---|---|---|---|---|---|
| threshold | screenshot | screenshot | screenshot | pass/fail | pass/fail | pass/fail | ms/calls/triangles |
Capture representative evidence from the live renderer, not a design mockup. Mark untested devices or paths as unknown.
2. Endpoint composition
At every authored camera endpoint verify:
the landmark is readable before the copy explains it;
foreground, midground, and background form distinct depth planes;
the eye has one dominant focus and one or two supporting details;
the camera is not inside geometry and the near plane does not slice important forms;
the horizon and verticals match the intended lens character;
copy occupies a deliberate negative-space zone;
navigation, rail, captions, and interactions avoid focal geometry;
mobile shows the same story beat through an authored composition, not a random crop;
the fallback poster matches the live frame closely enough to avoid a visual jump.
Toggle DOM copy off during review. If the 3D frame becomes meaningless, the world is not carrying its share of the story.
3. Transition paths
Exercise every segment:
slow forward scroll;
slow reverse scroll;
fast trackpad or touch flick across two or more chapters;
scrollbar drag to a non-adjacent chapter;
click each chapter anchor in both directions;
reload at the middle of a segment;
browser history restoration;
resize and rotate while between endpoints;
leave the tab hidden for at least ten seconds, then return;
scroll away while a local interaction is active, then return.
Look for:
chapter labels lagging behind because they read damped progress;
objects popping or unloading too early on reverse scroll;
camera acceleration spikes at curve joins;
target flips or unwanted roll;
light, fog, material, and animation state landing on different endpoints by direction;
foreground stages stranded in the fixed host;
shader compilation or texture upload stalls at first reveal;
interactions remaining active after their object becomes unavailable.
4. Geometry and scale
Review at silhouette, structural, and accent levels.
Silhouette
Compare each chapter as a thumbnail and in grayscale.
Confirm adjacent landmarks have distinct outer contours and camera relationships.
Remove small props temporarily; the chapter should remain identifiable.
Structure
Check roof, wall, floor, trim, rails, doors, and props for thickness and contact.
Check repeated modules for visible seams, gaps, inconsistent scale, or floating origin points.
Verify bevel width against object size and closest camera distance.
Inspect normals, hard/soft edges, tangent artifacts, mirrored UV seams, and negative scales.
World scale
Place a human-scale debug mannequin at each chapter.
Confirm camera height, door dimensions, stairs, furniture, vegetation, and atmospheric falloff belong to one unit system.
Test the fog and light ranges after scale changes; both reveal inconsistent units quickly.
5. Materials and textures
Run a neutral material-debug pass before judging the final grade.
Color space
Base color and emissive color maps display in sRGB.
Normal, roughness, AO, metalness, masks, and lookup data remain linear.
Environment maps use the correct HDR workflow and PMREM.
Tone mapping and exposure do not clip the practical lights or crush surface variation.
UV and density
Compare a checker texture across hero surfaces and nearby props.
Check texture scale at the closest camera endpoint.
Confirm AO maps have valid
uv2data.Inspect atlas padding and mip bleed at oblique angles.
Confirm anisotropy is used on floors, roads, or labels that need it rather than globally.
Physical response
Rotate or move a neutral test light to inspect roughness and normal response.
Metals have metalness near
1; stone, wood, cloth, paint, and skin remain dielectric near0unless the shader has a deliberate layered model.Roughness variation follows construction, wear, moisture, or touch—not uniform noise.
Contact zones have enough AO or baked grounding without black outlines.
Emissive materials look luminous before bloom and coordinate with actual light or baked spill.
Glass and transparent surfaces maintain stable sorting and do not erase objects behind them.
Compression
Compare source and shipped compressed textures on the target device.
Check normal-map block artifacts, alpha fringes, color banding, and roughness posterization.
Record shipped and decoded texture cost.
6. Lighting and atmosphere
Toggle these systems one at a time:
environment/fill;
direct key;
practical lights;
shadow maps;
fog/haze;
bloom and post-processing;
particles/weather;
final color grade and grain.
Each must have a named job. Delete an effect that changes the frame but does not improve depth, focus, material readability, or story.
Check:
shadow acne, peter-panning, crawling, clipped casters, and oversized frustums;
practical lamps whose glow does not match the fixture or nearby surfaces;
fog that turns distant dark objects into a pale wall because their material/fog relationship is wrong;
particles that become a flat screen overlay with no depth scale or occlusion;
bloom that raises the entire frame instead of isolating emissive highlights;
grade or vignette that sacrifices readable detail for mood;
temporal shimmer from post passes during scroll and resize.
7. Interactions
For every row in the interaction matrix verify:
proxy bounds match the visible object at every relevant camera position;
hover begins and ends predictably at edges;
keyboard focus invokes the same 3D response as pointer hover;
touch has an intentional focus/activation pattern;
the cursor and object both provide feedback;
the interaction is disabled outside its exact chapter range;
a hidden or occluded proxy cannot steal a hit;
opening a detail does not hijack scroll or strand the camera;
scrolling away closes, retires, or preserves the state according to the ledger;
returning restores a valid idle or saved state;
reduced motion removes unnecessary movement but preserves meaning and activation;
coarse-pointer layouts expose the DOM proxy at a reachable size.
Test pointer raycasting while the camera is still damping after a fast scroll. The hit proxy must use the camera's rendered pose, while availability uses exact chapter state.
8. DOM and accessibility
Keep one logical heading hierarchy in document order.
Ensure every chapter remains understandable when the canvas is hidden.
Preserve full accessible headings when visual words are split.
Mark decorative canvas and alpha foregrounds appropriately; provide text equivalents for meaningful 3D content.
Make chapter navigation and interactions real links/buttons with visible focus.
Use
aria-currentfor the active chapter and accurate expanded/pressed states for controls.Keep the footer reachable without scroll trapping.
Verify contrast at every chapter, not only the hero.
Verify zoom at 200% and text reflow where applicable.
Under reduced motion, snap to designed chapter frames, stop ambient loops, remove blur/stagger, and keep controls functional.
9. Loading and failure
Test under a cold cache and throttled network:
critical first frame appears within the stated budget;
semantic content and poster appear before optional 3D;
progress represents real required groups;
next-chapter prefetch completes before entry at ordinary scroll speed;
fast-skip to an unloaded chapter shows a composed fallback and resolves without a blank flash;
a 404 model or texture produces a recoverable chapter, not an endless loader;
shader compilation is warmed before visible reveal;
WebGL creation failure keeps the entire story usable;
context loss pauses cleanly and offers a fallback/restoration path;
history reload at depth restores exact chapter state after assets settle;
failed optional effects do not block the world.
Use a loopback HTTP server for local testing; do not rely on file:// behavior.
10. Performance
Measure after the initial shader warm-up and during the heaviest chapter transition.
Record:
median and 95th-percentile frame time;
CPU scripting vs GPU/render cost where the profiler exposes it;
renderer draw calls, triangles, lines, points, textures, and programs;
JS heap trend across a full forward/reverse journey;
GPU texture/render-target estimate;
critical and total transfer;
long tasks during load and chapter entry;
shader compile and texture upload stalls;
battery/thermal behavior on a real mobile device when possible.
Profile toggles in this order to identify the real bottleneck:
lower DPR;
disable post-processing;
disable shadows or freeze their updates;
disable transparent atmosphere and particles;
hide chapter-local groups;
swap LODs;
replace complex materials with neutral basic materials.
Interpretation:
DPR win means fill-rate/post/shadow cost dominates.
Basic-material win means shader/material cost dominates.
Group visibility win means geometry/draw-call cost dominates.
Particle/transparent win means overdraw dominates.
No GPU toggle win with high scripting time means update, layout, raycast, or DOM work dominates.
Do not claim optimization from file size alone.
11. Responsive behavior
Test at least:
1440×900 desktop;
768×1024 portrait tablet;
390×844 phone;
one very wide desktop and one short landscape phone when the audience makes them relevant.
Verify:
camera endpoints use responsive authored overrides;
the focal landmark remains visible beside/behind copy;
UI and 3D interaction targets do not collide;
mobile serves its intended quality tier and textures;
orientation changes preserve exact progress and rebuild curves once;
URL-bar height changes do not remeasure the story and jump scroll;
DPR changes between displays resize renderer and post targets safely;
foreground density and particle count reduce without erasing identity;
the page does not create horizontal overflow unless the composition explicitly owns it.
12. Release evidence
Deliver:
one screenshot per representative chapter and viewport;
a short forward/reverse screen recording when transitions are central;
console and failed-request status;
the exact checked commit/runtime version;
performance table and target hardware/browser;
asset/texture transfer and memory estimates;
reduced-motion and WebGL-fallback captures;
a list of unverified devices or remaining visual gaps.
Do not convert missing evidence into a pass.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Meng To
- Publisher
- Meng To (Community)
- Source
- MengTo/Skills · agent-skills/web-design/build-threejs-scroll-worlds · commit 5ea1661
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Meng To or Meng To.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download build-threejs-scroll-worlds.zip