Blenderを使ったPythonアプリを作る#1- 360度自動レンダリング
はじめに
あまり知られていませんが、Blenderは3DのDCCツールとしての配布だけでなく、Pythonのモジュールとしてpipでの配布もされています。このbpyモジュールとPyInstallerを用いて便利なスタンドアローンアプリを作る事が出来たので、手順や実例と考察を記事にしてみようと思います。
今回作成したサンプルツール
自動360度レンダリングツール
3Dモデル(.glb)ファイルをいい感じに自動で360度レンダリングしてくれるものです。以下からrender360.exeをダウンロードするか、githubリポジトリをクローンしてReadmeの手順に沿って利用します。
・EXEファイルまたはそのショートカットに自動レンダリングしたいglbファイルをドラッグ&ドロップします。
モデルファイルの横にフォルダが作られ、1分程度で24枚のキャプチャ画像が作成されます。
モデルはここの物をお借りしました。License: CC Attribution (NO AI)
コマンドラインで引数を指定して実行もできます。レンダリング枚数やサイズ・カメラ角度、レンダリング品質、地面の有無などが指定可能です。以下は実行いろいろな引数を付与した実行例です。
.\render360.exe .\miniature_cat.glb --frames 4 --cam_deg_x 10 -o out --render_size 512 768 --scale 0.8
※ その他、動作検証はSketchFabにあるモデルで行っています。うまく動作しないglbファイルもあるかもしれません。
引数について詳しくはREADMEを参照してください。細かい引数を付けた状態でモデルのドラッグ&ドロップで処理したい場合は、コマンド内容をと引数をbatファイルに書き、そのbatファイルにモデルをドロップするとよいです。
``` render.bat
@echo off
render360.exe %1 --render_size 1024 1024 --one_file -o temp
```
動作の動作の詳細やソースコードについてはこの記事でも後述します。
bpyモジュールについて
bpyモジュール(PIP)とは
Blenderのscript部分をpythonモジュールとして独立公開したものです。https://pypi.org/project/bpy/
基本的に Blenderに含まれているものと同じですが、pipコマンド一発でインストールしてpythonから利用できるので、プログラマが利用しやすい形となっています。
# 仮想環境を作ってbpyをインストールする例(Windows)
python -m venv venv
venv\Script\Activate.bat
pip install bpy
bpyモジュールの機能については今回割愛しますが、Blenderの機能を自由に操れるものです。
モジュールには基本的なフォントやアドオンなども含まれているようですが、GUIアプリケーションとして起動はできません。Blenderのリリース周期(2024年現在は4か月に1回)にあわせて公開されているpipモジュールも更新されるようです。その際に対応するPythonバージョンが上がります。あるバージョンのBlender(=bpyモジュール)は特定のPythonバージョンに強く紐づいて動作するので、注意してください。Pythonのバージョンを決めると利用できるbpyモジュールも特定のバージョンに限定されます。
自分は経験がありませんが、任意のBlenderブランチから自身でbpyモジュールとしてビルドする事もできます。https://developer.blender.org/docs/handbook/building_blender/python_module/
Blenderのコマンドライン実行との違い
上記で説明したpythonからbpyモジュールを利用するのとは別の方法で、インストールされたBlenderをコマンドラインから実行し、任意のpythonコードを処理させる事も出来ます。
blender.exe --background --python hoge.py
これでも問題なく動きますし、一般にはこちらがよく使われていると思います。当然ですがBlenderのインストールが事前に必要です。どうせBlenderをインストールはしているのでツールの開発中はこれで良いですが、他人にツールを共有する場合はコードのみの共有ですむ前述の方法が適しています。そして今回のネタであるスタンドアロンアプリ化をしたい場合はこのBlenderをコマンドラインできどうする方法は適しません。
なお、この方法でpythonコードに任意の引数をす場合、普通に書くとBlenderが解釈できずエラーになります。これを防ぐふさぐには -- を 独自引数の合間に挟む必要があるとの事です。
blender.exe --background --python hoge.py -- --spam 1 --egg 2
自分はこれを知らず、外部設定ファイルをわざわざ読ませたり、実行するpythonファイルを動的に生成したりして対応していました…。
サンプルアプリのソースコード
githubで管理しています。以下が該当のメインのソースコードです。このまま単独実行もできます。
https://github.com/harayoki/Render360_b3dApp/blob/main/src/render360.py
argparseで引数をさばいて、テンプレートのblendファイルにglbファイルを読み込んで配置し、カメラやアニメーションの設定をしてレンダリングを複数回行います。レンダリングの調整周りで色々な事をしていて多少長さがありますが、基本的に1本道の流れ作業で、クラス定義さえないので関数の詳細を追わなければ難しくないかと思います。
※ プロジェクト全体についてはそのうち解説する予定です。
PyInstallerでアプリ化する
アプリ化する意味
Blenderの強力な機能を使った便利アプリを、ユーザーが使い易い形で配布する事が出来ます。Blenderが裏にある事も意識させません。アプリの操作だけに絞ったシンプルな独自のUIを(blenderのUIは表示せずに)持たせる事も出来ます。
ここで気になるのはできあがる実行ファイルのファイル容量です。Blender4.2ではインストールフォルダが1Gbytes弱ありますが、今回のexeファイル化したアプリでは320MBytes程度となりました。中身を実際に確認していませんが、利用されていない内部モジュールやアセットは同梱されていないのではないかと思われます。
ツールの配布が対エンジニアであれば、exe化せずとも良い、というかしないほうがいいかもしれませんが、Pythonの環境構築を差せずに済むという利点はあります。
アプリ化の方法
以下コマンドでdistフォルダ内に実行ファイルが作成されます。
pyinstaller render360.spec
Pyinstaller設定ファイル(spec)の書き方について
https://github.com/harayoki/Render360_b3dApp/blob/main/render360.spec
Pyinstaller実行時にデフォルトで作成される設定ファイルのままだと、同梱されないモジュールがあったため、実行時にエラーが出たものを手作業で追加していく必要がありました。
アドオンで使っているモジュールが漏れていたりしたので、いつも同じ書き方では済まないようです。ここは詳細を調査中となります。
# specファイル 該当箇所抜粋
hiddenimports = ['__future__', 'platform', 'numpy', 'uuid']
hiddenimports += collect_submodules('bpy')
hiddenimports += collect_submodules('logging')
bpyモジュールを利用したPythonコーディングのコツ
アドオン作成の流儀に沿わなくてよい
BlenderのスクリプトというとPythonでのアドオン開発というのが通常かと思います。アドオン開発にはオペレータークラスを継承する必要があり、GUIが自動で作られたり、かなり便利ではあるのですが、BlenderのGUIの仕組みについてもある程度の知識が必要になり、Pythonコーディングになれた開発者でも慣れるまでは苦労しそうです。
ですが、実は命令をだらだらと書き並べたコードでも実際は動作します。別別途インストールしたBlenderをGUI操作した際の動作ログやメニューのツールヒントからpythonコードが取得できるので、それらを並べて調整しただけでもそれなりのツールが作れるでしょう。
テンプレートBlendファイルを用意する
シーンやモディファイヤ・マテリアルなどの設定は全てコードでかかずともあらかじめ出来上がった状態のBlendファイルに収めておき、それをコードから利用する事が出来ます。自分はそのほうが楽なので今回もそうしましたが、もちろん全てをコードで書く事もできます。デザイナの作ったBlendファイルを利用する事もできるので見た目の良いエフェクトやフィルター・演出等を自動処理に取り込みやすいかもしれません。
Blendファイルを途中保存するとデバッグになる
開発時、処理中のシーンをblendファイルとして保存しておくとデバッグに役立ちます。モデルやノードが意図した状態になっていない事がわかったりします。
注意点
コードを書くにあたって、コンテキストや動作モードについての理解はある程度必要かもしれません。今回は解説しません。
Blenderをツールとして起動した際にしか動かないコードの記述形式も存在します。GUI操作をするものなどです。
ライセンスについて
Bledenrアドオンを開発し、配布する場合はGPLv3互換のライセンスを付与する必要があり、MITやCC0を適用する事が出来ますが、bpyモジュールを組み込んだアプリを配布する場合は bpyモジュールのライセンスである、GPL-3.0を適用する必要があると思われます。自分が公開しているコードもこの理由絵GPL-3.0となっています。オープンソース化が必須となるのでアプリ配布を考えている方は注意してください。
https://github.com/harayoki/SketchfabOptimizerForFfishAsia/blob/main/LICENSE
次回予定
いつになるかわかりませんが、単体アプリシリーズとして、以下を別途記事として投稿したいなと思っています。 もし要望があればXやでメッセージやこの記事にコメントしてください。多忙で合間が開くとモチベーションが下がってしまうのですが、つつかれればやる気が出ます。
3Dモデルの自動最適化ツール 実例
アドオンを利用する
PySideやFletを使ったGUIアプリの作例
geometryノードと連携したパラメトリックモデルツール作例
ルールベースの自動テクスチャリングツール
サブスタンスの利用
Script記述のTips
複数のアプリを連携したオートメーション例
BlenderAppについて
この記事が気に入ったらサポートをしてみませんか?