はじめに
Blenderのエクスポート機能には様々なファイル形式があります。
よく使うところで言えばFBX・OBJなどのフォーマットが挙げられますが、3DCGの用途によってはそれ以上にGLB形式をよく書き出す方もいるのではないかと思います。特にWebGLやAR(拡張現実)の場面でよく用いられます。
しかしどんな形式であっても、3Dモデルのエクスポートにはなにかしらの問題はつきもので、GLB形式に関してもその例外ではありません。
それが書き出し操作によるミスなのか、仕様上どうしても仕方がないものなのかで、その理由を突き止めるだけでも結構な調査が必要となり大変となることが多々あります。
そんな問題の一つとして、GLBエクスポートには頂点数が予期せず増加してしまう現象があります。
この記事ではその増加について確認したことを記していきます。
問題の概要
まず、Blenderを使用してGLB形式にエクスポートした場合、モデルの頂点数が増加する現象が発生します。
この問題はFBXやOBJなど他のフォーマットでの書き出しでは見られません。
またこの現象は基本的にどのようなモデルでも発生します。
ですので、形状が非常に複雑なモデルでもシンプルなモデルでも、あるいは特定のモディファイアを適用したかどうかにかかわらず、GLB形式にエクスポートすることで頂点数が増加します。
一番ミニマムな状態での確認
この現象を確認するために、一番ミニマムな形で確認するためにプリミティブなモデルのキューブを置いてGLBで書き出し、それからまたBlenderで確認してみました。
結論から言うとこれだけでも頂点数は増加します。
キューブの形状は頂点数が8個が通常です。これを書き出したところで、普通であればそのまま頂点数が8個になるのが普通です。

しかし、書き出し後の頂点数は以下の通り、24個です。
いっさい手を付けていない、無加工の状態でもこの様になるため、どんなモデルであってもこの頂点数の増加からは逃れられなさそうです。

問題の原因:GLB形式の特性
また、Blenderのエクスポート設定を見直してみても、この問題の解決は望めないかと思われます。
ここからは推測が多くなりますが、おそらくGLB形式そのものの仕様によるものと考えられます。
GLBは、WebGLやリアルタイム3Dレンダリング向けに最適化された形式である分、エクスポート時に頂点の分割・再計算が行われているのはないかと推測します。
一方で、FBXやOBJなどのフォーマットではこのような現象は起きません。それはおそらく、FBXやOBJは、主にDCC(Digital Content Creation)ツール間でのデータ互換を想定しているためではないかと思います。
GLBがエクスポート時に頂点の分割・再計算をしている根拠としてヒントとなりそうなのが以下です。
例えば一つ点を選択して動かしてみると、以下のような動きになります。

本来であれば、ここの頂点は1つだけのはずですが、3つに分かれた状態になってしまっています。また、そのような分割がされているため、1つの頂点を動かしたら1つの面だけが動くという挙動になっています。
このように、面を基準にして頂点を分割するような処理がGLB書き出し時には走っていると言えそうです。
この処理を止める方法は少なくともBlender上のGUI上には存在しないため、これを行わずに書き出すということは難しいと思われます。
余談ですが、最初に動かした頂点はさらにもう2分割されていてもおかしくなさそうなのですが、何故かここは繋がっていて三角面の2つを動かすことが出来ます。ちょっとこのあたりの理屈も謎ではあります。
あともう一つ余談で、これはGLBをインポートするときの設定にある“頂点をマージ”を選択すれば、一つの頂点に統合されて扱うことが出来ます。しかしこれは結局“距離でマージ”をインポート時に自動でやっているだけの設定なので、書き出し時の分割とは関係ありません。
結論・おわりに
ここまで記載しましたが、BlenderでGLB形式にエクスポートする際の頂点数が増える現象に対しては回避策が見つかっていません。
というより、GLB形式の仕様やレンダリングの最適化の観点から、ある程度の増加は避けられない現象と考えられます。“問題”という単語を使ってここまで記載しましたが、仕様上という観点で言えば、正常な動作という風に言えるのかもしれません。
ただ、三角面数に関して言えば書き出し前から変わっていないので、そこまで大きくパフォーマンスに大きく問題を与えるような問題になるかといえば、予想ですがそれも無さそうです。
というより、そもそも三角面数がそもそも膨大な3Dモデルだったとしたら、まずはそのリダクションが先決です。
ただそういう点を含んでGLB形式でのエクスポートが必要な場合には、ファイルサイズやパフォーマンスの最適化を意識してモデルを軽量化することが推奨されますし、頂点数の増加もある程度前提に入れて、事前にモデルの最適化を行うことができれば、WebやARなどでの処理負荷を抑えて扱うことができる可と思います。
コメント