【Blender】複数の3Dモデルを一括でインポートする方法

wp_tmb_blender-import

タイトルの発端はここから始まった。

動機

私はPhotoshopで様々な素材(jpgやpng)をレイヤーを駆使して編集したのと同様に、Blenderでも複数のオブジェクトを比較しながら編集したい!

そこで、Blenderにたくさんの3Dモデルをインポートしようと思ったのだが…

悩み

Blenderでドラッグアンドドロップでインポートできるのは.blendだけであり、1体ずつインポートするしかありません。 つまり、複数の3Dモデルをインポートできないのが不便だ。。。

しかし、私はこの悩みを払拭する方法を見つけました。

それは、pythonスクリプトで実行する方法です。

通常の3Dモデルのインポートとは異なります。

Blenderでは3Dモデルをドラッグアンドドロップインポートできないので、その代わりの方法ともいえます。 使い方によっては、効率良くインポートすることができ、時間短縮につながります。

f:id:koshishirai:20200511074528p:plain:w400 f:id:koshishirai:20200511074542p:plain:w500
通常のインポート 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を開きます

f:id:koshishirai:20200511074650p:plain:w500

obj2blender.pyをスクリプトを実行します。

f:id:koshishirai:20200511074741p:plain

実行に成功すれば、複数の3Dモデルのインポートに成功します。 画像のように全てのオブジェクトが原点に設定されます。(3Dファイルの3Dモデルが原点の位置から遠ざかったとしても)

f:id:koshishirai:20200511074820p:plain

ディレクトリ内にある3Dファイルの数だけシーンにインポートされます。
3Dファイルは原点に設定されていることが多いので、 モデルのスケールやトランスフォームによるが度々重なることが分かります。 続けてインポートする場合は、スクリプト実行の前にモデルを原点から移動させ、別のシーンコレクションを新規に作成することをおすすめします。

メリット・デメリット

この方法のメリットとデメリットを示します。

メリット

  • 一度に大量の3Dファイルをインポートすることができます。
  • 続けてインポートを実行することができます。

デメリット

  • 3Dモデルのファイルサイズと数に応じて、.blendのファイルサイズが大きくなります。
  • Blenderに一気に負荷がかかります。
  • 複数のモデルを読み込むことでBlenderの動作がだんだん重くなります。
  • エラーがよく起こります。

エラーが出る場合の対策

f:id:koshishirai:20200511074844p:plain

エラーメッセージ

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, ニコニ立体ちゃん