Draco & Three.js: 3D-Modelle auf ein Fünftel der Größe schrumpfen
Was ist Draco?
Draco ist eine Open-Source-Bibliothek von Google zur Komprimierung von 3D-Geometrien und Punktwolken. Das Ziel ist simpel: 3D-Modelle sollen im Web schneller laden, ohne dass die visuelle Qualität leidet.
Ein unkomprimiertes .glb-Modell kann leicht mehrere Megabyte groß sein. Mit Draco lässt sich das oft auf 10–20% der Originalgröße reduzieren – ohne merklichen Qualitätsverlust für den Betrachter.
Wie funktioniert Draco?
Draco komprimiert die Geometriedaten eines 3D-Modells – also Vertices, Normalen, UV-Koordinaten und Indizes. Es nutzt dabei eine Kombination aus:
- Quantisierung – Koordinaten werden auf weniger Bits reduziert (z. B. von 32-Bit Float auf 11-Bit Integer)
- Predictive Encoding – statt absolute Werte werden Differenzen zum vorherigen Vertex gespeichert
- Entropy Coding – häufige Werte bekommen kürzere Codes (ähnlich wie ZIP)
Das Ergebnis ist eine .glb-Datei mit Draco-komprimierten Buffern, die im Browser zur Laufzeit dekodiert wird.
Modell mit Draco komprimieren
Zum Komprimieren eignet sich am besten gltf-transform – ein Node.js-Tool das direkt in der Kommandozeile funktioniert.
Installation:
npm install --global @gltf-transform/cli
Modell komprimieren:
gltf-transform draco input.glb output.glb
Mit Kontrolle über die Quantisierungsstufen (weniger Bits = kleinere Datei, etwas weniger Präzision):
gltf-transform draco input.glb output.glb --quantize-position 10 --quantize-normal 8
Als Faustregel: Position mit 10–14 Bit, Normalen mit 8 Bit – das gibt die beste Balance aus Dateigröße und Qualität.
Draco-Modell in Three.js laden
Three.js kann Draco-komprimierte Modelle nicht von Haus aus dekodieren. Du brauchst den DRACOLoader als Zusatz zum GLTFLoader.
Zuerst die Draco-Decoder-Dateien aus dem Three.js-Paket in deinen Public-Ordner kopieren:
node_modules/three/examples/jsm/libs/draco/
Den Inhalt dieses Ordners z. B. nach public/draco/ kopieren. Dann im Code:
import * as THREE from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('/draco/');
const loader = new GLTFLoader();
loader.setDRACOLoader(dracoLoader);
loader.load('/models/meinmodell.glb', (gltf) => {
scene.add(gltf.scene);
});Wichtig: Der
setDecoderPathmuss auf den Ordner zeigen, in dem die Draco WASM-Dateien (draco_decoder.wasmetc.) liegen. Three.js lädt diese zur Laufzeit nach – sie müssen also öffentlich erreichbar sein.
Lohnt sich Draco immer?
Nicht unbedingt. Ein paar Punkte die ich aus der Praxis mitgenommen habe:
- Kleine Modelle unter ~100 KB profitieren kaum – der Overhead durch den Decoder überwiegt
- Viele kleine Modelle auf einer Seite: lieber zu einem einzigen
.glbzusammenfassen - Animierte Modelle werden durch Draco meist weniger stark komprimiert, weil die Animationsdaten nicht betroffen sind
- Den
DRACOLoadereinmal anlegen und wiederverwenden – nicht für jedes Modell neu instanziieren
Kurz zusammengefasst
- Draco komprimiert 3D-Geometrien auf bis zu 10–20% der Originalgröße
- Komprimieren mit
gltf-transform draco input.glb output.glb - In Three.js:
DRACOLoadereinrichten und demGLTFLoaderübergeben - Draco-Decoder-Dateien müssen öffentlich erreichbar sein (
setDecoderPath) - Bei kleinen Modellen den Mehraufwand abwägen – nicht immer sinnvoll
Share
Leave a comment