GLTF dan Dasar-Dasar GLB, Bagian 2

Artikel ini merupakan kelanjutan dari dasar-dasar format GLTF dan GLB. Anda dapat menemukan bagian pertama artikel di sini . Pada bagian pertama, kami memeriksa dengan Anda mengapa format awalnya direncanakan, serta artefak tersebut dan atribut mereka dari format GLTF sebagai Scene, Node, Buffer, BufferView, Accessor dan Mesh. Pada artikel ini, kami akan mempertimbangkan Materi, Tekstur, Animasi, Kulit, Kamera, dan juga selesai membuat file GLTF minimal yang valid.


gambar

Bahan dan Tekstur


Bahan dan tekstur terkait erat dengan mesh. Jika perlu, jala dapat dianimasikan. Bahan menyimpan informasi tentang bagaimana model akan diberikan oleh mesin. GLTF mendefinisikan bahan menggunakan seperangkat parameter umum yang didasarkan pada Rendering Berbasis Fisik (PBR). Model PBR memungkinkan Anda untuk membuat tampilan "benar secara fisik" dari objek dalam kondisi pencahayaan yang berbeda karena fakta bahwa model naungan harus bekerja dengan properti permukaan "fisik". Ada beberapa cara untuk menggambarkan PBR. Model yang paling umum adalah model metalik-kekasaran, yang digunakan secara default di GLTF. Anda juga dapat menggunakan model specular-glosiness, tetapi hanya dengan ekstensi terpisah (extenstion). Atribut utama dari materi adalah sebagai berikut:


  1. nama adalah nama jala.
  2. baseColorFactor / baseColorTexture - menyimpan informasi warna. Dalam kasus atribut Factor, informasi disimpan dalam nilai numerik untuk RGBA, dalam kasus Tekstur, referensi tekstur disimpan dalam objek tekstur.
  3. metallicFactor - menyimpan informasi Logam
  4. roughnessFactor - menyimpan informasi tentang Kekasaran
  5. doubleSided - true atau false (nilai default) dan menunjukkan apakah mesh akan diberikan di kedua sisi atau hanya di sisi "depan".
    "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0, "roughnessFactor": 0.800000011920929 }, "name": "Nightshade_MAT", "doubleSided": true } ], 

Metalik atau arti "logam". Parameter ini menjelaskan seberapa kuat mencerminkannya mirip dengan logam asli, mis. berapa banyak cahaya yang dipantulkan dari permukaan. Nilai diukur dari 0 hingga 1, di mana 0 adalah dielektrik dan 1 adalah logam murni.


Kekasaran atau "kekasaran". Atribut ini menampilkan seberapa "kasar" permukaannya, sehingga memengaruhi hamburan cahaya dari permukaan. Diukur dari 0 hingga 1, di mana 0 benar-benar rata dan 1 adalah permukaan yang sepenuhnya kasar yang hanya memantulkan sedikit cahaya.


Tekstur - objek yang menyimpan peta tekstur (Peta tekstur). Kartu semacam itu memberikan model yang realistis. Berkat mereka, Anda dapat menentukan tampilan model, untuk memberikan berbagai sifat seperti logam, kekasaran, peredupan alami dari lingkungan dan bahkan sifat-sifat cahaya. Tekstur dijelaskan oleh tiga array tingkat tinggi: tekstur, sampler, gambar. Objek Tekstur menggunakan indeks untuk referensi sampler dan contoh gambar. Objek yang paling penting adalah gambar, karena Dialah yang menyimpan informasi lokasi peta. Dalam tekstur, dijelaskan oleh sumber kata. Gambar mungkin terletak di suatu tempat di hard drive (misalnya, "uri": "duckCM.png") atau disandikan dalam GLTF ("bufferView": 14, "mimeType": "image / jpeg"). Samplers adalah objek yang mendefinisikan parameter filter dan pembungkus yang sesuai dengan tipe GL.


Dalam contoh segitiga kami, tidak ada tekstur, tetapi saya akan memberikan JSON dari model lain yang saya gunakan. Dalam contoh ini, tekstur ditulis ke buffer, sehingga mereka juga dibaca dari buffer menggunakan BufferView:


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

Animasi


GLTF mendukung animasi target yang diartikulasikan, dikuliti, dan diubah menggunakan bingkai kunci. Informasi dari frame ini disimpan dalam buffer dan mengacu pada animasi menggunakan pengakses. GLTF 2.0 hanya mendefinisikan toko animasi, sehingga tidak mendefinisikan perilaku runtime tertentu, seperti urutan pemutaran, pemutaran otomatis, loop, tampilan timeline, dll. Semua animasi disimpan dalam array Animasi dan mereka didefinisikan sebagai satu set saluran (atribut saluran), serta seperangkat sampel yang ditentukan oleh pengakses yang memproses informasi tentang bingkai kunci dan metode interpolasi (atribut sampel)


Atribut utama dari objek Animasi adalah sebagai berikut:


  1. nama - nama animasi (jika ada)
  2. channel - larik yang menghubungkan nilai output keyframes dari animasi ke node tertentu dalam hierarki.
  3. sampler adalah atribut yang merujuk ke Accessor, yang memproses bingkai kunci dari buffer.
  4. target adalah objek yang menentukan node (objek Node) mana yang perlu dianimasikan menggunakan atribut node, dan juga properti mana dari node yang harus dianimasikan menggunakan atribut path - terjemahan, rotasi, skala, bobot, dll. Atribut non-animasi mempertahankan nilainya selama animasi. Jika simpul tidak ditentukan, maka atribut saluran harus dihilangkan.
  5. samplers - mendefinisikan pasangan input dan output: satu set nilai titik-mengambang skalar yang mewakili waktu linier dalam detik. Semua nilai (input / output) disimpan dalam buffer dan dapat diakses melalui accessor. Atribut interpolasi menyimpan nilai interpolasi antar kunci.

Tidak ada animasi di GLTF yang paling sederhana. Contoh diambil dari file lain:


 "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 } ] }, 

Kulit


Informasi Skinning, juga dikenal sebagai skinning, alias animasi tulang, disimpan dalam array skins. Setiap skin didefinisikan menggunakan atribut inverseBindMatrices, yang merujuk pada accessor dengan data IBM (inverse bind matrix). Data ini digunakan untuk mentransfer koordinat ke ruang yang sama dengan setiap sambungan, serta atribut array sambungan, yang mencantumkan indeks node yang digunakan sebagai sambungan untuk animasi kulit. Urutan koneksi ditentukan dalam array skin.joints dan harus cocok dengan urutan data inverseBindMatrices. Atribut skeleton menunjuk ke objek Node yang merupakan akar umum dari hierarki sendi, atau simpul induk langsung atau tidak langsung dari akar yang sama.


Contoh menggunakan objek kulit (bukan dalam contoh segitiga):


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

Atribut utama:


  1. nama - nama menguliti
  2. inverseBindMatrices - menunjukkan nomor accessor yang menyimpan informasi tentang Invers Bind Matrix
  3. sambungan - menunjukkan jumlah pengakses atau menyimpan informasi tentang sambungan
  4. kerangka - menunjukkan jumlah pengakses yang menyimpan informasi tentang "root"
    sambungan / sambungan dengan mana kerangka model dimulai

Kamera


Kamera menentukan matriks proyeksi, yang diperoleh dengan mengubah "tampilan" menjadi koordinat klip. Jika lebih sederhana, kamera menentukan tampilan visual (sudut pandang, arah "tampilan", dll.) Yang dilihat pengguna saat memuat model.


Proyeksi dapat โ€œPerspektifโ€ dan โ€œOrthogonalโ€. Kamera terkandung dalam node dan dapat memiliki transformasi. Kamera diperbaiki dalam objek Node dan, dengan demikian, dapat memiliki transformasi. Kamera ditentukan sehingga sumbu + X lokal diarahkan ke kanan, lensa terlihat ke arah sumbu -Z lokal, dan bagian atas kamera sejajar dengan sumbu + Y lokal. Jika transformasi tidak ditentukan, maka kamera berada di tempat asal. Kamera disimpan dalam susunan kamera. Masing-masing dari mereka mendefinisikan tipe atribut yang menetapkan jenis proyeksi (perspektif atau ortogonal), serta atribut seperti perspektif atau ortografis, yang sudah menyimpan informasi lebih rinci. Tergantung pada keberadaan atribut zfar, kamera dengan tipe perspektif dapat menggunakan proyeksi terbatas atau tak terbatas.


Contoh kamera dalam JSON dengan perspektif tipe. Tidak relevan untuk contoh file GLTF minimal yang benar (segitiga):


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

Atribut utama dari objek Kamera:


  1. nama - nama menguliti
  2. jenis - jenis kamera, perspektif atau ortografi.
  3. perspektif / ortografis - atribut yang berisi perincian nilai jenis yang sesuai
  4. aspectRatio - Rasio aspek (fov).
  5. yfov - sudut pandang bidang vertikal (fov) dalam radian
  6. zfar - jarak ke pesawat kliping jauh
  7. znear - jarak ke pesawat kliping dekat
  8. ekstra - data spesifik aplikasi

File GLTF Minimum yang Valid


Di awal artikel, saya menulis bahwa kami akan mengumpulkan file GLTF minimal yang akan berisi 1 segitiga. Buffered JSON dapat ditemukan di bawah. Cukup salin ke file teks, ubah format file ke .gtlf. Untuk melihat aset 3D dalam file, Anda dapat menggunakan penampil apa pun yang mendukung GLTF, tetapi saya pribadi menggunakan ini


 { "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" } } 

Apa hasilnya?


Sebagai kesimpulan, saya ingin mencatat semakin populernya format GLTF dan GLB, banyak perusahaan sudah secara aktif menggunakannya, dan beberapa sudah secara aktif berjuang untuk ini. Kemudahan penggunaannya di jejaring sosial Facebook (pos 3D dan, baru-baru ini, Foto 3D), penggunaan aktif GLB di Oculus Home, serta sejumlah inovasi yang diumumkan di GDC 2019 berkontribusi besar pada popularisasi format. Ringan, kecepatan rendering yang cepat, kemudahan penggunaan, promosi Grup Khronos dan standardisasi format adalah keuntungan utama, yang, saya yakin, pada akhirnya akan melakukan pekerjaan mereka dalam mempromosikannya lebih lanjut!

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


All Articles