โปรดทราบผู้ใช้ GStatic: ทีมงาน Draco ขอแนะนำอย่างยิ่งให้ใช้ URL ที่มีเวอร์ชันสำหรับการเข้าถึงเนื้อหา Draco GStatic หากคุณใช้ URL ที่มีสตริงย่อย v1/decoders
ภายใน URL การแคช Edge และความล่าช้าในการแพร่กระจาย GStatic อาจส่งผลให้เกิดข้อผิดพลาดชั่วคราวซึ่งอาจยากต่อการวินิจฉัยเมื่อมีการเปิดตัว Draco ใหม่ เพื่อหลีกเลี่ยงปัญหานี้ ให้ปักหมุดเว็บไซต์ของคุณเป็นรุ่นที่มีเวอร์ชันแล้ว
install_test
ของ src/draco/tools
สำหรับข้อมูลเพิ่มเติมhttps://github.com/google/draco/releases
Draco เป็นไลบรารีสำหรับการบีบอัดและขยายขนาดตาข่ายเรขาคณิต 3 มิติและพอยต์คลาวด์ มีวัตถุประสงค์เพื่อปรับปรุงการจัดเก็บและการส่งผ่านกราฟิก 3D
Draco ได้รับการออกแบบและสร้างขึ้นเพื่อประสิทธิภาพและความเร็วในการบีบอัด โค้ดนี้รองรับจุดบีบอัด ข้อมูลการเชื่อมต่อ พิกัดพื้นผิว ข้อมูลสี บรรทัดฐาน และคุณลักษณะทั่วไปอื่นๆ ที่เกี่ยวข้องกับเรขาคณิต ด้วย Draco แอปพลิเคชันที่ใช้กราฟิก 3 มิติอาจมีขนาดเล็กลงอย่างมากโดยไม่กระทบต่อความคมชัดของภาพ สำหรับผู้ใช้ นั่นหมายความว่าตอนนี้สามารถดาวน์โหลดแอพได้เร็วขึ้น กราฟิก 3D ในเบราว์เซอร์สามารถโหลดเร็วขึ้น และฉาก VR และ AR ก็สามารถส่งผ่านแบนด์วิธเพียงเล็กน้อยและเรนเดอร์ได้อย่างรวดเร็ว
Draco เปิดตัวเป็นซอร์สโค้ด C++ ที่สามารถใช้เพื่อบีบอัดกราฟิก 3D รวมถึงตัวถอดรหัส C++ และ Javascript สำหรับข้อมูลที่เข้ารหัส
สารบัญ
ดูอาคารสำหรับคำแนะนำในการสร้าง
สำหรับข้อมูลที่ดีที่สุดเกี่ยวกับการใช้ Unity กับ Draco โปรดไปที่ https://github.com/atteneder/DracoUnity
สำหรับตัวอย่างง่ายๆ ของการใช้ Unity กับ Draco โปรดดู README ในโฟลเดอร์ unity
ขอแนะนำให้ดึงตัวถอดรหัส Draco WASM และ JavaScript ของคุณจาก:
https://www.gstatic.com/draco/v1/decoders/
ผู้ใช้จะได้รับประโยชน์จากการมีตัวถอดรหัส Draco อยู่ในแคชเมื่อมีไซต์จำนวนมากขึ้นเริ่มใช้ URL แบบคงที่
เป้าหมายเริ่มต้นที่สร้างจากไฟล์บิลด์จะเป็นแอปพลิเคชันบรรทัดคำสั่ง draco_encoder
และ draco_decoder
นอกจากนี้ draco_transcoder
จะถูกสร้างขึ้นเมื่อมีการรัน CMake โดยตั้งค่าตัวแปร DRACO_TRANSCODER_SUPPORTED เป็น ON (ดูอาคารสำหรับรายละเอียดเพิ่มเติม) สำหรับแอปพลิเคชันทั้งหมด หากคุณเรียกใช้โดยไม่มีข้อโต้แย้งหรือ -h
แอปพลิเคชันจะแสดงการใช้งานและตัวเลือกออกมา
draco_encoder
จะอ่านไฟล์ OBJ, STL หรือ PLY เป็นอินพุต และเอาต์พุตไฟล์ที่เข้ารหัส Draco เราได้รวม Stanford's Bunny mesh ไว้สำหรับการทดสอบด้วย บรรทัดคำสั่งพื้นฐานมีลักษณะดังนี้:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc
ค่า 0
สำหรับพารามิเตอร์การหาปริมาณจะไม่ดำเนินการหาปริมาณใดๆ ในแอตทริบิวต์ที่ระบุ ค่าใดๆ ที่ไม่ใช่ 0
จะวัดปริมาณค่าอินพุตสำหรับแอตทริบิวต์ที่ระบุเป็นจำนวนบิตนั้น ตัวอย่างเช่น:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14
จะกำหนดปริมาณตำแหน่งเป็น 14 บิต (ค่าเริ่มต้นคือ 11 สำหรับพิกัดตำแหน่ง)
โดยทั่วไป ยิ่งคุณกำหนดปริมาณคุณลักษณะของคุณมากเท่าใด อัตราการบีบอัดก็จะยิ่งดีขึ้นเท่านั้น ขึ้นอยู่กับโครงการของคุณที่จะตัดสินใจว่าจะยอมรับความเบี่ยงเบนได้มากน้อยเพียงใด โดยทั่วไป โปรเจ็กต์ส่วนใหญ่สามารถตั้งค่าเชิงปริมาณได้ประมาณ 11
โดยไม่มีความแตกต่างในด้านคุณภาพที่เห็นได้ชัดเจน
พารามิเตอร์ระดับการบีบอัด ( -cl
) จะเปิด/ปิดคุณลักษณะการบีบอัดที่แตกต่างกัน
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8
โดยทั่วไป การตั้งค่าสูงสุดคือ 10
จะมีการบีบอัดมากที่สุดแต่มีความเร็วในการคลายการบีบอัดที่แย่ที่สุด 0
จะมีการบีบอัดน้อยที่สุด แต่มีความเร็วในการบีบอัดดีที่สุด การตั้งค่าเริ่มต้นคือ 7
คุณสามารถเข้ารหัสข้อมูลพอยต์คลาวด์ด้วย draco_encoder
ได้โดยระบุพารามิเตอร์ -point_cloud
หากคุณระบุพารามิเตอร์ -point_cloud
ด้วยไฟล์อินพุต mesh draco_encoder
จะเพิกเฉยต่อข้อมูลการเชื่อมต่อและเข้ารหัสตำแหน่งจากไฟล์ mesh
./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc
บรรทัดคำสั่งนี้จะเข้ารหัสอินพุต mesh เป็น point cloud แม้ว่าอินพุตอาจไม่สร้างการบีบอัดที่เป็นตัวแทนของ point cloud อื่นๆ ก็ตาม โดยเฉพาะอย่างยิ่ง เราสามารถคาดหวังอัตราการบีบอัดที่ดีกว่ามากสำหรับพอยต์คลาวด์ที่ใหญ่กว่าและหนาแน่นกว่า
draco_decoder
จะอ่านไฟล์ Draco ในรูปแบบอินพุต และเอาต์พุตไฟล์ OBJ, STL หรือ PLY บรรทัดคำสั่งพื้นฐานมีลักษณะดังนี้:
./draco_decoder -i in.drc -o out.obj
draco_transcoder
สามารถใช้เพื่อเพิ่มการบีบอัด Draco ให้กับเนื้อหา glTF บรรทัดคำสั่งพื้นฐานมีลักษณะดังนี้:
./draco_transcoder -i in.glb -o out.glb
บรรทัดคำสั่งนี้จะเพิ่มการบีบอัดเรขาคณิตให้กับเมชทั้งหมดในไฟล์ in.glb
ค่าการหาปริมาณสำหรับแอตทริบิวต์ glTF ที่แตกต่างกันสามารถระบุได้ในลักษณะเดียวกับเครื่องมือ draco_encoder
ตัวอย่างเช่น -qp
สามารถใช้เพื่อกำหนดการหาปริมาณของแอตทริบิวต์ตำแหน่ง:
./draco_transcoder -i in.glb -o out.glb -qp 12
หากคุณต้องการเพิ่มการถอดรหัสให้กับแอปพลิเคชันของคุณ คุณจะต้องรวมไลบรารี draco_dec
ด้วย ในการใช้ตัวถอดรหัส Draco คุณต้องเริ่มต้น DecoderBuffer
ด้วยข้อมูลที่บีบอัด จากนั้นเรียก DecodeMeshFromBuffer()
เพื่อส่งคืนวัตถุ Mesh ที่ถอดรหัสแล้ว หรือเรียก DecodePointCloudFromBuffer()
เพื่อส่งคืนวัตถุ PointCloud
ที่ถอดรหัสแล้ว ตัวอย่างเช่น:
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);
}
โปรดดู src/draco/mesh/mesh.h สำหรับอินเทอร์เฟซคลาส Mesh
แบบเต็ม และ src/draco/point_cloud/point_cloud.h สำหรับอินเทอร์เฟซคลาส PointCloud
แบบเต็ม
ตัวเข้ารหัส Javascript อยู่ใน javascript/draco_encoder.js
API ตัวเข้ารหัสสามารถใช้เพื่อบีบอัด mesh และ point cloud หากต้องการใช้ตัวเข้ารหัส คุณต้องสร้างอินสแตนซ์ของ DracoEncoderModule
ก่อน จากนั้นใช้อินสแตนซ์นี้เพื่อสร้างออบเจ็กต์ MeshBuilder
และ Encoder
MeshBuilder
ใช้เพื่อสร้าง mesh จากข้อมูลเรขาคณิตที่สามารถบีบอัดได้ด้วย Encoder
ในภายหลัง ขั้นแรกให้สร้างวัตถุ mesh โดยใช้ new encoderModule.Mesh()
จากนั้น ใช้ AddFacesToMesh()
เพื่อเพิ่มดัชนีให้กับ mesh และใช้ AddFloatAttributeToMesh()
เพื่อเพิ่มข้อมูลแอตทริบิวต์ลงใน mesh เช่น ตำแหน่ง พิกัดปกติ สี และพื้นผิว หลังจากสร้าง mesh แล้ว คุณสามารถใช้ EncodeMeshToDracoBuffer()
เพื่อบีบอัด mesh ได้ ตัวอย่างเช่น:
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 ) ;
โปรดดู src/draco/javascript/emscripten/draco_web_encoder.idl สำหรับ API แบบเต็ม
ตัวถอดรหัส Javascript อยู่ใน javascript/draco_decoder.js ตัวถอดรหัส Javascript สามารถถอดรหัส mesh และ point cloud ได้ ในการใช้ตัวถอดรหัส คุณต้องสร้างอินสแตนซ์ของ DracoDecoderModule
ก่อน จากนั้นอินสแตนซ์จะใช้เพื่อสร้างออบเจ็กต์ DecoderBuffer
และ Decoder
ตั้งค่าข้อมูลที่เข้ารหัสใน DecoderBuffer
จากนั้นเรียก GetEncodedGeometryType()
เพื่อระบุประเภทของเรขาคณิต เช่น mesh หรือ point cloud จากนั้นเรียก DecodeBufferToMesh()
หรือ DecodeBufferToPointCloud()
ซึ่งจะส่งคืนวัตถุ Mesh หรือ point cloud ตัวอย่างเช่น:
// 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 ) ;
โปรดดู src/draco/javascript/emscripten/draco_web_decoder.idl สำหรับ API แบบเต็ม
ตัวถอดรหัส Javascript สร้างขึ้นด้วยหน่วยความจำแบบไดนามิก ซึ่งจะทำให้ตัวถอดรหัสทำงานกับข้อมูลที่บีบอัดทั้งหมดได้ แต่ตัวเลือกนี้ไม่ใช่วิธีที่เร็วที่สุด การจัดสรรหน่วยความจำล่วงหน้าจะทำให้ความเร็วตัวถอดรหัสเพิ่มขึ้น 2 เท่า หากคุณทราบข้อกำหนดหน่วยความจำทั้งหมดของโปรเจ็กต์ของคุณ คุณสามารถเปิดหน่วยความจำแบบคงที่ได้โดยเปลี่ยน CMakeLists.txt
ตามลำดับ
เริ่มต้นจากเวอร์ชัน 1.0 Draco มีฟังก์ชันการทำงานของข้อมูลเมตาสำหรับการเข้ารหัสข้อมูลอื่นที่ไม่ใช่เรขาคณิต สามารถใช้เพื่อเข้ารหัสข้อมูลที่กำหนดเองพร้อมกับเรขาคณิตได้ ตัวอย่างเช่น เราสามารถเปิดใช้งานฟังก์ชันการทำงานของข้อมูลเมตาเพื่อเข้ารหัสชื่อของคุณลักษณะ ชื่อของออบเจ็กต์ย่อย และข้อมูลที่กำหนดเองได้ สำหรับเมชและคลาวด์พอยต์หนึ่งคลาส สามารถมีคลาสเมตาดาต้าเรขาคณิตระดับบนสุดได้หนึ่งคลาส ข้อมูลเมตาระดับบนสุดสามารถมีข้อมูลเมตาแบบลำดับชั้นได้ นอกเหนือจากนั้น ข้อมูลเมตาระดับบนสุดสามารถมีข้อมูลเมตาสำหรับแต่ละแอตทริบิวต์ซึ่งเรียกว่าข้อมูลเมตาของแอตทริบิวต์ ข้อมูลเมตาของแอตทริบิวต์ควรเริ่มต้นได้ด้วยรหัสแอตทริบิวต์ที่เกี่ยวข้องภายในตาข่าย Metadata API มีให้ทั้งใน C++ และ Javascript ตัวอย่างเช่น หากต้องการเพิ่มข้อมูลเมตาใน 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));
หากต้องการอ่านข้อมูลเมตาจากเรขาคณิตใน 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 " );
โปรดดู src/draco/metadata และ src/draco/point_cloud สำหรับ API แบบเต็ม
แพ็คเกจ Draco NPM NodeJS อยู่ใน javascript/npm/draco3d โปรดดูเอกสารในโฟลเดอร์เพื่อดูรายละเอียดการใช้งาน
ต่อไปนี้เป็นตัวอย่างของการบีบอัดทางเรขาคณิตโดย Draco โหลดผ่านตัวถอดรหัส Javascript โดยใช้ตัวเรนเดอร์ three.js
โปรดดูไฟล์ javascript/example/README.md สำหรับข้อมูลเพิ่มเติม
ตัวถอดรหัสจาวาสคริปต์ Draco ที่สร้างโดย Emscripten เวอร์ชันที่สร้างไว้ล่วงหน้านั้นโฮสต์อยู่บน www.gstatic.com ในไดเร็กทอรีที่มีป้ายกำกับเวอร์ชัน:
https://www.gstatic.com/draco/versioned/decoders/VERSION/*
ในเวอร์ชัน v1.4.3 ไฟล์ที่มีให้ใช้งานได้แก่:
เริ่มต้นด้วยการยืนยันการเปิดตัว v1.5.1 บิลด์ของไฟล์ต่อไปนี้จะพร้อมใช้งาน:
หากมีคำถาม/ความคิดเห็น โปรดส่งอีเมลไปที่ [email protected]
หากคุณพบข้อผิดพลาดในไลบรารีนี้ โปรดแจ้งปัญหาที่ https://github.com/google/draco/issues
สนับสนุนแพตช์และอาจส่งโดยการฟอร์กโปรเจ็กต์นี้และส่งคำขอดึงผ่าน GitHub ดูการมีส่วนร่วมเพื่อดูรายละเอียดเพิ่มเติม
ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2.0 ("ใบอนุญาต"); คุณไม่สามารถใช้ไฟล์นี้ได้เว้นแต่จะเป็นไปตามใบอนุญาต คุณสามารถขอรับสำเนาใบอนุญาตได้ที่
http://www.apache.org/licenses/LICENSE-2.0
เว้นแต่กฎหมายที่ใช้บังคับกำหนดหรือตกลงเป็นลายลักษณ์อักษร ซอฟต์แวร์ที่เผยแพร่ภายใต้ใบอนุญาตนี้จะถูกแจกจ่าย "ตามที่เป็น" โดยไม่มีการรับประกันหรือเงื่อนไขใดๆ ทั้งโดยชัดแจ้งหรือโดยนัย ดูใบอนุญาตสำหรับภาษาเฉพาะที่ควบคุมการอนุญาตและข้อจำกัดภายใต้ใบอนุญาต
โมเดล Bunny จากแผนกกราฟฟิกของ Stanford https://graphics.stanford.edu/data/3Dscanrep/