top of page

Create Your First Project

Start adding your projects to your portfolio. Click on "Manage Projects" to get started

3D Singapore Parliament Interactive Explainer

Description

This project is a fully interactive scrollytelling piece that brings the Singapore Parliament chamber to life using Three.js, GLB models, and a custom scroll-driven animation system built in Svelte.

The experience blends 3D space, motion, narrative text, and inline videos with click-to-play / click-to-pause functionality. Readers explore the chamber as the story unfolds, moving through guided camera transitions and visual highlights that explain political dynamics and seating layout.

Date

Sep 2025

Role

Responsible for the story and development, including:
-Writing the story and script
-Scene Engineering in Three.js
-Camera animation system (keyframes, easing, transitions)
-Scroll-driven choreography of 3D and text
-Video components with click-to-play/pause interactions
-Performance optimisations across WebGL + inline videos

Problem statement

Political reporting is often text-heavy, and the spatial layout of Parliament is hard to visualise. We needed an experience that clearly explains the chamber layout, shows where parties and MPs sit and walks the reader through key debate moments.

Key Features

1. Three.js Scene & Camera System

I built a full Three.js pipeline:

-Imported and optimised the GLB model
-Positioned lights, shadow settings, renderer configuration
-Placed multiple virtual camera “stations”
-Created smooth transitions with custom easing curves

Built a keyframe-based timing system to sync with scroll position

2. Scroll-Driven Chapter System

Each section of the article corresponds to a “scene”:

-Introduction – Entering the chamber
-Understanding the layout
-Party-by-party seat breakdown
-Viewing specific debate locations
-Closing zoom-out and context
-Scrolling triggers camera movements, object highlights, and reactive overlays.

3. Inline Video Moments (Click to Play / Pause)

To explain debates and context, I integrated a reusable video component with:

-Tap/click anywhere → toggle play/pause
-Auto-pause when out of viewport
-Custom play button and subtle overlays
-Lazy-loaded videos to reduce initial page weight
-Videos provide editorial depth without overwhelming the WebGL scene.

4. Interactive Highlights

-Seat clusters illuminated based on chapter
-Selective spotlighting to guide viewer attention
-On-hover/tap tooltips for MP groups or sections of the chamber

5. Performance Optimisation

-GLB decimation + texture compression
-Efficient draw calls via material instancing
-Throttled scroll listeners
-Mobile-optimized renderer settings
-Video autoplay disabled to avoid CPU spikes

© 2025 by Zuowei Li.

bottom of page