Showcase: Mein C++/WebAssembly Pointcloud-Viewer
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:
- Horizontale Bewegung: Tasten „W“, „A“, „S“, „D“.
- Sichtausrichtung: Bewegung der Maus bei gedrückter linker Maustaste.