LiveIn developmentLast commit Sep 2026
Campus Navigate 3D
An interactive 3D map of a university campus with guided tours.
Case study · The brief
A campus is hard to picture from a flat map. The job: a web app where anyone can fly over the real campus in 3D — follow a guided tour of key places with the details alongside, or fly freely — while every tour and the model itself stay editable from an admin panel.
What I built
- React and Three.js frontend with animated camera routes, bounded free-camera controls and location panels.
- Optimised for a large 3D model: Draco-compressed glTF and a loading screen with real progress.
- Django REST API with an admin panel for locations, flight paths and 3D models.
- My role
- Fullstack developer: frontend and backend
- Team
- The 3D model of the campus by Maksym Sydorenko, 3D modeler.
- Stack
- React
- Three.js
- Vite
- Django
- DRF
- PostgreSQL
- Docker
How it fits together
Drawn from the public repositories. The outline shows who built each part — credit is part of the fact.
- 3D mapReact · Three.js — Built by me
- Campus model.glb · Draco — Built by a teammate
- REST APIDjango · DRF — Built by me
- Admin panelDjango admin — Built by me
- DatabasePostgreSQL — Built by me
The same, step by step
- 3D map (React · Three.js) with REST API (Django · DRF), both wayslocations · active model
- Campus model (.glb · Draco) to Admin panel (Django admin)versioned upload
- REST API (Django · DRF) to Database (PostgreSQL)flight paths
- Admin panel (Django admin) to Database (PostgreSQL)edit points and models
Key decisions
The calls that shaped the system, and why they were made.
- D1
Tours are data, not code
Each location stores how the camera behaves there: a still frame, a flight through ordered points, or a panorama around it — with speed, view direction and pitch. A new tour stop is a form in the Django admin, not a release.
- D2
Every flight starts where you are
Before a tour begins, the camera eases from its current position and direction to the first point over two seconds. Switching locations mid-flight never jumps, so people keep their bearings.
- D3
The model is versioned content
The campus model is an uploaded .glb with a version; marking one active retires the rest. The frontend asks the API for the active model, so a better model ships without touching the frontend.
- D4
Heavy model, honest progress
The model travels as Draco-compressed glTF and is decoded in the browser; the loading screen shows the real percentage instead of a spinner. Free flight is bounded to the model, so nobody gets lost in empty space.
Outcome
- Live at campus.zebaro.dev: tours grouped as Main, Important places and Rooms, plus free flight.
- Locations, flight points and model versions are edited in the Django admin; the map picks them up on the next load.
- Frontend and backend run in Docker, each in its own public repository.