Prompt · December 31, 2025
Toronto Skyline
Build an ultra-detailed, photorealistic 3D real-time simulation of the Toronto city skyline using Three.js.
Objective: Build an ultra-detailed, photorealistic 3D real-time simulation of the Toronto city skyline using Three.js. The primary goal is to achieve visual fidelity and realism, moving beyond simple procedural blocks to a "digital twin" feel, while maintaining 60FPS performance.
Core Visual Philosophy: Avoid a "polygonal" or "CG" look. Focus on PBR (Physically Based Rendering) materials, sophisticated lighting, and high-resolution textures to mimic real-world photographic qualities.
🌃 I. Scene & Model Fidelity
This is the highest priority. The "rough" look comes from generic models.
- 1. Landmark "Hero" Models (High-Poly): These must be high-fidelity, custom models, not procedural.
- CN Tower: Model its specific components: the main pod (with its distinct "tire" shape and window-heavy observation deck), the glass floor section, the upper SkyPod, the "donut" radome, and the full needle.
- Rogers Centre: Model the entire stadium structure, including the retractable roof panels (in a fixed open position) and the concrete superstructure. Include the attached hotel.
- Financial District (The "Postcard" Shot):
- First Canadian Place: Distinctive white marble, modeled with its window indentations.
- Scotia Plaza: Accurate red granite, modeled with its "M" shaped crest and complex setbacks.
- TD Centre: Model all main towers in the complex, capturing their iconic black steel and bronze-tinted glass (Mies van der Rohe style).
- CIBC Square: Model both towers with their signature diamond-patterned glass facade.
- Scotiabank Arena: Model its unique, curved "atrium" entrance and main bowl structure.
- Roy Thomson Hall: Include its iconic sloped glass "tent" structure.
- 2. Hybrid Procedural Skyline (The "Filler"): Do not use simple
BoxGeometrycubes.
- Create a "kit" of 20-30 pre-made, low-to-mid-poly building models with varied footprints, heights, and architectural styles (e.g., modern glass-and-steel, older brick/stone facades).
- Procedurally place these "kit" models to fill out the city blocks, ensuring realistic density and height falloff (tallest near the core, shorter towards the edges).
- Roofs: All buildings (hero and procedural) must have roof-top details: mechanical boxes, HVAC units, antennas, and small "penthouse" structures. This is critical for breaking up flat, "CG" surfaces.
- 3. Terrain & Landscape:
- Toronto Islands: Model as high-quality, textured low-poly terrain. Include distinct textures for beaches, grass, and tree clusters (
InstancedMeshfor trees). - Billy Bishop Airport: Model the runway, terminal, and a few static planes.
- Waterfront: Model the specific piers, HTO Park (with its yellow umbrellas), and the Queen's Quay terminal.
✨ II. Materials & Texturing (Photorealism)
This is the key to "not looking like a rendering."
- PBR Workflow: All materials must be
MeshStandardMaterialorMeshPhysicalMaterial. - Textures: Use high-resolution textures.
- Buildings: Use texture atlases for concrete, brick, metal panels, and especially window-grime/imperfection maps (subtle wear-and-tear) to break up sterile surfaces.
- Glass: Building glass must not be 100% transparent. Use a
MeshPhysicalMaterialwith lowroughness, highreflectivity, and a slight tint. - Roads: Use textured asphalt with
normalandroughnessmaps for the Gardiner/Lakeshore. - Reflections (Crucial):
- Sky & Environment: Use a
CubeCamerato generate a real-time (or semi-real-time) environment map from the scene. This map must be applied as the.envMapto all PBR materials (especially glass and water) to provide realistic reflections of the sky and city. - Lake Ontario: The GLSL shader must reflect the
Skyshader, the sun, and the city lights (using a technique like Screen Space Reflection or by sampling the environment map).
💡 III. Lighting & Atmosphere
- Lighting:
- Sun: A single
DirectionalLightthat simulates the sun. It must cast shadows (usePCFSoftShadowMap). - Sky: Use
three/examples/jsm/objects/Sky.js. This shader dynamically changes the entire sky's appearance (color, turbidity, sun position) based only on the "Time" slider's sun elevation. This is far more realistic than just changing colors. - Ambient: Use a
HemisphereLight(sky-to-ground) for subtle fill light. - Post-Processing (via
EffectComposer): SSAOPass(Screen Space Ambient Occlusion): Essential for adding realistic contact shadows and depth, preventing the "flat" render look.UnrealBloomPass: For emissive lights (cars, CN Tower, windows) at night. Tweakthreshold,strength, andradiusfor a soft, photographic glow, not a laser-light look.ACESFilmicToneMapping: For photorealistic HDR handling.- Night Mode Details:
- CN Tower: The light show must be programmable, using an array of
PointLightorSpotLightobjects (or faked with a texture) that change colors in sequence. - Office Buildings: At night, use an emissive texture map for windows. This map should be a grid of "on" and "off" (or various-colored) windows to simulate random office occupancy, creating a "salt and pepper" light pattern. Do not just make the whole building glow.
🚗 IV. Dynamic Elements
- Traffic (
InstancedMesh): - Models: Use at least 3-4 different instanced car models (sedan, SUV, truck, bus) to break up repetition.
- Lights: Cars must have two
Spriteinstances for headlight flares (using a "starburst" texture) and two for taillights. Add a third set of emissive red lights for brake lights that randomly activate. - TTC Streetcar: Add 1-2 instances of the iconic red TTC streetcar (
InstancedMesh) running on a simple track path along Queen's Quay. - Lake Activity:
- Ferries: Model the specific Toronto Island ferries (e.g., Trillium, Sam McBride).
- Boats:
InstancedMeshfor 2-3 types of sailboats and yachts. - Wakes: All boats/ferries should have a simple particle
Spritesystem or a decal-based wake trailing them on the water's surface.
🛠️ V. Tech & UI
- Core: Single HTML file
toronto_skyline.html. All assets (Three.js, addons, textures) must be loaded via CDN or encoded as Base64. - Optimization:
InstancedMesh: Use aggressively for cars, lights, streetlights, trees, windows (if possible), and birds.THREE.LOD(Level of Detail): Implement this for the "Hero" buildings. When the camera is far away, switch to a low-poly "impostor" model.- Texture Atlases: Combine multiple textures (e.g., different window types, concrete textures) into a single atlas to minimize draw calls.
- UI: Sleek, minimal sliders for:
- Time of Day (0-24h) (This should be the only control for the
Skyshader and sun position) - Fog Density (0-100%)
- Activity Density (0-100%) (Controls car, boat, and bird count)
- Camera Zoom (Dolly zoom, not FOV change)
- Post-Processing (Toggle): A single checkbox to enable/disable SSAO and Bloom for performance comparison.