تنبيه لمستخدمي GStatic: يوصي فريق Draco بشدة باستخدام عناوين URL ذات الإصدار للوصول إلى محتوى Draco GStatic. إذا كنت تستخدم عناوين URL التي تتضمن السلسلة الفرعية v1/decoders
ضمن عنوان URL، فقد يؤدي التخزين المؤقت للحافة وتأخير نشر GStatic إلى أخطاء عابرة قد يكون من الصعب تشخيصها عند إطلاق إصدارات Draco الجديدة. لتجنب هذه المشكلة، قم بتثبيت مواقعك على إصدار تم إصداره.
install_test
لـ src/draco/tools
لمزيد من المعلومات.https://github.com/google/draco/releases
Draco هي مكتبة لضغط وفك ضغط الشبكات الهندسية ثلاثية الأبعاد والسحب النقطية. الغرض منه هو تحسين تخزين ونقل الرسومات ثلاثية الأبعاد.
تم تصميم وبناء Draco لتحقيق كفاءة الضغط والسرعة. يدعم الكود ضغط النقاط ومعلومات الاتصال وإحداثيات النسيج ومعلومات اللون والقيم الطبيعية وأي سمات عامة أخرى مرتبطة بالهندسة. مع Draco، يمكن أن تكون التطبيقات التي تستخدم الرسومات ثلاثية الأبعاد أصغر بكثير دون المساس بالدقة البصرية. بالنسبة للمستخدمين، يعني هذا أنه يمكن الآن تنزيل التطبيقات بشكل أسرع، ويمكن تحميل الرسومات ثلاثية الأبعاد في المتصفح بشكل أسرع، ويمكن الآن نقل مشاهد الواقع الافتراضي والواقع المعزز بجزء صغير من النطاق الترددي وعرضها بسرعة.
تم إصدار Draco ككود مصدر C++ الذي يمكن استخدامه لضغط الرسومات ثلاثية الأبعاد بالإضافة إلى وحدات فك ترميز C++ وJavascript للبيانات المشفرة.
محتويات
راجع البناء للحصول على تعليمات البناء.
للحصول على أفضل المعلومات حول استخدام Unity مع Draco، يرجى زيارة https://github.com/atteneder/DracoUnity
للحصول على مثال بسيط لاستخدام Unity مع Draco، راجع الملف README في مجلد الوحدة.
يوصى دائمًا بسحب أجهزة فك ترميز 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. لقد قمنا بتضمين شبكة الأرنب من ستانفورد للاختبار. يبدو سطر الأوامر الأساسي كما يلي:
./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
مع ملف إدخال شبكي، فسوف يتجاهل draco_encoder
بيانات الاتصال ويقوم بتشفير المواضع من ملف الشبكة.
./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc
سيقوم سطر الأوامر هذا بتشفير إدخال الشبكة كسحابة نقطية، على الرغم من أن الإدخال قد لا ينتج ضغطًا يمثل السحب النقطية الأخرى. على وجه التحديد، يمكن للمرء أن يتوقع معدلات ضغط أفضل بكثير للسحب النقطية الأكبر والأكثر كثافة.
سيقوم 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()
لإرجاع كائن شبكي تم فك ترميزه أو اتصل بـ 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
. يمكن استخدام واجهة برمجة تطبيقات التشفير لضغط الشبكة والسحابة النقطية. من أجل استخدام برنامج التشفير، تحتاج أولاً إلى إنشاء مثيل DracoEncoderModule
. ثم استخدم هذا المثيل لإنشاء كائنات MeshBuilder
و Encoder
. يتم استخدام MeshBuilder
لإنشاء شبكة من البيانات الهندسية التي يمكن ضغطها لاحقًا بواسطة Encoder
. قم أولاً بإنشاء كائن شبكي باستخدام new encoderModule.Mesh()
. بعد ذلك، استخدم AddFacesToMesh()
لإضافة مؤشرات إلى الشبكة واستخدم AddFloatAttributeToMesh()
لإضافة بيانات السمات إلى الشبكة، على سبيل المثال، إحداثيات الموضع والإحداثيات العادية واللون والملمس. بعد إنشاء الشبكة، يمكنك بعد ذلك استخدام EncodeMeshToDracoBuffer()
لضغط الشبكة. على سبيل المثال:
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 للتعرف على واجهة برمجة التطبيقات الكاملة.
وحدة فك ترميز جافا سكريبت موجودة في javascript/draco_decoder.js. يمكن لوحدة فك ترميز Javascript فك تشفير الشبكة والسحابة النقطية. من أجل استخدام وحدة فك الترميز، يجب عليك أولاً إنشاء مثيل DracoDecoderModule
. يتم بعد ذلك استخدام المثيل لإنشاء كائنات DecoderBuffer
و Decoder
. قم بتعيين البيانات المشفرة في DecoderBuffer
. ثم اتصل بـ GetEncodedGeometryType()
لتحديد نوع الشكل الهندسي، على سبيل المثال الشبكة أو السحابة النقطية. ثم اتصل إما بـ DecodeBufferToMesh()
أو DecodeBufferToPointCloud()
، والذي سيعيد كائن Mesh أو سحابة نقطية. على سبيل المثال:
// 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 للتعرف على واجهة برمجة التطبيقات الكاملة.
تم تصميم وحدة فك ترميز Javascript بذاكرة ديناميكية. سيسمح هذا لجهاز فك التشفير بالعمل مع كافة البيانات المضغوطة. لكن هذا الخيار ليس الأسرع. يؤدي التخصيص المسبق للذاكرة إلى تحسين سرعة وحدة فك التشفير بمقدار 2x. إذا كنت تعرف كافة متطلبات الذاكرة الخاصة بمشروعك، فيمكنك تشغيل الذاكرة الثابتة عن طريق تغيير CMakeLists.txt
وفقًا لذلك.
بدءًا من الإصدار 1.0، يوفر Draco وظيفة البيانات الوصفية لتشفير البيانات بخلاف البيانات الهندسية. ويمكن استخدامه لترميز أي بيانات مخصصة مع الشكل الهندسي. على سبيل المثال، يمكننا تمكين وظيفة البيانات الوصفية لتشفير اسم السمات وأسماء الكائنات الفرعية والمعلومات المخصصة. بالنسبة لسحابة شبكية ونقطية واحدة، يمكن أن تحتوي على فئة بيانات تعريف هندسية عالية المستوى. يمكن أن تحتوي بيانات التعريف ذات المستوى الأعلى على بيانات تعريف هرمية. بخلاف ذلك، يمكن أن تحتوي البيانات الوصفية ذات المستوى الأعلى على بيانات تعريف لكل سمة تسمى بيانات تعريف السمة. يجب تهيئة البيانات التعريفية للسمة باستخدام معرف السمة المقابل داخل الشبكة. يتم توفير واجهة برمجة تطبيقات البيانات التعريفية في كل من 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 للتعرف على واجهة برمجة التطبيقات الكاملة.
توجد حزمة Draco NPM NodeJS في javascript/npm/draco3d. يرجى الاطلاع على المستند الموجود في المجلد للاستخدام التفصيلي.
فيما يلي مثال على شكل هندسي مضغوط باستخدام Draco تم تحميله عبر وحدة فك ترميز Javascript باستخدام عارض three.js
.
يرجى الاطلاع على ملف javascript/example/README.md لمزيد من المعلومات.
تتم استضافة الإصدارات المعدة مسبقًا من وحدات فك ترميز Draco javascript المبنية من 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، الإصدار 2.0 ("الترخيص")؛ لا يجوز لك استخدام هذا الملف إلا وفقًا للترخيص. يمكنك الحصول على نسخة من الترخيص على
http://www.apache.org/licenses/LICENSE-2.0
ما لم يكن ذلك مطلوبًا بموجب القانون المعمول به أو تم الاتفاق عليه كتابيًا، يتم توزيع البرامج الموزعة بموجب الترخيص على أساس "كما هي"، دون ضمانات أو شروط من أي نوع، سواء كانت صريحة أو ضمنية. راجع الترخيص لمعرفة الأذونات والقيود التي تحكم اللغة المحددة بموجب الترخيص.
نموذج الأرنب من قسم الجرافيك بجامعة ستانفورد https://graphics.stanford.edu/data/3Dscanrep/