Achtung GStatic-Benutzer: Das Draco-Team empfiehlt dringend, die versionierten URLs für den Zugriff auf Draco GStatic-Inhalte zu verwenden. Wenn Sie die URLs verwenden, die den v1/decoders
Teilstring in der URL enthalten, können Edge-Caching und GStatic-Verbreitungsverzögerungen zu vorübergehenden Fehlern führen, die beim Start neuer Draco-Versionen schwer zu diagnostizieren sein können. Um das Problem zu vermeiden, heften Sie Ihre Websites an eine versionierte Version.
install_test
von src/draco/tools
.https://github.com/google/draco/releases
Draco ist eine Bibliothek zum Komprimieren und Dekomprimieren von 3D-Geometrienetzen und Punktwolken. Es soll die Speicherung und Übertragung von 3D-Grafiken verbessern.
Draco wurde im Hinblick auf Komprimierungseffizienz und Geschwindigkeit entwickelt und gebaut. Der Code unterstützt das Komprimieren von Punkten, Konnektivitätsinformationen, Texturkoordinaten, Farbinformationen, Normalen und allen anderen generischen Attributen im Zusammenhang mit der Geometrie. Mit Draco können Anwendungen, die 3D-Grafiken verwenden, deutlich kleiner werden, ohne dass die visuelle Wiedergabetreue beeinträchtigt wird. Für Benutzer bedeutet dies, dass Apps jetzt schneller heruntergeladen werden können, 3D-Grafiken im Browser schneller geladen werden können und VR- und AR-Szenen jetzt mit einem Bruchteil der Bandbreite übertragen und schnell gerendert werden können.
Draco wird als C++-Quellcode veröffentlicht, der zum Komprimieren von 3D-Grafiken sowie als C++- und Javascript-Decoder für die codierten Daten verwendet werden kann.
Inhalt
Bauanweisungen finden Sie unter GEBÄUDE.
Die besten Informationen zur Verwendung von Unity mit Draco finden Sie unter https://github.com/atteneder/DracoUnity
Ein einfaches Beispiel für die Verwendung von Unity mit Draco finden Sie in der README-Datei im Unity-Ordner.
Es wird empfohlen, Ihre Draco WASM- und JavaScript-Decoder immer abzurufen von:
https://www.gstatic.com/draco/v1/decoders/
Benutzer profitieren davon, dass sich der Draco-Decoder im Cache befindet, da immer mehr Websites die statische URL verwenden.
Das aus den Build-Dateien erstellte Standardziel sind die Befehlszeilenanwendungen draco_encoder
und draco_decoder
. Darüber hinaus wird draco_transcoder
generiert, wenn CMake ausgeführt wird, wobei die Variable DRACO_TRANSCODER_SUPPORTED auf ON gesetzt ist (weitere Einzelheiten finden Sie unter BUILDING). Wenn Sie alle Anwendungen ohne Argumente oder -h
ausführen, geben die Anwendungen Verwendung und Optionen aus.
draco_encoder
liest OBJ-, STL- oder PLY-Dateien als Eingabe und gibt Draco-codierte Dateien aus. Zum Testen haben wir das Bunny-Netz von Stanford beigefügt. Die grundlegende Befehlszeile sieht folgendermaßen aus:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc
Ein Wert von 0
für den Quantisierungsparameter führt keine Quantisierung für das angegebene Attribut durch. Jeder andere Wert als 0
quantisiert die Eingabewerte für das angegebene Attribut auf diese Anzahl von Bits. Zum Beispiel:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14
quantisiert die Positionen auf 14 Bit (Standard ist 11 für die Positionskoordinaten).
Im Allgemeinen gilt: Je stärker Sie Ihre Attribute quantisieren, desto besser ist die Komprimierungsrate. Es liegt an Ihrem Projekt, zu entscheiden, wie viel Abweichung es toleriert. Im Allgemeinen können die meisten Projekte Quantisierungswerte von etwa 11
einstellen, ohne dass es zu einem spürbaren Qualitätsunterschied kommt.
Der Parameter Komprimierungsstufe ( -cl
) aktiviert/deaktiviert verschiedene Komprimierungsfunktionen.
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8
Im Allgemeinen hat die höchste Einstellung, 10
, die höchste Komprimierung, aber die schlechteste Dekomprimierungsgeschwindigkeit. 0
hat die geringste Komprimierung, aber die beste Dekomprimierungsgeschwindigkeit. Die Standardeinstellung ist 7
.
Sie können Punktwolkendaten mit draco_encoder
kodieren, indem Sie den Parameter -point_cloud
angeben. Wenn Sie den Parameter -point_cloud
mit einer Mesh-Eingabedatei angeben, ignoriert draco_encoder
die Konnektivitätsdaten und codiert die Positionen aus der Mesh-Datei.
./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc
Diese Befehlszeile kodiert die Netzeingabe als Punktwolke, auch wenn die Eingabe möglicherweise keine Komprimierung erzeugt, die für andere Punktwolken repräsentativ ist. Insbesondere kann man bei größeren und dichteren Punktwolken deutlich bessere Komprimierungsraten erwarten.
draco_decoder
liest Draco-Dateien als Eingabe und gibt OBJ-, STL- oder PLY-Dateien aus. Die grundlegende Befehlszeile sieht folgendermaßen aus:
./draco_decoder -i in.drc -o out.obj
draco_transcoder
kann verwendet werden, um Draco-Komprimierung zu glTF-Assets hinzuzufügen. Die grundlegende Befehlszeile sieht so aus:
./draco_transcoder -i in.glb -o out.glb
Diese Befehlszeile fügt allen Netzen in der in.glb
Datei eine Geometriekomprimierung hinzu. Quantisierungswerte für verschiedene glTF-Attribute können ähnlich wie beim Tool draco_encoder
angegeben werden. Beispielsweise kann -qp
verwendet werden, um die Quantisierung des Positionsattributs zu definieren:
./draco_transcoder -i in.glb -o out.glb -qp 12
Wenn Sie Ihren Anwendungen eine Dekodierung hinzufügen möchten, müssen Sie die Bibliothek draco_dec
einbinden. Um den Draco-Decoder verwenden zu können, müssen Sie einen DecoderBuffer
mit den komprimierten Daten initialisieren. Rufen Sie dann DecodeMeshFromBuffer()
auf, um ein dekodiertes Netzobjekt zurückzugeben, oder rufen Sie DecodePointCloudFromBuffer()
auf, um ein dekodiertes PointCloud
Objekt zurückzugeben. Zum Beispiel:
draco::DecoderBuffer buffer;
buffer.Init(data.data(), data.size());
const draco::EncodedGeometryType geom_type =
draco::GetEncodedGeometryType (&buffer);
if (geom_type == draco::TRIANGULAR_MESH) {
unique_ptr<draco::Mesh> mesh = draco::DecodeMeshFromBuffer (&buffer);
} else if (geom_type == draco::POINT_CLOUD) {
unique_ptr<draco::PointCloud> pc = draco::DecodePointCloudFromBuffer (&buffer);
}
Die vollständige Mesh
-Klassenschnittstelle finden Sie unter src/draco/mesh/mesh.h und die vollständige PointCloud
-Klassenschnittstelle unter src/draco/point_cloud/point_cloud.h.
Der Javascript-Encoder befindet sich in javascript/draco_encoder.js
. Die Encoder-API kann zum Komprimieren von Netzen und Punktwolken verwendet werden. Um den Encoder verwenden zu können, müssen Sie zunächst eine Instanz von DracoEncoderModule
erstellen. Verwenden Sie dann diese Instanz, um MeshBuilder
und Encoder
Objekte zu erstellen. MeshBuilder
wird verwendet, um ein Netz aus Geometriedaten zu erstellen, das später von Encoder
komprimiert werden kann. Erstellen Sie zunächst ein Mesh-Objekt mit new encoderModule.Mesh()
. Verwenden Sie dann AddFacesToMesh()
um dem Netz Indizes hinzuzufügen, und verwenden Sie AddFloatAttributeToMesh()
um Attributdaten zum Netz hinzuzufügen, z. B. Position, Normale, Farbe und Texturkoordinaten. Nachdem ein Netz erstellt wurde, können Sie EncodeMeshToDracoBuffer()
verwenden, um das Netz zu komprimieren. Zum Beispiel:
const mesh = {
indices : new Uint32Array ( indices ) ,
vertices : new Float32Array ( vertices ) ,
normals : new Float32Array ( normals )
} ;
const encoderModule = DracoEncoderModule ( ) ;
const encoder = new encoderModule . Encoder ( ) ;
const meshBuilder = new encoderModule . MeshBuilder ( ) ;
const dracoMesh = new encoderModule . Mesh ( ) ;
const numFaces = mesh . indices . length / 3 ;
const numPoints = mesh . vertices . length ;
meshBuilder . AddFacesToMesh ( dracoMesh , numFaces , mesh . indices ) ;
meshBuilder . AddFloatAttributeToMesh ( dracoMesh , encoderModule . POSITION ,
numPoints , 3 , mesh . vertices ) ;
if ( mesh . hasOwnProperty ( 'normals' ) ) {
meshBuilder . AddFloatAttributeToMesh (
dracoMesh , encoderModule . NORMAL , numPoints , 3 , mesh . normals ) ;
}
if ( mesh . hasOwnProperty ( 'colors' ) ) {
meshBuilder . AddFloatAttributeToMesh (
dracoMesh , encoderModule . COLOR , numPoints , 3 , mesh . colors ) ;
}
if ( mesh . hasOwnProperty ( 'texcoords' ) ) {
meshBuilder . AddFloatAttributeToMesh (
dracoMesh , encoderModule . TEX_COORD , numPoints , 3 , mesh . texcoords ) ;
}
if ( method === "edgebreaker" ) {
encoder . SetEncodingMethod ( encoderModule . MESH_EDGEBREAKER_ENCODING ) ;
} else if ( method === "sequential" ) {
encoder . SetEncodingMethod ( encoderModule . MESH_SEQUENTIAL_ENCODING ) ;
}
const encodedData = new encoderModule . DracoInt8Array ( ) ;
// Use default encoding setting.
const encodedLen = encoder . EncodeMeshToDracoBuffer ( dracoMesh ,
encodedData ) ;
encoderModule . destroy ( dracoMesh ) ;
encoderModule . destroy ( encoder ) ;
encoderModule . destroy ( meshBuilder ) ;
Die vollständige API finden Sie unter src/draco/javascript/emscripten/draco_web_encoder.idl.
Der Javascript-Decoder befindet sich in javascript/draco_decoder.js. Der Javascript-Decoder kann Netze und Punktwolken dekodieren. Um den Decoder verwenden zu können, müssen Sie zunächst eine Instanz von DracoDecoderModule
erstellen. Die Instanz wird dann zum Erstellen DecoderBuffer
und Decoder
Objekten verwendet. Legen Sie die codierten Daten im DecoderBuffer
fest. Rufen Sie dann GetEncodedGeometryType()
auf, um den Geometrietyp zu identifizieren, z. B. Netz oder Punktwolke. Rufen Sie dann entweder DecodeBufferToMesh()
oder DecodeBufferToPointCloud()
auf, wodurch ein Mesh-Objekt oder eine Punktwolke zurückgegeben wird. Zum Beispiel:
// Create the Draco decoder.
const decoderModule = DracoDecoderModule ( ) ;
const buffer = new decoderModule . DecoderBuffer ( ) ;
buffer . Init ( byteArray , byteArray . length ) ;
// Create a buffer to hold the encoded data.
const decoder = new decoderModule . Decoder ( ) ;
const geometryType = decoder . GetEncodedGeometryType ( buffer ) ;
// Decode the encoded geometry.
let outputGeometry ;
let status ;
if ( geometryType == decoderModule . TRIANGULAR_MESH ) {
outputGeometry = new decoderModule . Mesh ( ) ;
status = decoder . DecodeBufferToMesh ( buffer , outputGeometry ) ;
} else {
outputGeometry = new decoderModule . PointCloud ( ) ;
status = decoder . DecodeBufferToPointCloud ( buffer , outputGeometry ) ;
}
// You must explicitly delete objects created from the DracoDecoderModule
// or Decoder.
decoderModule . destroy ( outputGeometry ) ;
decoderModule . destroy ( decoder ) ;
decoderModule . destroy ( buffer ) ;
Die vollständige API finden Sie unter src/draco/javascript/emscripten/draco_web_decoder.idl.
Der Javascript-Decoder ist mit dynamischem Speicher ausgestattet. Dadurch kann der Decoder mit allen komprimierten Daten arbeiten. Diese Option ist jedoch nicht die schnellste. Durch die Vorabzuweisung des Speichers wird die Geschwindigkeit des Decoders etwa um das Doppelte verbessert. Wenn Sie den gesamten Speicherbedarf Ihres Projekts kennen, können Sie den statischen Speicher aktivieren, indem Sie CMakeLists.txt
entsprechend ändern.
Ab Version 1.0 bietet Draco Metadatenfunktionen zum Kodieren anderer Daten als der Geometrie. Es könnte verwendet werden, um beliebige benutzerdefinierte Daten zusammen mit der Geometrie zu kodieren. Beispielsweise können wir Metadatenfunktionen aktivieren, um die Namen von Attributen, Namen von Unterobjekten und benutzerdefinierten Informationen zu kodieren. Für ein Netz und eine Punktwolke kann es eine Geometriemetadatenklasse der obersten Ebene geben. Die Metadaten der obersten Ebene können dann hierarchische Metadaten enthalten. Darüber hinaus können die Metadaten der obersten Ebene Metadaten für jedes Attribut enthalten, die als Attributmetadaten bezeichnet werden. Die Attributmetadaten sollten mit der entsprechenden Attribut-ID innerhalb des Netzes initialisiert werden. Die Metadaten-API wird sowohl in C++ als auch in Javascript bereitgestellt. So fügen Sie beispielsweise Metadaten in C++ hinzu:
draco::PointCloud pc;
// Add metadata for the geometry.
std::unique_ptr<draco::GeometryMetadata> metadata =
std::unique_ptr<draco::GeometryMetadata>( new draco::GeometryMetadata());
metadata-> AddEntryString ( " description " , " This is an example. " );
pc.AddMetadata(std::move(metadata));
// Add metadata for attributes.
draco::GeometryAttribute pos_att;
pos_att.Init(draco::GeometryAttribute::POSITION, nullptr , 3 ,
draco::DT_FLOAT32, false , 12 , 0 );
const uint32_t pos_att_id = pc.AddAttribute(pos_att, false , 0 );
std::unique_ptr<draco::AttributeMetadata> pos_metadata =
std::unique_ptr<draco::AttributeMetadata>(
new draco::AttributeMetadata(pos_att_id));
pos_metadata-> AddEntryString ( " name " , " position " );
// Directly add attribute metadata to geometry.
// You can do this without explicitly add |GeometryMetadata| to mesh.
pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));
So lesen Sie Metadaten aus einer Geometrie in C++:
// Get metadata for the geometry.
const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();
// Request metadata for a specific attribute.
const draco::AttributeMetadata *requested_pos_metadata =
pc.GetAttributeMetadataByStringEntry( " name " , " position " );
Die vollständige API finden Sie unter src/draco/metadata und src/draco/point_cloud.
Das Draco NPM NodeJS-Paket befindet sich in javascript/npm/draco3d. Eine detaillierte Verwendung finden Sie im Dokument im Ordner.
Hier ist ein Beispiel einer mit Draco komprimierten Geometrie, die über einen Javascript-Decoder mit dem three.js
Renderer geladen wurde.
Weitere Informationen finden Sie in der Datei javascript/example/README.md.
Vorgefertigte Versionen der von Emscripten erstellten Draco-Javascript-Decoder werden auf www.gstatic.com in Verzeichnissen mit der Bezeichnung „Version“ gehostet:
https://www.gstatic.com/draco/versioned/decoders/VERSION/*
Ab Version 1.4.3 sind folgende Dateien verfügbar:
Ab der Release-Assertion-fähigen Version v1.5.1 sind Builds der folgenden Dateien verfügbar:
Für Fragen/Kommentare senden Sie bitte eine E-Mail an [email protected]
Wenn Sie einen Fehler in dieser Bibliothek gefunden haben, melden Sie bitte ein Problem unter https://github.com/google/draco/issues
Patches werden empfohlen und können durch einen Fork dieses Projekts und die Übermittlung einer Pull-Anfrage über GitHub eingereicht werden. Weitere Einzelheiten finden Sie unter BEITRAGEN.
Lizenziert unter der Apache-Lizenz, Version 2.0 (die „Lizenz“); Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. Eine Kopie der Lizenz erhalten Sie unter
http://www.apache.org/licenses/LICENSE-2.0
Sofern nicht durch geltendes Recht vorgeschrieben oder schriftlich vereinbart, wird die im Rahmen der Lizenz vertriebene Software „WIE BESEHEN“ und OHNE GEWÄHRLEISTUNGEN ODER BEDINGUNGEN JEGLICHER ART, weder ausdrücklich noch stillschweigend, vertrieben. Die spezifische Sprache, die die Berechtigungen und Einschränkungen im Rahmen der Lizenz regelt, finden Sie in der Lizenz.
Hasenmodell aus der Grafikabteilung von Stanford https://graphics.stanford.edu/data/3Dscanrep/