Keep Pushing
Keep Pushing is a 3D web racing game: you drive down an endless, procedurally generated track, dodging obstacles against the clock. It's built in vanilla JavaScript with Vite, using Three.js for rendering and Cannon-es for physics and collision. It was made by a three-person team.
I owned the 3D environment and the rendering side — the Three.js scene setup (including the Cannon-es physics world and the road collision mesh), the car model, obstacles, keyboard controls, the minimap, and the roadside tree system. My main engineering contribution was rendering performance: because the track never ends, spawning every tree would tank the frame rate, so I pooled the trees in a moving window around the car — spawned ahead, despawned behind — with separate distance windows for the visual mesh and the physics body, and direction-aware culling (using the car's forward vector) so already-passed trees are reclaimed first. Teammates built the vehicle control and the UI/HUD (see my contributions below).
Key features & challenges
- Endless procedurally generated track — dodge obstacles against the clock.
- Object-pooled roadside trees: spawned in a moving window around the car, despawned behind it.
- Separate distance windows for a tree's visual mesh vs. its physics body — collision only where it matters.
- Direction-aware culling reclaims already-passed trees first, keeping the live object set minimal.
My contributions
- Built the 3D scene and environment: Three.js scene setup, sky, ground, and the Cannon-es physics world with the road collision mesh.
- Built the car model, obstacle blocks, keyboard controls, and the minimap.
- Built the roadside tree system and its performance optimization (object pooling + direction-aware culling; separate visual/physics distance windows).
- Co-built the procedural track generation and the game loop.
- Teammates: vehicle control/movement (Yvonne), timer and progress HUD (Louie).