Perhatian pengguna GStatic: tim Draco sangat menyarankan penggunaan URL berversi untuk mengakses konten Draco GStatic. Jika Anda menggunakan URL yang menyertakan substring v1/decoders
di dalam URL, cache tepi dan penundaan propagasi GStatic dapat mengakibatkan kesalahan sementara yang sulit didiagnosis saat rilis Draco baru diluncurkan. Untuk menghindari masalah, sematkan situs Anda ke rilis berversi.
install_test
dari src/draco/tools
untuk informasi lebih lanjut.https://github.com/google/draco/releases
Draco adalah perpustakaan untuk mengompresi dan mendekompresi jerat geometris 3D dan awan titik. Hal ini dimaksudkan untuk meningkatkan penyimpanan dan transmisi grafik 3D.
Draco dirancang dan dibuat untuk efisiensi dan kecepatan kompresi. Kode ini mendukung titik kompresi, informasi konektivitas, koordinat tekstur, informasi warna, normal, dan atribut umum lainnya yang terkait dengan geometri. Dengan Draco, aplikasi yang menggunakan grafik 3D bisa menjadi lebih kecil secara signifikan tanpa mengurangi fidelitas visual. Bagi pengguna, ini berarti aplikasi kini dapat diunduh lebih cepat, grafik 3D di browser dapat dimuat lebih cepat, dan adegan VR dan AR kini dapat ditransmisikan dengan bandwidth yang lebih sedikit dan dirender dengan cepat.
Draco dirilis sebagai kode sumber C++ yang dapat digunakan untuk mengompresi grafik 3D serta decoder C++ dan Javascript untuk data yang dikodekan.
Isi
Lihat BANGUNAN untuk instruksi pembangunan.
Untuk informasi terbaik tentang penggunaan Unity dengan Draco, silakan kunjungi https://github.com/atteneder/DracoUnity
Untuk contoh sederhana penggunaan Unity dengan Draco, lihat README di folder unity.
Disarankan untuk selalu mengambil dekoder Draco WASM dan JavaScript Anda dari:
https://www.gstatic.com/draco/v1/decoders/
Pengguna akan mendapat manfaat dari memiliki dekoder Draco di cache karena semakin banyak situs yang mulai menggunakan URL statis.
Target default yang dibuat dari file build adalah aplikasi baris perintah draco_encoder
dan draco_decoder
. Selain itu, draco_transcoder
dihasilkan ketika CMake dijalankan dengan variabel DRACO_TRANSCODER_SUPPORTED disetel ke ON (lihat BUILDING untuk detail selengkapnya). Untuk semua aplikasi, jika Anda menjalankannya tanpa argumen atau -h
apa pun, aplikasi akan menampilkan penggunaan dan opsi.
draco_encoder
akan membaca file OBJ, STL atau PLY sebagai input, dan output file yang dikodekan Draco. Kami telah menyertakan jaring Kelinci Stanford untuk pengujian. Baris perintah dasar terlihat seperti ini:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc
Nilai 0
untuk parameter kuantisasi tidak akan melakukan kuantisasi apapun pada atribut yang ditentukan. Nilai apa pun selain 0
akan mengkuantisasi nilai input untuk atribut tertentu ke jumlah bit tersebut. Misalnya:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14
akan mengkuantisasi posisi menjadi 14 bit (defaultnya adalah 11 untuk koordinat posisi).
Secara umum, semakin banyak Anda mengkuantifikasi atribut Anda, semakin baik tingkat kompresi yang akan Anda dapatkan. Proyek Andalah yang memutuskan berapa banyak penyimpangan yang dapat ditoleransi. Secara umum, sebagian besar proyek dapat menetapkan nilai kuantisasi sekitar 11
tanpa perbedaan kualitas yang nyata.
Parameter tingkat kompresi ( -cl
) mengaktifkan/menonaktifkan fitur kompresi yang berbeda.
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8
Secara umum, pengaturan tertinggi, 10
, akan memiliki kompresi terbanyak namun kecepatan dekompresi terburuk. 0
akan memiliki kompresi paling sedikit, namun kecepatan dekompresi terbaik. Pengaturan defaultnya adalah 7
.
Anda dapat mengkodekan data point cloud dengan draco_encoder
dengan menentukan parameter -point_cloud
. Jika Anda menentukan parameter -point_cloud
dengan file input mesh, draco_encoder
akan mengabaikan data konektivitas dan mengkodekan posisi dari file mesh.
./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc
Baris perintah ini akan mengkodekan input mesh sebagai point cloud, meskipun input tersebut mungkin tidak menghasilkan kompresi yang mewakili point cloud lainnya. Secara khusus, kita dapat mengharapkan tingkat kompresi yang jauh lebih baik untuk point cloud yang lebih besar dan lebih padat.
draco_decoder
akan membaca file Draco sebagai input, dan output file OBJ, STL atau PLY. Baris perintah dasar terlihat seperti ini:
./draco_decoder -i in.drc -o out.obj
draco_transcoder
dapat digunakan untuk menambahkan kompresi Draco ke aset glTF. Baris perintah dasar terlihat seperti ini:
./draco_transcoder -i in.glb -o out.glb
Baris perintah ini akan menambahkan kompresi geometri ke semua jerat di file in.glb
. Nilai kuantisasi untuk atribut glTF yang berbeda dapat ditentukan serupa dengan alat draco_encoder
. Misalnya -qp
dapat digunakan untuk mendefinisikan kuantisasi atribut position:
./draco_transcoder -i in.glb -o out.glb -qp 12
Jika Anda ingin menambahkan decoding ke aplikasi Anda, Anda perlu menyertakan perpustakaan draco_dec
. Untuk menggunakan decoder Draco Anda perlu menginisialisasi DecoderBuffer
dengan data terkompresi. Lalu panggil DecodeMeshFromBuffer()
untuk mengembalikan objek mesh yang didekode atau panggil DecodePointCloudFromBuffer()
untuk mengembalikan objek PointCloud
yang didekode. Misalnya:
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);
}
Silakan lihat src/draco/mesh/mesh.h untuk antarmuka kelas Mesh
lengkap dan src/draco/point_cloud/point_cloud.h untuk antarmuka kelas PointCloud
lengkap.
Encoder Javascript terletak di javascript/draco_encoder.js
. API encoder dapat digunakan untuk mengompresi mesh dan point cloud. Untuk menggunakan encoder, Anda harus membuat instance DracoEncoderModule
terlebih dahulu. Kemudian gunakan instance ini untuk membuat objek MeshBuilder
dan Encoder
. MeshBuilder
digunakan untuk membuat mesh dari data geometri yang nantinya dapat dikompresi oleh Encoder
. Pertama buat objek mesh menggunakan new encoderModule.Mesh()
. Kemudian, gunakan AddFacesToMesh()
untuk menambahkan indeks ke mesh dan gunakan AddFloatAttributeToMesh()
untuk menambahkan data atribut ke mesh, misalnya koordinat posisi, normal, warna dan tekstur. Setelah jaring dibuat, Anda kemudian dapat menggunakan EncodeMeshToDracoBuffer()
untuk mengompresi jaring. Misalnya:
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 ) ;
Silakan lihat src/draco/javascript/emscripten/draco_web_encoder.idl untuk API selengkapnya.
Decoder Javascript terletak di javascript/draco_decoder.js. Decoder Javascript dapat memecahkan kode mesh dan point cloud. Untuk menggunakan decoder, Anda harus membuat instance DracoDecoderModule
terlebih dahulu. Instance tersebut kemudian digunakan untuk membuat objek DecoderBuffer
dan Decoder
. Atur data yang disandikan di DecoderBuffer
. Kemudian panggil GetEncodedGeometryType()
untuk mengidentifikasi jenis geometri, misalnya mesh atau point cloud. Kemudian panggil DecodeBufferToMesh()
atau DecodeBufferToPointCloud()
, yang akan mengembalikan objek Mesh atau titik cloud. Misalnya:
// 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 ) ;
Silakan lihat src/draco/javascript/emscripten/draco_web_decoder.idl untuk API selengkapnya.
Dekoder Javascript dibuat dengan memori dinamis. Ini akan memungkinkan dekoder bekerja dengan semua data terkompresi. Namun opsi ini bukan yang tercepat. Pra-alokasi memori melihat peningkatan kecepatan dekoder 2x. Jika Anda mengetahui semua kebutuhan memori proyek Anda, Anda dapat mengaktifkan memori statis dengan mengubah CMakeLists.txt
sesuai kebutuhan.
Mulai dari v1.0, Draco menyediakan fungsionalitas metadata untuk pengkodean data selain geometri. Ini dapat digunakan untuk menyandikan data khusus apa pun beserta geometrinya. Misalnya, kita dapat mengaktifkan fungsionalitas metadata untuk menyandikan nama atribut, nama sub-objek, dan informasi yang disesuaikan. Untuk satu mesh dan point cloud, ia dapat memiliki satu kelas metadata geometri tingkat atas. Metadata tingkat atas kemudian dapat memiliki metadata hierarki. Selain itu, metadata tingkat atas dapat memiliki metadata untuk setiap atribut yang disebut metadata atribut. Metadata atribut harus diinisialisasi dengan id atribut koresponden dalam mesh. API metadata disediakan dalam C++ dan Javascript. Misalnya, untuk menambahkan metadata di C++:
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));
Untuk membaca metadata dari geometri di 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 " );
Silakan lihat src/draco/metadata dan src/draco/point_cloud untuk API selengkapnya.
Paket Draco NPM NodeJS terletak di javascript/npm/draco3d. Silakan lihat dokumen di folder untuk penggunaan detail.
Berikut adalah contoh kompresi geometris dengan Draco yang dimuat melalui dekoder Javascript menggunakan penyaji three.js
.
Silakan lihat file javascript/example/README.md untuk informasi lebih lanjut.
Versi bawaan dekoder javascript Draco buatan Emscripten dihosting di www.gstatic.com dalam direktori berlabel versi:
https://www.gstatic.com/draco/versioned/decoders/VERSION/*
Pada rilis v1.4.3, file yang tersedia adalah:
Dimulai dengan pernyataan rilis v1.5.1 yang mengaktifkan build dari file berikut ini tersedia:
Untuk pertanyaan/komentar silakan kirim email ke [email protected]
Jika Anda menemukan kesalahan di perpustakaan ini, harap ajukan masalah di https://github.com/google/draco/issues
Patch dianjurkan, dan dapat dikirimkan dengan melakukan forking pada proyek ini dan mengirimkan permintaan penarikan melalui GitHub. Lihat KONTRIBUSI untuk lebih jelasnya.
Berlisensi di bawah Lisensi Apache, Versi 2.0 ("Lisensi"); Anda tidak boleh menggunakan file ini kecuali sesuai dengan Lisensi. Anda dapat memperoleh salinan Lisensi di
http://www.apache.org/licenses/LICENSE-2.0
Kecuali diwajibkan oleh undang-undang yang berlaku atau disetujui secara tertulis, perangkat lunak yang didistribusikan berdasarkan Lisensi didistribusikan berdasarkan DASAR "APA ADANYA", TANPA JAMINAN ATAU KETENTUAN DALAM BENTUK APAPUN, baik tersurat maupun tersirat. Lihat Lisensi untuk bahasa tertentu yang mengatur izin dan batasan berdasarkan Lisensi.
Model kelinci dari departemen grafis Stanford https://graphics.stanford.edu/data/3Dscanrep/