أساسيات GLTF و GLB ، الجزء 2

هذه المقالة هي استمرار لأساسيات تنسيقات GLTF و GLB. يمكنك العثور على الجزء الأول من المقال هنا . في الجزء الأول ، درسنا معك سبب التخطيط للتنسيق في الأصل ، وكذلك هذه القطع الأثرية وسماتها بتنسيق GLTF مثل Scene و Node و Buffer و BufferView و Accessor و Mesh. في هذه المقالة ، سننظر في المادة ، والملمس ، والرسوم المتحركة ، والجلد ، والكاميرا ، وننتهي أيضًا من إنشاء ملف GLTF صالح كحد أدنى.


صورة

المواد والملمس


المواد والقوام ترتبط ارتباطًا وثيقًا بالشبكة. إذا لزم الأمر ، يمكن أن تكون شبكة متحركة. تخزن المواد معلومات حول كيفية تقديم النموذج بواسطة المحرك. يعرف GLTF المواد باستخدام مجموعة شائعة من المعلمات التي تستند إلى التقديم الفعلي (PBR). يسمح لك نموذج PBR بإنشاء شاشة "صحيحة فعليًا" للكائن في ظروف الإضاءة المختلفة نظرًا لحقيقة أن نموذج التظليل يجب أن يعمل مع خصائص السطح "المادية". هناك عدة طرق لوصف PBR. النموذج الأكثر شيوعًا هو نموذج الصلابة المعدنية ، والذي يتم استخدامه افتراضيًا في GLTF. يمكنك أيضًا استخدام نموذج براق لامع ، ولكن فقط مع امتداد منفصل (extenstion). السمات الرئيسية للمادة هي كما يلي:


  1. الاسم هو اسم الشبكة.
  2. baseColorFactor / baseColorTexture - يخزن معلومات اللون. في حالة سمة Factor ، يتم تخزين المعلومات في قيمة عددية لـ RGBA ، في حالة Texture ، يتم تخزين الارتباط إلى النسيج في كائن textures.
  3. metallicFactor - مخازن المعلومات المعدنية
  4. roughnessFactor - يخزن معلومات حول الخشونة
  5. doubleSided - صواب أو خطأ (القيمة الافتراضية) ويشير إلى ما إذا كان سيتم تقديم الشبكة على كلا الجانبين أم فقط على الجانب "الأمامي".
    "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0, "roughnessFactor": 0.800000011920929 }, "name": "Nightshade_MAT", "doubleSided": true } ], 

معدني أو معنى "معدني". توضح هذه المعلمة مدى تشابه انعكاسها بشدة مع المعدن الحقيقي ، أي مقدار الضوء ينعكس من السطح. يتم قياس القيمة من 0 إلى 1 ، حيث 0 عبارة عن عازل و 1 معدن نقي.


خشونة أو "خشونة". تعرض هذه السمة مدى "خشونة" السطح ، مما يؤثر على تشتت الضوء من السطح. يقاس من 0 إلى 1 ، حيث 0 مسطح تمامًا و 1 هو سطح خشن تمامًا لا يعكس سوى كمية صغيرة من الضوء.


نسيج - كائن يخزن خرائط نسيج (خرائط نسيج). هذه البطاقات تعطي نموذجا واقعيا. بفضلهم ، يمكنك تعيين مظهر النموذج ، وإعطاء خصائص مختلفة مثل المعدن ، الخشونة ، التعتيم الطبيعي من البيئة وحتى خصائص التوهج. يتم وصف الأنسجة من خلال ثلاثة صفائف عالية المستوى: القوام ، وأخذ العينات ، والصور. يستخدم الكائن Textures فهارس للإشارة إلى مثيلات العينات ومثيلات الصورة. الشيء الأكثر أهمية هو الصورة ، لأن هو الذي يخزن معلومات الموقع من الخريطة. في القوام ، يتم وصفه بواسطة مصدر الكلمة. قد توجد الصورة في مكان ما على القرص الصلب (على سبيل المثال ، "uri": "duckCM.png") أو مشفرة في GLTF ("bufferView": 14 ، "mimeType": "image / jpeg"). العينات هي كائن يحدد عوامل التصفية والتفاف المتوافقة مع أنواع GL.


في مثال المثلث الخاص بنا ، لا توجد مواد ، لكنني سأقدم JSON من طرز أخرى عملت معها. في هذا المثال ، تمت كتابة القوام إلى المخزن المؤقت ، بحيث تتم قراءتها أيضًا من المخزن المؤقت باستخدام BufferView:


 "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "bufferView": 1, "mimeType": "image/jpeg" } ], 

الرسوم المتحركة


يدعم GLTF الرسوم المتحركة المستهدفة ، ذات اللون الباهت ، والتحول باستخدام إطارات المفاتيح. يتم تخزين المعلومات من هذه الإطارات في المخازن المؤقتة ويشير إلى الرسوم المتحركة باستخدام الملحقات. يحدد GLTF 2.0 متجر الرسوم المتحركة فقط ، لذلك لا يحدد أي سلوك وقت تشغيل محدد ، مثل ترتيب التشغيل ، التشغيل التلقائي ، الحلقات ، عرض الخط الزمني ، إلخ. يتم تخزين جميع الرسوم المتحركة في صفيف الرسوم المتحركة ويتم تعريفها كمجموعة القنوات (سمة القناة) ، بالإضافة إلى مجموعة من العينات التي تم تحديدها بواسطة أدوات الوصول التي تقوم بمعالجة معلومات حول إطارات المفاتيح وطريقة الاستيفاء (نماذج السمة)


السمات الرئيسية لكائن الرسوم المتحركة هي كما يلي:


  1. الاسم - اسم الرسوم المتحركة (إن وجدت)
  2. قناة - صفيف يربط قيم مخرجات الإطارات المفتاحية للرسوم المتحركة بعقدة محددة في التسلسل الهرمي.
  3. sampler هي سمة تشير إلى Accessor ، الذي يعالج الإطارات الرئيسية من المخزن المؤقت.
  4. الهدف هو كائن يحدد أي عقدة (كائن عقدة) يجب تحريكها باستخدام سمة العقدة وأيضًا خاصية العقدة التي يجب تحريكها باستخدام سمة المسار - الترجمة ، التدوير ، المقياس ، الأوزان ، إلخ. تحتفظ السمات غير المتحركة بقيمها أثناء الرسوم المتحركة. إذا لم يتم تحديد العقدة ، فيجب حذف سمة القناة.
  5. العينات - تحدد أزواج المدخلات والمخرجات: مجموعة من قيم الفاصلة العائمة العددية التي تمثل الوقت الخطي بالثواني. يتم تخزين جميع القيم (الإدخال / الإخراج) في المخزن المؤقت ويمكن الوصول إليها من خلال الملحقات. تخزن سمة الاستيفاء قيمة الاستيفاء بين المفاتيح.

لا توجد رسوم متحركة في أبسط GLTF. مثال مأخوذ من ملف آخر:


 "animations": [ { "name": "Animate all properties of one node with different samplers", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "rotation" } }, { "sampler": 1, "target": { "node": 1, "path": "scale" } }, { "sampler": 2, "target": { "node": 1, "path": "translation" } } ], "samplers": [ { "input": 4, "interpolation": "LINEAR", "output": 5 }, { "input": 4, "interpolation": "LINEAR", "output": 6 }, { "input": 4, "interpolation": "LINEAR", "output": 7 } ] }, 

بشرة


يتم تخزين المعلومات السلخ ، المعروف أيضا باسم السلخ ، ويعرف أيضا باسم الرسوم المتحركة العظام ، في مجموعة الجلود. يتم تعريف كل سطح باستخدام سمة inverseBindMatrices ، والتي تشير إلى الملحق مع بيانات IBM (مصفوفة الربط العكسي). يتم استخدام هذه البيانات لنقل الإحداثيات إلى نفس المساحة مثل كل مفصل ، وكذلك سمة صفيف المفاصل ، التي تسرد مؤشرات العقدة المستخدمة كمفاصل للرسوم المتحركة للجلد. يتم تحديد ترتيب الاتصالات في صفيف skin.joints ويجب أن يتطابق مع ترتيب بيانات inverseBindMatrices. تشير السمة skeleton إلى كائن Node يمثل الجذر المشترك لتسلسل هرمي المفاصل أو العقدة الأصل المباشرة أو غير المباشرة لجذر عام.


مثال على استخدام كائن الجلد (ليس في مثال المثلث):


  "skins": [ { "name": "skin_0", "inverseBindMatrices": 0, "joints": [ 1, 2 ], "skeleton": 1 } ] 

السمات الرئيسية:


  1. اسم - اسم السلخ
  2. inverseBindMatrices - يشير إلى رقم الوصول الذي يخزن معلومات حول مصفوفة الربط العكسي
  3. المفاصل - يشير إلى عدد الملحق الذي يخزن معلومات حول المفاصل
  4. هيكل عظمي - يشير إلى عدد الموصل الذي قام بتخزين معلومات حول "الجذر"
    مفصل / مفصل يبدأ بهيكل النموذج

كاميرا


تحدد الكاميرا مصفوفة الإسقاط التي يتم الحصول عليها عن طريق تحويل "العرض" إلى إحداثيات المقطع. إذا كان الأمر أكثر بساطة ، فإن الكاميرات تحدد المظهر المرئي (زاوية العرض ، اتجاه "المظهر" ، إلخ) الذي يراه المستخدم عند تحميل النموذج.


يمكن أن يكون الإسقاط "منظور" و "متعامد". وترد الكاميرات في العقد ويمكن أن يكون لها التحولات. يتم إصلاح الكاميرات في كائنات العقدة ، وبالتالي يمكن أن يكون لها تحويلات. يتم تعريف الكاميرا بحيث يتم توجيه محور + X المحلي إلى اليمين ، وتبحث العدسة في اتجاه المحور - Z المحلي ، ويتم محاذاة الجزء العلوي من الكاميرا مع محور + Y المحلي. إذا لم يتم تحديد التحول ، فإن الكاميرا في الأصل. يتم تخزين الكاميرات في مجموعة الكاميرات. يعرّف كل منهم سمة الكتابة التي تحدد نوعًا من الإسقاط (منظور أو متعامد) ، بالإضافة إلى سمات مثل المنظور أو الهجاء ، التي تخزن بالفعل معلومات أكثر تفصيلاً. اعتمادًا على وجود السمة zfar ، قد تستخدم الكاميرات ذات نوع المنظور إسقاطًا محدودًا أو غير محدود.


مثال الكاميرا في JSON مع منظور نوع. غير مناسب للحصول على مثال عن الحد الأدنى الصحيح لملف GLTF (مثلث):


 "cameras": [ { "name": "Infinite perspective camera", "type": "perspective", "perspective": { "aspectRatio": 1.5, "yfov": 0.660593, "znear": 0.01 } } ] 

السمات الرئيسية لكائن الكاميرا:


  1. اسم - اسم السلخ
  2. النوع - نوع الكاميرا أو المنظور أو الهجاء.
  3. المنظور / الإملائي - السمة التي تحتوي على تفاصيل قيمة النوع المقابل
  4. sideRatio - نسبة العرض إلى الارتفاع (fov).
  5. yfov - مجال الرؤية الرأسية (fov) في راديان
  6. zfar - المسافة إلى طائرة القطع البعيدة
  7. znear - المسافة إلى طائرة القطع القريبة
  8. إضافات - بيانات التطبيق محددة

الحد الأدنى صالح ملف GLTF


في بداية المقال ، كتبت أننا سنجمع الحد الأدنى من ملفات GLTF التي ستحتوي على مثلث واحد. JSON مخزنة ويمكن الاطلاع أدناه. فقط قم بنسخه إلى ملف نصي ، قم بتغيير تنسيق الملف إلى .gtlf. لعرض أصل ثلاثي الأبعاد في ملف ، يمكنك استخدام أي عارض يدعم GLTF ، لكنني شخصياً استخدم هذا


 { "scenes" : [ { "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0 } ], "meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ], "buffers" : [ { "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", "byteLength" : 44 } ], "bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 } ], "accessors" : [ { "bufferView" : 0, "byteOffset" : 0, "componentType" : 5123, "count" : 3, "type" : "SCALAR", "max" : [ 2 ], "min" : [ 0 ] }, { "bufferView" : 1, "byteOffset" : 0, "componentType" : 5126, "count" : 3, "type" : "VEC3", "max" : [ 1.0, 1.0, 0.0 ], "min" : [ 0.0, 0.0, 0.0 ] } ], "asset" : { "version" : "2.0" } } 

ما هي النتيجة؟


في الختام ، أود أن أشير إلى الشعبية المتزايدة لتنسيقات GLTF و GLB ، حيث أن العديد من الشركات تستخدمها بالفعل بنشاط ، وبعضها يعمل بالفعل بنشاط من أجل هذا. سهولة استخدامه على شبكة التواصل الاجتماعي Facebook (النشرات ثلاثية الأبعاد ، ومؤخراً ، الصور ثلاثية الأبعاد) ، والاستخدام النشط لـ GLB في Oculus Home ، فضلاً عن عدد من الابتكارات التي تم الإعلان عنها في GDC 2019 تساهم بشكل كبير في ترويج التنسيق. إن سهولة الاستخدام والترويج لمجموعة Khronos Group وتوحيد التنسيق هي المزايا الرئيسية ، التي أنا متأكد من أنها ستؤدي وظيفتها في نهاية المطاف في الترويج لها!

Source: https://habr.com/ru/post/ar448298/


All Articles