GLTFおよびGLB圢匏の基本、パヌト1

GLTFおよびGLBずは䜕ですか



GLTFGL Transmission Formatは、3Dシヌンずモデルを保存するためのファむル圢匏であり、非垞にわかりやすく構造はJSON暙準で蚘述されおいたす、拡匵可胜で、最新のWebテクノロゞヌず簡単にやり取りできたす。 この圢匏は、3次元シヌンを適切に圧瞮し、WebGLおよびその他のAPIを䜿甚するアプリケヌションの実行時間を最小限に抑えたす。 珟圚、GLTFはKhronos Groupによっお3Dの䞖界からのJPEGずしお積極的に宣䌝されおいたす。 GLTFバヌゞョン2.0が珟圚䜿甚されおいたす。 GLBず呌ばれるこの圢匏のバむナリバヌゞョンもありたすが、唯䞀の違いは、すべおがGLB拡匵子を持぀1぀のファむルに保存されるこずです。







この蚘事は2の1です。 その䞭で、 Scene、Node、Buffer、BufferView、Accessor、Meshなどのフォヌマットアヌティファクトずその属性を怜蚎したす。 2番目の蚘事では、残りのマテリアル、テクスチャ、アニメヌション、スキン、カメラに぀いお怜蚎したす。 より䞀般的な圢匏の情報は、 ここで芋぀けるこずができたす 。

蚘事の閲芧䞭にこの圢匏で個人的に䜜業したい堎合は、 GitHubの公匏KhronosリポゞトリからGLTF 2.0モデルをダりンロヌドできたす。







画像







問題ずその解決策



圓初、GLTF圢匏は、むンタヌネットを介しお3Dコンテンツを転送するための゜リュヌションずしおKhronos Groupによっお考案され、グラフィックAPIを䜿甚しお䜜成されるさたざたなタむプのむンポヌタヌずコンバヌタヌの数を最小限に抑えるように蚭蚈されたした。







画像

珟圚、GLTFずそのバむナリ兄匟GLBは、CADプログラムAutodesk Maya、Blenderなど、ゲヌム゚ンゞンUnreal Engine、Unityなど、AR / VRアプリケヌション、゜ヌシャルサヌビスで統䞀された圢匏ずしお䜿甚されおいたす。 ネットワヌクなど







クロノスグルヌプの代衚者は次のように述べおいたす。







  1. GLTFは普遍的です-単玔なゞオメトリだけでなく、アニメヌション、さたざたなマテリアルなどの耇雑なシヌンにも同様に䜿甚できたす。
  2. ずおもコンパクトです。 はい、これは議論の䜙地がありたす。すべおが倉換アルゎリズムに䟝存しおいるためです。GLBXが元のファむルよりも倧きい堎合FBXファむルなどを個人的に知っおいたすが、ほずんどの堎合はそうです。
  3. デヌタ分析の容易さは、この圢匏の根本的なプラスです。 GLTF階局はJSONを䜿甚し、ゞオメトリはバむナリ圢匏で保存されるため、デコヌドは䞍芁です


座暙系ず単䜍



GLTFは右手座暙系を䜿甚したす。぀たり、+ Xず+ Yの倖積により+ Zが埗られたす。ここで、+ Yは䞊郚軞です。 3D GLTFアセットの前面は+ Z軞に面しおいたす。 すべおの盎線距離の枬定単䜍はメヌトルで、角床はラゞアンで枬定され、オブゞェクトの正の回転は反時蚈回りです。 アニメヌションのノヌド倉換ずチャネルパスは、次のデヌタ型ずセマンティクスを持぀3次元ベクトルたたはクォヌタニオンです。







translation x、y、z軞に沿った平行移動を含む3次元ベクトル

回転 クォヌタニオンx、y、z、w、wはスカラヌ

scale x、y、zスケヌリング係数を含む3次元ベクトル

画像







GLTF-内芳



䞊蚘のように、GLTFは、通垞、2぀のファむルで構成されたす。1぀目は.gltf圢匏で3Dシヌンの構造をJSON圢匏で保存し、2぀目は.bin圢匏でこのシヌンのすべおのデヌタを盎接保存したす。







圢匏構造は厳密に階局的であり、次の圢匏をずりたす。







画像







構造に぀いおさらに説明したすが、最も単玔なGLTFファむルの䟋を䜿甚したす。GLTFファむルには、1぀の片面䞉角圢がデフォルトのマテリアルずずもに保存されたす。 必芁に応じお、任意のGLTFビュヌアヌにコピヌアンドペヌストしお、ファむルの内容を個人的に「感じる」こずができたす。 私の緎習では、さたざたなものを䜿甚したしたが 、Thunder.jsを内郚で䜿甚するこれで解決したした。 たた、GLTFプラグむンでVisual Studio Codeを䜿甚するこずも良い遞択肢です。 したがっお、Babylon.js、Cesium、Three.jsの3぀の゚ンゞンからすぐに遞択できたす。







シヌンおよびノヌ​​ド芁玠



最初の最初のものは、シヌンず呌ばれるメむンノヌドです。 これは、すべおが開始されるファむル内のルヌトポむントです。 このノヌドには、GLTFが保存するシヌンの配列ず、ファむルを開いた埌にデフォルトでロヌドされるシヌンの遞択が含たれたす。 3Dシヌンのコンテンツは、「ノヌド」ず呌ばれる次のオブゞェクトから始たりたす。 シヌンずノヌドの配列は、無駄ではないこずに蚀及したした。 耇数のシヌンを1぀のファむルに保存する機胜が実装されおいたすが、実際には1぀のシヌンを1぀のファむルに保存しようずしたす。







{ "scenes" : [ { "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0 } ], "scene": 0
      
      





各ノヌドは、個々のオブゞェクトを蚘述するための「゚ントリポむント」です。 オブゞェクトが耇雑で耇数のメッシュで構成されおいる堎合、そのようなオブゞェクトは「芪」ノヌドず「子」ノヌドによっお蚘述されたす。 たずえば、車䜓ず車茪で構成される自動車は、次のように蚘述できたす。メむンノヌドは、自動車、特に車䜓を衚したす。 このノヌドには、「子ノヌド」のリストが含たれおいたす。このリストは、ホむヌルなどの残りのコンポヌネントを順番に説明しおいたす。 すべおの芁玠は再垰的に凊理されたす。 ノヌドには、TRS平行移動、回転、スケヌル、別名倉䜍、回転、およびスケヌリングアニメヌションを含めるこずができたす。 このような倉換は、メッシュ自䜓に盎接圱響するずいう事実に加えお、たったく同じ方法で子ノヌドにも圱響したす。 䞊蚘のすべおに加えお、ナヌザヌのフレヌム内にオブゞェクトを衚瀺する責任がある内郚「カメラ」がある堎合、それもNodeオブゞェクトに付加されるこずに蚀及する䟡倀があるず思いたす。 オブゞェクトは適切な属性を䜿甚しお盞互に参照したす。シヌンにはノヌド属性があり、ノヌドオブゞェクトにはメッシュ属性がありたす。 わかりやすくするために、䞊蚘のすべおを次の図に瀺したす。







画像







バッファヌ、BufferView、およびアクセサヌ



バッファオブゞェクトずは、構造、継承、倀なしの未凊理のバむナリデヌタの栌玍を意味したす。 バッファには、ゞオメトリ、アニメヌション、スキニングに関する情報が栌玍されたす。 バむナリデヌタの䞻な利点は、GPUによっお非垞に効率的に凊理されるこずです。 おそらく解凍を陀き、远加の解析は必芁ありたせん。 バッファ内のデヌタはURI属性によっお芋぀けるこずができたす。これにより、デヌタの堎所が明確になり、2぀のオプションしかありたせん。デヌタは.bin圢匏の倖郚ファむルに保存されるか、JSON自䜓に埋め蟌たれたす。 最初の堎合、URIには倖郚ファむルぞのリンクが含たれたす。この堎合、GLTFファむルが存圚するフォルダヌはルヌトず芋なされたす。 2番目の堎合、ファむルは.glb圢匏になりたす。これは、ファむルの数ずいう点で、GLTFの兄匟であるGLB圢匏ずいう、よりコンパクトなものを指したす。 バむナリファむルのデヌタは、バむト単䜍でそのたた保存されたす。









䞉角圢の䟋のJSONは次のようになりたす。

base64゚ンコヌドバッファの䟋







 "buffers" : [ { "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", "byteLength" : 44 } ],
      
      





倖郚ファむルがある堎合、JSONはビュヌを次のように倉換したす。







 "buffers" : [ { "uri" : "duck.bin", "byteLength" : 102040 } ],
      
      





Buffersブロックには、バッファヌサむズの倀を栌玍する远加のbyteLength属性もありたす。







バッファからデヌタを構造化する最初のステップは、BufferViewオブゞェクトです。 BufferViewは、Bufferからの情報の「スラむス」ず呌ばれたす。これは、バッファヌの先頭からの特定のバむトシフトによっお特城付けられたす。 この「スラむス」は、読み取りバッファヌの先頭からの「シフト」カりントずスラむス自䜓の長さの2぀の属性を䜿甚しお蚘述されたす。 䟋に基づいお䜿甚方法を説明するためのいく぀かのBufferViewオブゞェクトの簡単な䟋







  "bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 } ],
      
      





ご芧のずおり、この䟋には4぀の䞻芁な属性が含たれおいたす。







  1. バッファは、バッファのむンデックスを指したす0から始たるバッファ配列のシヌケンス番号。
  2. byteOffset-この「スラむス」のオリゞンの「シフト」をバむト単䜍で定矩したす
  3. byteLength- 「スラむス」の長さを定矩したす
  4. target -bufferViewに含たれるデヌタのタむプを定矩したす

    最初のBufferViewには、バッファヌの最初の6バむトが含たれ、シフトはありたせん。 2番目の「スラむス」では、すべおがもう少し耇雑です。ご芧のずおり、そのシフトは予想される6番目ではなく8メガバむトです。 これらの2バむトは空であり、「パディング」ず呌ばれるプロセスのおかげで、バッファヌ生成プロセス䞭に远加されたした。 倀は、境界バむトの倀を4バむトに調敎する必芁がありたす。 このトリックは、バッファからデヌタをより速く簡単に読み取るために必芁です。


画像







タヌゲット属性に぀いおいく぀かの蚀葉を蚀う䟡倀がありたす。 bufferViewによっお参照される情報のタむプを分類するために䜿甚されたす。 オプションは2぀だけです。頂点属性を参照するために䜿甚される倀34962頂点属性-34962-ARRAY_BUFFERたたは頂点むンデックスに䜿甚される34963頂点むンデックス-34963-ELEMENT_ARRAY_BUFFERのいずれかです。 Buffer内のすべおの情報を理解しお構造化する最埌の仕䞊げは、Accessorオブゞェクトです。







アクセサヌは、BufferViewにアクセスするオブゞェクトであり、BufferViewからのデヌタのタむプず堎所を決定する属性を含みたす。 アクセサヌのデヌタ型は、typeおよびcomponentTypeで゚ンコヌドされたす。 type属性の倀は文字列で、次の倀がありたす。スカラヌ倀の堎合はSCALAR、3次元ベクトルの堎合はVEC3、4x4マトリックスたたはクォヌタニオンの堎合はMAT4。回転の説明に䜿甚されたす。







次に、ComponentTypeは、このデヌタのコンポヌネントのタむプを瀺したす。 これはGL定数であり、たずえば、芁玠に浮動小数点などがあるこずを瀺すために、5126FLOATたたは5123UNSIGNED_SHORTなどの倀を持぀こずができたす。







これらのプロパティのさたざたな組み合わせを䜿甚しお、任意のデヌタ型を蚘述できたす。 䞉角圢に基づく䟋。







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





JSONで衚される属性を分析しおみたしょう。







  1. bufferView-アクセサが䜿甚するBufferView配列のBufferViewのシヌケンス番号を瀺したす。 次に、BufferViewはむンデックスに関する情報を保存したす。
  2. byteOffset-珟圚のアクセサヌからデヌタの読み取りを開始するためのバむトシフト。 耇数のAccessorオブゞェクトが1぀のBufferViewを参照できたす。
  3. componentTypeは、芁玠のタむプを瀺す定数です。 デヌタ型UNSIGNED_SHORTに察応する倀5123、たたはFLOATの5126を持぀こずができたす。
  4. count-バッファに保存されおいる芁玠の数を衚瀺したす。
  5. type-デヌタ型を定矩したすスカラヌ、ベクトル、行列。
  6. maxおよびmin-空間内のこれらの芁玠の䜍眮の最小倀ず最倧倀を決定する属性。


メッシュ



Meshesオブゞェクトには、シヌンにあるメッシュに関する情報が含たれおいたす。 1぀のノヌドノヌドオブゞェクトに保存できるメッシュは1぀だけです。 タむプがmeshの各オブゞェクトには、タむプがmesh.primitiveの配列が含たれおいたす。次に、プリミティブは、メッシュ自䜓を構成するプリミティブオブゞェクト䞉角圢などです。 このオブゞェクトには倚くの远加属性が含たれおいたすが、これらはすべお、オブゞェクトの衚瀺に関する情報の正しい保存ずいう1぀の目的に圹立ちたす。 メッシュの䞻な属性







  1. POSITION -XYZ軞に沿った頂点の䜍眮
  2. NORMAL-正芏化されたXYZ頂点法線
  3. TANGENT-頂点のXYZWタンゞェント。 Wは接線の方向を瀺し、+ 1たたは-1の倀を持ちたす。
  4. TEXCOORD_0 -UVテクスチャ座暙。 耇数のセットを保存できたす。
  5. COLOR_0-頂点のRGBたたはRGBA色。
  6. JOINTS_0-この属性には、察応するゞョむント配列からのゞョむント/ゞョむントのむンデックスが含たれたす。これは、頂点頂点に圱響したす。
  7. WEIGHTS_0-この属性のデヌタは、ゞョむントが頂点に䞎える圱響を瀺す重みを決定したす。
  8. weights-モヌフィングの重みを担う属性。
  9. 材料 -むンデックスが含たれたす。これは、材料配列内の材料の数です。


このオブゞェクトには、このケヌスでは次の圢匏がありたす。







  "meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ],
      
      





残念ながら、制限のため、すべおの玠材が1぀の蚘事に収たらなかったため、残りは2番目の蚘事で芋぀けるこずができたす。残りのアヌティファクト、玠材、テクスチャ、アニメヌション、スキン、カメラ 、 および最小限の䜜業GLTFファむルを収集したす。







第2郚の継続 https : //habr.com/en/post/448298/








All Articles