Showcase: Mein C++/WebAssembly Pointcloud-Viewer

von Stephan Manthe, 21.08.2025

In diesem Beitrag zeige ich die Entwicklung und Funktionsweise meines selbst entwickelten 3D-Viewers. Er mag auf den ersten Blick einfach erscheinen, doch seine Besonderheit liegt unter der Haube: Der Code läuft nativ auf dem PC und gleichzeitig direkt im Webbrowser.

Technische Highlights: C++ trifft WebAssembly

Der entscheidende Vorteil dieses Projekts ist die hohe Wiederverwendbarkeit des Quellcodes. Ein Großteil der Logik ist in modernem C++20 geschrieben und als Buildsystem wird CMake verwendet. Es kompiliert entweder mit GCC für eine native Anwendung oder Emscripten für eine Webanwendung. In dem Fall, dass Emscripten verwendet wird, wird der C++ Code ohne nennenswerte Änderungen nach Webassembly kompiliert. Diese Portierung war mit geringem Zusatzaufwand möglich und demonstriert die Effizienz der WebAssembly-Technologie für komplexe, rechenintensive Anwendungen.

Rendering-Engine und Abstraktion

Um die 3D-Szene effizient zu rendern, greife ich auf die 3D-Engine Magnum zurück. Magnum spielt hier eine Schlüsselrolle, da es zwischen der nativen OpenGL-Umgebung und der Web-basierten WebGL-Schnittstelle abstrahiert. Dies ermöglichte die reibungslose Portierung der gesamten Rendering-Pipeline von der C++-Anwendung ins Web.

In der hier gezeigten Demo ermöglicht der Viewer die Betrachtung einer Punktwolke. Diese Punktwolke habe ich zuvor mit meinem eigenen Fotogrammetrie-Tool aus einer Serie von Drohnenbildern rekonstruiert. Jeder einzelne Punkt wird als ein kleiner Kreis, der anhand seiner Normale ausgerichtet ist, gerendert. Zusätzlich wird im Ursprung der Szene ein Koordinatensystem und eine Ebene als Drahtgitter für eine bessere räumliche Orientierung gerendert.

Anwendung und Steuerung

Die Steuerung des 3D-Viewers ist intuitiv und orientiert sich an der bekannten Ego-Shooter-Steuerung:

Initialization...
Interaktiver 3D-Viewer.