OBJ を GLB に変換

ここで OBJ を GLB に変換できます。無料、アカウント不要です。ファイルを上の枠に落とせば、数秒で結果がダウンロードできる状態になります。 変換はお使いのブラウザーの中で行われるので、ファイルはアップロードされません。Windows でも macOS でも Linux でも、iPhone でも Android でも同じように動き、通信を切っても動き続けます。

  • 処理される場所 ブラウザーの中です。ファイルがアップロードされることはありません。
  • 作り直し GLBはOBJとは仕組みが違います。非可逆コーデックのような段階的な劣化ではありません。GLBが表現できるものは忠実に再現され、対応するものがないものはまったく残りません。
  • ファイルサイズの上限 1ファイルあたり100MBまで。無料、アカウント不要です。
  • 知っておきたいこと 形状だけです。材質・色・テクスチャ・アニメーションは引き継がれず、同じモデルを複数回配置していた場合は、それぞれの位置に焼き付けられた別々のコピーとして返ってきます。

一度に100ファイルまで。フォーマットが混ざっていても構いません。

ウェブに載せる前に、OBJ が GLB にならなければならない理由

ブラウザーは OBJ を読めませんし、GLB もネイティブには読めません。.glb に直接アクセスするとレンダリングではなくダウンロードになります。違うのはライブラリの生態系です。three.js、Babylon.js、model-viewer の Web コンポーネントはどれも GLB を主要な入力として、1 回のフェッチで読み込みます。OBJ 対応はサイドローダーで、MTL とすべてのテクスチャを別々のリクエストで必要とします。

ですから実際の問いは、ブラウザーがどの形式を理解するかではなく、これから組み込むランタイムがどれを期待しているかです。2018 年以降に公開されたものはたいてい GLB が答えです。モデルがコンテンツそのものである商品ページでは、4 つ 5 つのリクエストを 1 つにまとめることが、スマホでは実測できる差になります。

OBJ が指す MTL は決して開かれません

OBJ ファイル自体にはマテリアルが含まれていません。mtllib 行が隣の .mtl を名指しし、usemtl 行がそのファイル内の項目を切り替えます。.mtl には拡散色や鏡面反射の値、テクスチャ画像へのパスが入っています。この変換器は v、o、g、f の行だけを読み、それ以外は無視します。

結果ははっきりしていて、あらかじめ計画に入れておく価値があります。GLB には形状とグループ名だけが入り、ビューアーは持っている既定のマテリアルで描画します。テクスチャ込みで表示するつもりだったモデルなら、経路は Blender です。MTL ごと OBJ を読み込み、glTF バイナリとして書き出せば、画像が GLB の中に取り込まれます。このページは、形が納品物である場合のためのものです。

この変換器が組み立てる GLB の中身

12 バイトのヘッダー、4 バイト境界にスペースで埋められた JSON チャンク、その後にゼロで埋められたバイナリチャンクが続く glTF 2.0 バイナリです。JSON の中には OBJ の各グループにつき 1 メッシュ、各メッシュに 1 ノード、それらを一覧するシーンが 1 つ、資産バージョン 2.0、そして各メッシュに float32 の VEC3 位置アクセサーと uint32 の SCALAR インデックスアクセサーがあります。

すべての位置アクセサーは最小値と最大値を持っています。これは仕様上の要求であると同時に、読み込んだ瞬間にモデルが現れるかどうかを分ける実務上の違いでもあります。model-viewer も three.js も、その範囲から初期カメラ距離を計算するので、これらが書かれていないファイルは、見かけ上空のシーンになる典型的な原因です。

各 OBJ グループは 1 メッシュになり、1 メッシュは 1 回の描画コストです

読み込み側は o 行や g 行のたびに新しいグループを開始し、書き出し側はグループごとに glTF メッシュを 1 つ出力し、それぞれ独自のノードとプリミティブを持ちます。CAD から書き出された、面のパッチごとにグループを持つ OBJ は数百のグループを含むことがあり、GLB はそれを忠実に数百のメッシュとして持つことになります。

ページ上ではこれは本物のコストです。プリミティブごとに描画コールと GPU バッファーの結び付けが別々に発生し、ミドルレンジのスマホでは数百個あるだけでフレームレートが落ちます。OBJ を書き出す前に Blender でオブジェクトを結合するか、グループに意味がなければテキストエディターで g 行を取り除くのが、そのあとの作業のどれよりも見合う二分間の修正です。

平坦シェーディング、そしてローポリに見える理由

NORMAL 属性は書き込まれません。glTF の仕様は、ビューアーがその場合に何をすべきかを明確に定めています。平面の面法線を計算するのです。モデリングソフトで滑らかに見えた球体は、ブラウザーではすべての三角形が別々の面として見える形でレンダリングされ、意図したローポリ調に見えてしまい、たいていそれは意図したものではありません。

すっきりした解決策が二つあります。three.js では読み込んだジオメトリに computeVertexNormals を呼び出すと、面法線を頂点ごとに平均します。これは頂点が正しく結合されている必要があり、変換の際に小数点以下 6 桁で位置が統合されているため満たされています。あるいは Blender の側で法線パスをかけてから glTF を書き出せば、マテリアルも一緒についてきます。

上方向とスケール——OBJ が決して宣言しない二つのこと

glTF は両方を固定しています。右手系で Y 軸が上、単位はメートルです。OBJ はどちらも固定していません。ヘッダーもなく単位もなく軸の規約もない数値の羅列で、書き出すアプリケーションごとに独自の癖があります。

ここでは変換は適用されないので、Z 軸が上の OBJ は仰向けに倒れた GLB を生み、センチメートル単位で作られた OBJ は 200 メートルの高さのモデルを生みます。どちらか分かってしまえばすぐ直せます。X 軸まわりにマイナス 90 度回転させる、または一様スケールをかける。しかしファイルを読み込むまでは見えません。知っている寸法とバウンディングボックスを照らし合わせるのが、いちばん早い診断です。

GLB が書かれる前に OBJ 読み込み側が行っていること

四角形以上の面は最初の頂点からファン三角形分割されます。これは変換元によく含まれる凸な四角形や n 角形には正しく、凹んだ面では三角形が重なることがあります。負のインデックス——直前の頂点から逆にたどる指定——は、その意味がファイル内の位置に依存するため、後回しにせずファイル読み込みの最中に解決されます。

その後で位置が結合されます。小数点以下 6 桁で一致するものは 1 回だけ保存し、20 個の三角形に現れる座標は 1 回保存して 20 回参照されます。これはバッファーを縮めると同時に、ブラウザーに本物の隣接関係を持つメッシュを渡すことになり、それが computeVertexNormals による滑らかなシェーディングを可能にしています。

GLB の大きさと、それを小さくする方法

位置には頂点あたり 12 バイト、インデックスには三角形あたり 12 バイト、それに小さな JSON ヘッダーが加わります。20 万三角形、10 万頂点のモデルはおおよそ 3.6 MB になり、圧縮は一切かかっていません。インデックスは例外なく uint32 で、65,535 頂点未満なら 2 バイトで済むところを 4 バイト使い、しきい値で動作が黙って変わる分岐を取り除いています。

ページにとってその数字が大きすぎるなら、答えは前後の工程にあります。ここではありません。Blender や MeshLab でメッシュを間引いてから、gltf-transform で Draco や meshopt の圧縮をかけてください。どちらもブラウザー側に対応するデコーダーの読み込みを要求し、それ自体が 1 モデルを表示するページにとってのコストになることも忘れないでください。

OBJ がまだウェブ向けに準備できていないとき

モデルにテクスチャが必要なら、MTL と画像を持ってこられる Blender 経由で変換してください。モデルが数十万の三角形を持つなら、書き出す前に間引いてください。滑らかに見せたいなら、ビューアー側かエクスポーター側で法線を処理してください。この経路はそのどれも与えません。

このページが向いているのは、正直な中間の場合です。部品や小道具、スキャンのきれいな OBJ が、モデルをどこにもアップロードすることなく、1 つのファイルとして形として表示される必要がある場合です。この変換はすべてブラウザーの中で完結し、エンジンのダウンロードもなく、上限は 100 MB で、現行のあらゆるウェブビューアーが受け入れるファイルを作ります。

OBJ を GLB に変換する手順

  1. お手元の OBJ ファイル をこのページに落とすか、押してファイルを選んでください。
  2. 変換先に GLB を選びます。変換はブラウザーの中で行われ、ファイルはアップロードされません。
  3. できあがった GLB ファイル をダウンロードします。

OBJ と GLB——何が変わるか

OBJとGLBの比較
OBJGLB
正式名称Wavefront オブジェクトBinary glTF
拡張子.obj.glb
メディアタイプmodel/objmodel/gltf-binary
最初の公開19922016
発行元Wavefront TechnologiesKhronos Group
仕様glTF 2.0
ライセンスオープン標準オープン標準
現在の位置づけ現行現行
ブラウザで開けるか対応なし対応なし
代わりに検討される形式GLTF, PLY, STLGLTF

結果を開く

Blenderは OBJ と GLB のどちらも読めるので、別のプログラムを開かずに、結果を元のファイルと並べて確かめられます。

どちらの形式が何のためのものか

2 つは狙っている用途が違います。OBJ はプログラム間のデータ受け渡しと編集、GLB はウェブと完成したファイルの受け渡しです。ここは考える価値があります。一方が存在する理由が、そのままもう一方が使いにくい理由になっていることが多いからです。

GLB は Khronos Group の形式で、2016 年から使われています。規定は glTF 2.0 です。Blender、three.js、Babylon.jsがこの形式を読めます。

OBJ は 1992 年、GLB は 2016 年に登場しました。人に渡すならたいてい古いほうが安全で、新しいほうは同じ仕事をより少ないバイト数で片づけます。

OBJ から GLB:よくある質問

OBJ ファイル はどこかにアップロードされますか。

いいえ。この変換は完全にブラウザーの中で行われるので、ファイルが端末から出ることはありません。ご自分で確かめられます。開発者ツールのネットワークタブを開いて、何か変換してみてください。ページそのものと、このサービスの費用をまかなっている分析・広告のリクエストは見えますが、あなたのファイルを運んでいるリクエストはひとつもありません。

OBJ から GLB への変換は無料ですか。

はい。アカウントも透かしもなく、消費される 1 日の割り当てもありません。お使いの機械の上で動くので、何度でも戻ってきていただけます。ブラウザーが扱えるのは 100 MB までのファイルで、一度に 100 本です。

OBJ を GLB に変換すると品質は落ちますか。

OBJ と GLB は、内容の表し方が根本から違います。ですからこの変換は複製ではなく再構築です。誠実ではありますが、1 バイトも同じというわけではありません。 形状だけです。材質・色・テクスチャ・アニメーションは引き継がれず、同じモデルを複数回配置していた場合は、それぞれの位置に焼き付けられた別々のコピーとして返ってきます。

できあがった GLB ファイル を開くのに、何かインストールが必要ですか。

変換には要りません。すでに開いているブラウザーの中で行われます。そのあと結果を開くには、お使いの端末がふだん Binary glTF を表示するのに使っているソフトが必要です。

これらのフォーマットについて