タイトルの発端はここから始まった。
動機
私はPhotoshopで様々な素材(jpgやpng)をレイヤーを駆使して編集したのと同様に、Blenderでも複数のオブジェクトを比較しながら編集したい!
そこで、Blenderにたくさんの3Dモデルをインポートしようと思ったのだが…
悩み
Blenderでドラッグアンドドロップでインポートできるのは.blendだけであり、1体ずつインポートするしかありません。 つまり、複数の3Dモデルをインポートできないのが不便だ。。。
しかし、私はこの悩みを払拭する方法を見つけました。
それは、pythonスクリプトで実行する方法です。
通常の3Dモデルのインポートとは異なります。
Blenderでは3Dモデルをドラッグアンドドロップインポートできないので、その代わりの方法ともいえます。 使い方によっては、効率良くインポートすることができ、時間短縮につながります。
通常のインポート | pythonでインポート |
では早速、複数の3Dモデルをインポートするための方法を紹介していきます!
動作環境
- macOS Mojave or Windows 10 Pro 1909
- 両方のOSで実行可能ですが、1か所だけ注意してください。
- Blender 2.79~2.83 , 2.90~2.91
- 正常に動作することを確認しました。
- プログラミング知識
- プログラミング経験者なら何となく分かるかもしれません。
使用コードと解説
複数の3Dモデルをインポートする方法は、pythonで実行することで実現します。
python知識0でも手順通りに行えば実行できます。
import os
import bpy
#ex. path_to_obj_dir = os.path.join("C:\\Users\\Your Name\\Dropbox\\3d") #Windows
obj_path = bpy.path.abspath('絶対PATH') #Mac
# ディレクトリ内のすべてのファイルのリストを取得します
file_list = sorted(os.listdir(obj_path))
#「obj」で終わるファイルのリストを取得します
obj_list = [item for item in file_list if item[-3:] == 'obj'] # obj, fbx, vrm, etc...
# obj_listの文字列をループし、ファイルをシーンに追加します
for item in obj_list:
path_to_file = os.path.join(obj_path, item)
bpy.ops.import_scene.obj(filepath = path_to_file) ## obj, fbx, vrm, etc...
それでは、実行するコードを順番に解説していきます。
1, 2行目
import os # OSに依存した機能を使用します。
import bpy # bpyモジュールを使用します。
4, 5行目 – 絶対PATHは3Dファイルがあるディレクトリを指定してください。
- WindowsとMacではライブラリが異なります。どちらか片方をコメントアウトして使用してください。
path_to_obj_dir = os.path.join("C:\\Users\\Your Name\\3dファイルがあるディレクトリ") #Windows
obj_path = bpy.path.abspath('絶対PATH') #Mac
7, 8行目
# ディレクトリ内のすべてのファイルのリストを取得します。
file_list = sorted(os.listdir(obj_path))
10, 11行目 objファイル以外に、fbxやvrmも適用することができます。その場合は文字列を差し替えて下さい。
#「obj」で終わるファイルのリストを取得します
obj_list = [item for item in file_list if item[-3:] == 'obj'] # obj, fbx, vrm, etc...
13~16行目
# obj_listの文字列をループし、ファイルをシーンに追加します
for item in obj_list:
path_to_file = os.path.join(obj_path, item)
bpy.ops.import_scene.obj(filepath = path_to_file)
実行手順
3Dモデルがある同じディレクトリobj2blender.pyを作ってください。
Blenderを起動し、上のタブから「Scripting」を選択し、obj2blender.pyを開きます
obj2blender.pyをスクリプトを実行します。
実行に成功すれば、複数の3Dモデルのインポートに成功します。 画像のように全てのオブジェクトが原点に設定されます。(3Dファイルの3Dモデルが原点の位置から遠ざかったとしても)
ディレクトリ内にある3Dファイルの数だけシーンにインポートされます。
3Dファイルは原点に設定されていることが多いので、 モデルのスケールやトランスフォームによるが度々重なることが分かります。 続けてインポートする場合は、スクリプト実行の前にモデルを原点から移動させ、別のシーンコレクションを新規に作成することをおすすめします。
メリット・デメリット
この方法のメリットとデメリットを示します。
メリット
- 一度に大量の3Dファイルをインポートすることができます。
- 続けてインポートを実行することができます。
デメリット
- 3Dモデルのファイルサイズと数に応じて、.blendのファイルサイズが大きくなります。
- Blenderに一気に負荷がかかります。
- 複数のモデルを読み込むことでBlenderの動作がだんだん重くなります。
- エラーがよく起こります。
エラーが出る場合の対策
エラーメッセージ
location: :-1 SyntaxError: (unicode error) \’unicodeescape\’ codec can\’t decode bytes in position 2-3: truncated \\UXXXXXXXX escape File \\obj2blender.py, line 6 Pythonスクリプトが失敗。システムコンソールのメッセージをチェックしてください
日本語訳
場所::-1 Syntaxエラー:(Unicodeエラー) \’unicodeescape\’コーデックは2-3の位置のバイトをデコードできません:切り捨てられた\\ UXXXXXXXX エスケープファイル \\ obj2blender.py、6行目
意味:Syntaxエラーです。バックスラッシュ→\\が無効になっています。
対策:バックスラッシュを2回打って→\\とするか、Cの前にrを付けて下さい。
path_to_obj_dir = os.path.join("C:\Users\koshi\Dropbox\3d") #Windows
or
path_to_obj_dir = os.path.join(r"C:\Users\koshi\Dropbox\3d") #Windows
インポートサポートファイル形式
当環境で検証しました。(現状2020/4/15) Blender2.79~2.82で試したところどちらも同じような動作でファイルがインポートされた結果になりました。
また、Blenderでサポートされていない3Dファイルをインポートできるようにするaddon(拡張機能)を導入することで、この方法が使えることを確認できました。
addonの例: .vrm(VRM IMPORTER)
pythonスクリプト実行による3Dファイルインポート対応表
インポートできる | fbx obj vrm(addon:VRM IMPORTER) , vpd |
---|---|
インポートできない | dae skp pmx(addon: mmd_tools) 3ds stl glTF |
何も変化なし | blend |
皆さんもぜひ駄目元で試してみて下さい。
最後に
- 個人的にはたくさんのモデルを改造したりするので、ありがたい方法です。
- 一方、Blender以外の3DモデリングソフトであるMayaやSubstance Painterなどはドラッグアンドドロップで3Dファイルをインポートすることができるんですよね。
- こんな方法があったのか!と知っただけでも良かったです。おかげでpythonの勉強にもなりました。
余談ですが、今後の課題として次のことが挙げられます。
- Blenderが標準でサポートされている他3Dファイル形式への対応するためにコードを改善すること。(.blend.dae など)
- 座標軸の設定:原点から少しずらして配置する。
私はこれらの機能が実現できると、インポートの幅が広がるのですが、pythonは勉強不足なため、改善できたらアップデートします!
参考
[1] import – Drag and drop importing of .OBJ files – Blender Stack Exchange
この記事はBlender Advent Calendar 2019 – Qiitaの4日目に参加しています。
使用3Dモデル:©Project RAIV, ニコニ立体ちゃん