Spassherz Poppenhausen

EUDRES international boot camp community hub and interactive village map

JavaScript (ES6+)JavaScript (ES6+)Three.jsThree.jsHTML5 CanvasHTML5 CanvasCSS3 GridCSS3 GridDesign ThinkingDesign Thinking
Program
EUDRES International Camp
Core Tech
Vanilla JS & Three.js 3D
Deployment
Live on Vercel

Project overview

Spassherz Poppenhausen was developed during an international European University (EUDRES) Boot Camp hosted with Fulda University of Applied Sciences. Our student team worked with the municipality of Poppenhausen am Wasserkuppe (Germany) to reimagine a vacant community building and warehouse quarter into a multigenerational village center.

The web application provides a responsive village portal and an interactive 3D spatial visualizer of the revived building (“Zum Adler”), allowing residents and municipal stakeholders to explore planned community spaces.

Technical architecture and 3D walkthrough

1. Interactive 3D spatial visualizer (Three.js)

The platform integrates a lightweight Three.js viewport where users can orbit the building, inspect floor-by-floor community spaces, and select interactive hotspots:

View JavaScript implementation: Village3DViewer
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

export class Village3DViewer {
  constructor(container) {
    this.scene = new THREE.Scene();
    this.camera = new THREE.PerspectiveCamera(45, container.clientWidth / container.clientHeight, 0.1, 1000);
    this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
    this.raycaster = new THREE.Raycaster();
    this.mouse = new THREE.Vector2();
    this.hotspots = [];

    this.init(container);
  }

  init(container) {
    this.renderer.setSize(container.clientWidth, container.clientHeight);
    this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
    container.appendChild(this.renderer.domElement);

    this.controls = new OrbitControls(this.camera, this.renderer.domElement);
    this.controls.enableDamping = true;
    this.controls.maxPolarAngle = Math.PI / 2 - 0.05; // Prevent camera clipping below floor

    container.addEventListener('pointerdown', (e) => this.onPointerDown(e, container));
  }

  addHotspot(position, label, callback) {
    const geo = new THREE.SphereGeometry(0.3, 16, 16);
    const mat = new THREE.MeshBasicMaterial({ color: 0x10b981 });
    const mesh = new THREE.Mesh(geo, mat);
    mesh.position.copy(position);
    mesh.userData = { label, callback };

    this.scene.add(mesh);
    this.hotspots.push(mesh);
  }

  onPointerDown(event, container) {
    const rect = container.getBoundingClientRect();
    this.mouse.x = ((event.clientX - rect.left) / container.clientWidth) * 2 - 1;
    this.mouse.y = -((event.clientY - rect.top) / container.clientHeight) * 2 + 1;

    this.raycaster.setFromCamera(this.mouse, this.camera);
    const intersects = this.raycaster.intersectObjects(this.hotspots);

    if (intersects.length > 0) {
      const selectedHotspot = intersects[0].object;
      selectedHotspot.userData.callback();
    }
  }
}

2. Lightweight single-page architecture

To guarantee responsive performance over rural 3G/4G mobile networks, the application avoids heavy UI framework bundles. It uses modular ES6 JavaScript, CSS Grid layouts, and hardware-accelerated transitions, loading the initial view in under 40KB of minified assets.

Design thinking methodology

The project followed a structured four-stage design thinking framework:

  • Empathy interviews: Conducted structured in-person interviews with Poppenhausen residents, shop owners, and youth representatives.
  • Problem definition: Identified social isolation and lack of centralized activity coordination as the primary community bottlenecks.
  • Iterative prototyping: Built responsive interface prototypes tested with older residents for high contrast and legible typography.
  • Municipal pitch: Presented the working web platform, 3D model, and physical revival concept to Poppenhausen municipal council members.