Spassherz Poppenhausen
EUDRES international boot camp community hub and interactive village map
// Project Documentation & Site Photos
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.


