GLBファイルとは?モダンな3Dモデルフォーマット
GLBファイル:手短に言うと
GLBファイルは、配信用にパッケージ化された3Dモデルです。これは3Dシーンとモデルのためのバイナリコンテナフォーマットで、Khronos GroupによってglTF 2.0仕様の一部として定義されました。名前はGL Transmission Format Binaryの略で、この「バイナリ」という部分が、兄弟分であるGLTFとの大きな違いを生んでいます。 標準の.gltfファイルが、テクスチャやジオメトリといった外部アセットを指し示す、人間が読めるJSONテキストファイルであるのに対し、.glbファイルはすべてを一つの整然としたパッケージにまとめます。JSON記述子、バイナリジオメトリ、埋め込みテクスチャがすべて、自己完結型のファイルに収められています。この単一ファイル設計こそ、GLBがウェブ、ARアプリ、そして最新のゲームエンジンで3Dコンテンツを配信するための標準となった理由です。 サイズの観点から見ると、中程度の複雑さを持つPBRテクスチャ付きの製品モデルは、GLBで約4〜8MBになります。同等のOBJ + MTL + PNGのセットは、十数個のファイルにまたがり、合計で15MB以上になることも珍しくなく、転送中にすべてのファイルが無傷で届く保証もありません。 Khronosは2017年6月にglTF 2.0仕様を公開し、業界全体でのサポートが急速に進みました。今日、GLBは重要なプラットフォームのほぼすべてでネイティブにサポートされています。Windows 11の3Dビューアー、Appleのクイックルック、Googleのmodel-viewer、Babylon.js、Three.js、Unity、Unreal Engine、Blenderなど、数え上げればきりがありません。GLBは「3D界のJPEG」になったのです。あらゆるワークフローで完璧というわけではないかもしれませんが、普遍的に読み取れるフォーマットなのです。
GLBファイルの内部構造
GLBの強みや、時折発生する変換の癖を理解するには、その構造を見る必要があります。非常にシンプルかつ巧妙な構造をしています。 すべてのGLBファイルは、3つの情報を含む12バイトのヘッダーで始まります。ASCIIで「glTF」と読める「マジック」ナンバー(0x46546C67)、バージョン番号(現在は2)、そしてファイル全体の長さをバイト単位で示したものです。このヘッダーの後、ファイルは1つ以上のチャンクに分かれています。 チャンク0は常にJSONチャンクです。これは3Dシーンの設計図であり、シーングラフ(ノード、メッシュ、マテリアル、カメラ、アニメーション、スキン)がすべてglTFのスキーマで記述されています。 チャンク1はバイナリバッファです。ここには重いデータ、つまり頂点位置、法線、UV座標、ボーンウェイト、アニメーションのキーフレームといった生のジオメトリデータが格納されます。すべてがバイナリブロブとして可能な限り密に詰め込まれています。テクスチャもこのチャンクにPNGやJPEGデータとして埋め込むことができ、JSONの設計図から参照されます。 このアーキテクチャのおかげで、正しく形成されたGLBは常に完全な状態です。誰かからGLBファイルを受け取って開くことができれば、すべてのデータが揃っていると確信できます。見つからないテクスチャファイルを探したり、壊れた相対パスを修正したりする必要はもうありません。これは古いフォーマットからの大きな進歩です。現在のGLB仕様では、バイナリバッファチャンクは1つしかサポートされていません。多くのテクスチャを持つ複雑なシーンでは、これが1つの大きなブロブとなり、3D Tilesのようなプログレッシブストリーミングに特化したフォーマットに比べて効率が落ちる可能性があります。
GLB vs GLTF vs 他の3Dフォーマット
3Dフォーマットの世界は実に多様です。GLBが、皆さんが遭遇する可能性の高い他のフォーマットとどう違うのかを見ていきましょう。 **GLTF (.gltf):** これは同じglTF仕様を使ったテキストベースのバージョンです。シーン記述子を手動で編集する必要がある場合や、パイプラインがテクスチャとジオメトリを別々に処理する場合に使用します。それ以外のすべての用途、特に配信目的では、移植性の高いGLBを使いましょう。 **FBX (.fbx):** Autodeskのプロプライエタリなフォーマットで、長年ゲーム制作のパイプラインで支配的な地位を占めてきました。FBXは強力で、複雑なリグ、ブレンドシェイプ、マルチテイクアニメーションをうまく扱えます。しかし、公開された仕様のないクローズドなバイナリフォーマットであるため、ソフトウェアのバージョン間で頭を抱えるほどの互換性の問題が発生します。GLBはオープンでモダンな代替手段です。アニメーションのサポートはしっかりしていますが、AAAゲームで見られるような最も複雑なキャラクターリグに関しては、FBXほどの実績はありません。 **OBJ (.obj):** 1990年代初頭にまで遡る、真のベテランです。OBJはシンプルで、静的なジオメトリと基本的なマテリアルしか保存できません。アニメーションも、最新のPBRマテリアルも、シーン階層もありません。単純なメッシュ交換には十分ですが、ウェブ配信の分野では完全にGLBに取って代わられました。 **USD / USDZ (.usdz):** PixarのUniversal Scene Descriptionを基に構築された、Appleが推奨するARフォーマットです。USDZは、USDファイルとテクスチャを含むZIPアーカイブです。Appleのエコシステム内では素晴らしい働きをしますが、それ以外でのサポートは限定的です。ほとんどのARワークフローでは、結局GLB(Android/ウェブ用)とUSDZ(iOS用)の両方を作成することになります。 **STL (.stl):** このフォーマットは3Dプリンティング専用です。色もテクスチャもない、生の三角形ジオメトリのみを保存します。いかなる種類のビジュアルレンダリングにおいても、GLBの競合相手ではありません。 ウェブ上のあらゆるもの、例えば製品コンフィギュレーター、EコマースのAR、WebXR体験などでは、GLBをデフォルトの選択肢とすべきです。まさに、そのための最適なツールなのです。
GLBファイルが実際に使われる場面
では、実際にGLBファイルはどこで使われているのでしょうか?今やウェブ上やARにおける3Dのバックボーンとなっています。 **Eコマースの製品ビジュアライゼーション:** Shopifyは、3D/AR製品メディアにネイティブでGLBをサポートし、この分野の大きな起爆剤となりました。マーチャントが単一のGLBをアップロードするだけで、残りはShopifyが処理し、デスクトップではmodel-viewer経由で配信し、iOSのARクイックルック用にはオンザフライでUSDZに変換してくれます。重要なのはサイズです。15MB未満がルールですが、モバイルでの高速な読み込みのためには4MB未満が目標です。テクスチャは最大でも2048×2048ピクセルにすべきです。 **WebXRとブラウザベースの3D:** Three.jsやBabylon.jsのようなフレームワークは、GLBを第一級市民として扱います。Three.jsでGLBを読み込むのは、ほんの数行のコードで済みます。このフォーマットはPBRマテリアル(メタルネス/ラフネス)を標準でサポートしているため、カスタムシェーダーを書かなくてもリアルなライティングが実現できます。 **ゲームエンジン:** UnityとUnreal Engine 5はどちらもGLBを採用しています。UnityではGLTF Fastのようなパッケージ経由でインポートし、UnrealのDatasmithパイプラインには現在、ネイティブのGLBインポートが含まれています。Godot 4はさらに一歩進んで、GLTF/GLBを主要なシーン交換フォーマットとして採用しました。 **デジタルツインと産業ビジュアライゼーション:** Autodesk TandemやBentley iTwinのようなプラットフォームでは、巨大な建物やインフラのモデルをプラグインなしでブラウザに配信するためにGLBが使われています。IFCのようなフォーマットから変換されたビル全体のフロアプランが、どんなデバイスでも閲覧可能になります。 **ARアプリ:** Androidでは、GoogleのScene ViewerをGLBファイルを指すURLで直接起動できます。AppleのReality ComposerもGLBを受け入れるため、クロスプラットフォームのソースフォーマットとして有効です。 GLBが主役でない唯一の場所は、ハイエンドの映画VFXです。そこでは、サブディビジョンサーフェス、ボリューム、複雑な合成データをより深くサポートするUSD、Alembic、OpenEXRといったフォーマットが依然として必要とされています。
CocoConvertを使ったGLBとの相互変換
CocoConvertは、最も一般的なGLB変換をシンプルにします。Blenderをインストールしたり、Pythonスクリプトを実行したりすることなく、ブラウザ上で直接変換できます。 **GLTFからGLBへの変換:** これが最も簡単な方法です。.gltfファイル、その.binファイル、そしてすべてのテクスチャを一度にアップロードしてください。CocoConvertはそれらを一つのクリーンな.glbファイルにパッケージ化し、マテリアル、アニメーション、シーン階層を完璧に保持します。 **OBJからGLBへの変換:** .objと.mtlファイルを一緒にアップロードします。CocoConvertはマテリアル定義を読み取り、glTFのPBRモデルにマッピングします。単純なディフューズカラーやテクスチャはきれいに変換されます。注意点として、古いOBJファイルのスペキュラが強いマテリアルは、最新のメタルネス/ラフネスモデルにうまく変換されないことがよくあります。思ったより光沢が強すぎたり、逆に平坦になったりするかもしれません。本番用の作業では、インポート後にBlenderのプリンシプルBSDFシェーダーでマテリアルを手動で調整する方が良い結果が得られます。 **FBXからGLBへの変換:** これは厄介な場合があります。FBXの互換性と格闘したことのある人なら、その苦労はご存知でしょう。私たちのコンバーターは多くのファイルで機能しますが、ブレンドシェイプやAutodesk独自の拡張機能を持つ複雑なキャラクターリグは、完全には変換されない可能性があります。FBXに複数のアニメーションテイクがある場合、CocoConvertは現在、デフォルトのものしかエクスポートしません。確実なキャラクターアニメーションのためには、FBXをBlenderにインポートし、手動でGLBにエクスポートするのが最善策です。これにより、リグとアニメーションを完全に制御できます。 **GLBから他のフォーマットへの変換:** CocoConvertは、GLBをOBJ(静的ジオメトリと基本マテリアル)やSTL(ジオメトリのみ、3Dプリント用)に展開できます。また、GLBを展開されたGLTFテキストフォーマットに戻すことも可能です。GLBからFBXへの変換は現在サポートされていません。これは、両者のマテリアルとアニメーションのシステムが大きく異なるため、自動化ツールで一貫して正しく変換するのが非常に難しい、純粋に困難な問題なのです。 どんな変換でも、少し整理するだけで作業がずっと楽になります。テクスチャには分かりやすい名前を付け、ファイル名にスペースを使わないようにし、作業を始める前にソースモデルのジオメトリがきれいであることを確認してください。
ウェブパフォーマンスのためのGLBファイル最適化
3Dアプリから出力された美しいGLBファイルも、ウェブ用に最適化されていなければブラウザの動作を重くする可能性があります。配信用のファイルを準備するには、ジオメトリの複雑さ、テクスチャの圧縮、そしてファイル全体のサイズの3つの側面からアプローチする必要があります。 **ジオメトリ:** 目標は、可能な限り少ないポリゴンを使用することです。一般的なEコマースの製品モデルであれば、10万トライアングル未満を目指しましょう。コーヒーマグに50万ポリゴンは必要ありません。Blenderの「ポリゴン数削減(Decimate)」モディファイア(メッシュ > モディファイア > モディファイアを追加 > ポリゴン数削減)を使ってポリゴン数を削減します。「比率(Ratio)」を0.1から0.3の間に設定すると、通常の表示距離では見た目の品質をほとんど損なうことなく、トライアングル数を70~90%削減できることがよくあります。 **テクスチャ圧縮:** 標準的なGLBはテクスチャをJPEGやPNGとして埋め込みます。ウェブ用にはこれでは不十分です。Basis Universal圧縮(EXT_texture_basisu拡張機能経由)を使用したKTX2テクスチャを使うと、状況が一変します。GPU上のテクスチャメモリを4~8倍に削減でき、GPUが直接解凍するためCPUサイクルを節約できます。この作業にはglTF-transform CLIツールが不可欠です:`gltf-transform etc input.glb output.glb --slots "baseColor,normal"`。 **Dracoメッシュ圧縮:** このGoogleのアルゴリズム(KHR_draco_mesh_compression拡張機能経由で適用)は、ジオメトリデータを60~80%削減します。Three.jsとBabylon.jsの両方がこれをサポートしています。ここでもglTF-transformが役立ちます:`gltf-transform draco input.glb output.glb`。 **実践的な目標サイズ:** シンプルなモデルなら1MB未満、テクスチャ付きの詳細な製品なら1~5MB、複雑なシーンなら5~15MBを目指しましょう。15MBを超える場合は、シーンを分割するか、LOD(Level-of-Detail)メッシュの使用を検討する時期です。 CocoConvertはいくつかの基本的な最適化を適用しますが、本当にプロダクションレベルのパフォーマンスを求めるなら、glTF-transform CLIやGestaltorデスクトップエディタのようなツールによるきめ細かな制御が必要です。
特別なソフトなしでGLBファイルを開き、中身を確認する方法
GLBの最も良い点の一つは、中身を見るためだけに特別なソフトウェアをインストールする必要がほとんどないことです。 **Windows 11:** .glbファイルをダブルクリックするだけです。組み込みの3Dビューアーアプリで開き、モデルの回転、ズーム、確認ができます。Windows 10でも、Microsoft Storeから3Dビューアーアプリをインストールすれば同様のことが可能です。 **macOSとiOS:** GLBファイルはクイックルックで動作します。Finderでファイルを選択し、スペースバーを押してください。iPhoneやiPadでは、ファイルアプリやSafariでGLBをタップするとクイックルックで開き、ボタン一つでARを使って自分の部屋に配置できます。 **オンラインビューアー:** 公式のglTFサンプルビューアーである https://sandbox.babylonjs.com と、Don McCurdy氏の https://gltf.report は不可欠です。どちらも無料でブラウザ上で動作します。正直なところ、デバッグにはまずgltf.reportを試すべきです。ポリゴン数、テクスチャサイズ、ドローコール、検証エラーなど、詳細な分析をファイルアップロードなしで提供してくれます。まさにクライアントサイドだけで完結する魔法のようです。 **VS Code:** 開発者であれば、Cesium glTF Tools拡張機能は必須です。GLBをプレビューしながら生のJSONシーン記述子を並べて見ることができ、変換の問題をデバッグするのに最適です。 **Blender:** もちろん、いつでもファイル > インポート > glTF 2.0 (.glb/.gltf) からGLBをBlenderに直接インポートできます。Blender 3.3以降は優れたサポートを提供しています。インポートすれば、マテリアルを掘り下げたり、シーン階層を確認したり、新しい設定で再エクスポートしたりできます。 もしGLBファイルがこれらのいずれでも開けない場合、通常は単純な問題です。ダウンロードが不完全だった、ファイルに非標準の拡張機能が含まれている、または内部のテクスチャがビューアーでサポートされていないKTX2のようなフォーマットを使用している、などが考えられます。gltf.reportの検証出力を見れば、ほとんどの場合、何が問題なのか正確に教えてくれます。