Blenderを使ったPythonアプリを作る#2- 3Dモデルの自動最適化ツール
はじめに
前回の記事では360度自動レンダリングツールとして、bpyモジュール経由でBlenderの機能を利用したPython処理を書き、PyInstallerで単独アプリ化する利点と手順を簡単にまとめました。
今回はこの形式でアプリを作るきっかけになった実例として、スキャンモデルの自動最適化ツールについて紹介と解説をします。ツールのダウンロード先は記事の後半にあります。
自動最適化ツール
3DモデルをEXEファイルにドロップすると最適化されたモデルが書き出されます。詳細は後述。
pythonScriptのままでも動くのにわざわざEXE化しているのは、ツール配布の利便性のためです。詳しくは前回の記事参照。
最適化するサンプル3Dモデル
今回もSketchFabから出来が良くライセンスに問題がないglbファイルをお借りします。2つ共にスキャンモデルのようです。
"Giganotosaurus Schleich" (https://skfb.ly/6u8GU) by dicatta is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
"Lion Head Photogrammetry scan" (https://skfb.ly/689yA) by GSXNet is licensed under Creative Commons Attribution-NonCommercial (http://creativecommons.org/licenses/by-nc/4.0/).
3Dモデルのクオリティ的には申し分ないのですが、一般にスキャンモデルというものは、UV(テクスチャ)が編集に向いていなかったり、頂点数が多すぎたりします。またメッシュが複数に分断して重ねあって全体を構成している事もあります。
自動最適化ツールでの処理結果
今回作成したツールでは上記の問題を自動的に解決します。
自動最適化ツールが実際に行う処理
3Dモデルを読み込んで扱いやすい状態に自動で最適化します。読み込むモデルはスキャンモデルでなくても動作しますが、デフォルトの振る舞いがスキャンデータに適した形にパラメータ調整されています。
モデルが複数のメッシュで構成されている場合1つに統合を行う
近くにある頂点は結合する。
頂点数を削減する(デフォルト削減率は50%)。
UV展開をやり直す。
元モデルからカラーテクスチャを転写して新しいテクスチャ・マテリアルを作成。
(オプション:ノーマルマップも作成する。デフォルトではOFF。)
(オプション:glbだけでなく、Blendファイルも出力する。そのまま3Dモデルの編集に入る場合に便利です。)
※ 対応している入出力フォーマットは 現状 glbファイル形式 のみ
これらの処理は、Blenderを用いて手作業で行えます(というよりそうしていました)が、手作業ではそこそこ手間や時間がかかります。そこで、手作業の処理をそのまますべてbpyモジュールを利用したPyhtonスクリプトで記述しなおして、ツール化しました。
ツールのダウンロード・動作準備
下記からScanModelOptimizer.exeをダウンロードします。
もしくはリポジトリ( https://github.com/harayoki/ScanModelOptimizer )をクローンして、READMEに従いpython scriptが動作する環境を作ります。
ScanModelOptimizer.exe も src/ScanModelOptimizer.py も受け付ける引数や動作は同じです。exeファイルはWindows11で動作確認しています。ScanModelOptimizer.pyはおそらくMacでも動きます。直接pythonソースコードを実行する場合は以下のような記述になります。
python.exe .\src\ScanModelOptimizer.py 'hoge.glb'
推奨の使い方としてはScanModelOptimizer.exeファイルにglbファイルをドラッグアンドドロップして最適化処理をさせる方法です。最適化前のglbファイルに別のglbファイルが書き出されます。
最適化モデルが適切な状態でない場合、いろいろなパラメータがあるのでそれを調整してツールを呼び出します。EXEファイルを利用している場合は、いったん 以下のようにパラメータを記述(この場合はテクスチャサイズを小さくして、頂点数もより少なくしている)したbatファイルを作り、
ScanModelOptimizer.exe %1 --texture_size 1024 --decimate_ratio 0.3
そのbatファイルにglbファイルをドラッグ&ドロップします。これで処理をカスタマイズした状態で簡単にツール実行ができます。使う機会が多そうなパラメータ例は以下となります。
decimate_ratio:ポリゴン削減率
do_only_remesh:メッシュの統合のみ実行し、UV・テクスチャ関連の処理はしない
texture_size:出力テクスチャーサイズ
bake_normal:法線マップをベイクするか デフォルトではしない
bake_diffuse_from:テクスチャベイク元の指定 テクスチャが真っ黒になる場合はこれを EMIT に指定してみてください。スキャンモデルの色味はデフォルトのDIFFUSEではなくEMITについている事があります。
その他のパラメータやデフォルト値はリポジトリの README を確認してください。
Blendファイルを出力する
output_blend 引数を指定して、glbファイルの書き出しと同時に最適化済みのモデルを持ったblendファイルを出力する事が出来ます。
.\ScanModelOptimizer.exe 'lion_head_photogrammetry_scan.glb' --output_blend
これは最適化されたglbファイルの詳細を確認したい場合や手作業で編集を進める場合に役立ちます。glb形式以外で3Dモデルを書き出したい場合にも使えます。
さらに output_blend_timing 引数を使うと テクスチャのベイク前・ベイク直後の状態でblendファイルを書き出す事が出来ます。
.\ScanModelOptimizer.exe 'lion_head_photogrammetry_scan.glb' --output_blend --output_blend_timing BEFORE_BAKE
テクスチャの転写(ベイク)をカスタマイズしたり修正する場合に使います。BEFORE_BAKEでベイク前、AFTER_BAKEでベイク後の状態になります。BEFORE_BAKEでblendファイルを書き出したほうが待ち時間が短くて済みます。AFTER_BAKEではテクスチャの劣化具合を比較できます。以下はBEFORE_BAKEで書き出したblendシーンを開いた様子です。
実際は黒いメッシュ(最適化済)とテクスチャのついているメッシュ(元モデル)は完全に重なった状態で配置されています。メッシュの大きさがベイク処理に適した大きさ位に調整されているので、このまま手作業で3Dモデルを書き出す場合は注意してください。
ツールのソースコードの簡易な解説
1ファイルのみです。https://github.com/harayoki/ScanModelOptimizer/blob/main/src/ScanModelOptimizer.py
アドオン形式にはなっていません、argparseを用いて引数をさばいて、そのまま直列的に処理を実行します。800行程度ありますが、工程が多いだけで複雑な流れにはなっていません。
最初にテンプレートとなるblendファイルを開き、そこにglbファイルをインポートしています。blendにはマテリアル(シェーダグラフ)のひな型が置いてあります。今回の場合は全てソースコードでも記述できるレベルですが、より複雑な処理を行う場合、例えばgeometryノードを処理の中心としたり、複雑なマテリアルやコンポジットを利用したり、いろいろなモディファイヤを駆使する場合はBlendファイル側にそれを用意してscriptで利用したほうが楽です。
なお、ツールのライセンスはGPL-3.0 Licenseとなっています。bpyモジュールがGPL3ライセンスであるためです。ツールを改造して再配布する場合はオープンソースが必須となるのでご注意ください。
まとめ
bpyモジュールを使った自作pythonツールの例を紹介しました。再配布含めて自由にご利用ください。自分も活用していくつもりなのでツール側のアップデートもあると思います。
このシリーズの記事は(時間が取れれば)また書いていきたいと思っています。次回はアドオンがらみの記事になる予定です。
関連記事
今回紹介したツールで出力されたglbファイルはそのまま前回のツールに放り込んでレンダリング可能です。