Blender Pythonで複数メッシュをOBJ形式で一括エクスポートする。

こちらはBlenderのシーンにある複数メッシュオブジェクトをWaveFont.objファイルで一括エクスポートするPythonコードです。
シーンに100個以上のメッシュがあるときにはプログラムで自動化しないとひとつひとつエクスポートを手作業するのは大変ではないでしょうか?🤔
調べている限りBlender2.9で動くコードがなかったのでここに記します。

環境
・Blender 2.91.2
・Python 3.8以上
・Windows 10

コード 

multiobj_export.py

# -*- coding: utf-8 -*-

import bpy
import os

#出力ファルダ先の指定(絶対パス)
basedir = 'absolute path'

# シーンからメッシュオブジェクトのみを選択
sel_objs = [obj for obj in bpy.context.scene.objects if obj.type == 'MESH']

# 全てのオブジェクトの選択を解除する
bpy.ops.object.select_all(action='DESELECT')

for obj in sel_objs:
   # objを選択状態にする。
   bpy.context.view_layer.objects.active = obj
   obj.select_set(True)
   # 選択状態のobjのみ.obj形式でファイルを出力する。必要に応じてオプションを追加する。
   bpy.ops.export_scene.obj(
       filepath=os.path.join(basedir, obj.name + '.obj'),
       use_selection=True,
       )
   #選択を解除
   obj.select_set(False)

コマンド実行の際は、次のようにバックグラウンドオプションを付けないと動きません。

$ blender --background --python .\multiobj_export.py

※実行より前に、blenderをshell越しに起動するにはpathを通す必要があります。

WebGLで表示できるように出力する場合は19行目のオプションを次の通りにします。

# オプションモード
bpy.ops.export_scene.obj(filepath=os.path.join(basedir, obj.name + '.obj'),
check_existing=True,filter_glob="*.obj;*.mtl", use_selection=True,
use_animation=False, use_mesh_modifiers=True, use_edges=True, 
use_smooth_groups=False, use_smooth_groups_bitflags=False,
use_normals=True, use_uvs=False, use_materials=True, 
use_triangles=True, use_nurbs=False, use_vertex_groups=False, 
use_blen_objects=False, group_by_object=True,
group_by_material=True, keep_vertex_order=False, global_scale=1.0, 
path_mode="AUTO", axis_forward="-Z", axis_up="Y")

オプションの解説ですが、
multiobj_export.pyでは繰り返し文(for loop)で選択状態のオブジェクトをエクスポートする処理を行っています。なので、use_selectionは必ずTrueにします。また、WebGLで描画するときには.objに加えて.mtlファイルが必要なのでfilter_glob="*.obj;*.mtl"とします。

pythonで実行して.objと.mtlファイルが出力されれば成功です。

次に、.objと.mtlをWebGLで読み込めるJSON形式に変換するコードのリンクを貼っておきます。

convert_obj_three.py  <-昔のthree.jsのレポジトリへのリンク

convert_obj_three.pyの使い方は次の通りです。

python .\convert_obj_three.py -i yourModel.obj -o yourModel.json

-iのオプションは入力(input)ファイル名 + .objを、 -oのオプションは出力(output)ファイル名 + .jsonを指定します。

一括してJSONにしたいときは、powershellで次のように繰り返し処理すればOKです。

multi_converter.ps1

Param([string] $arg)
$itemList = Get-ChildItem -Name -Include *.obj $arg

foreach ($item in $itemList) {
   $fname = $arg + [System.IO.Path]::GetFileName($item)
   $json = $fname.replace('.obj','.json')
   python .\convert_obj_three.py -i $fname -o $json
}

コード解説ですが、
第1引数には.objと.mtlファイルがあるパスを指定します。
コードの1行目の$argという変数がそれに対応します。2行目は指定パスにある.obj形式のファイル名を抽出しリスト化しています。foreach内で繰り返しで7行目でpythonの変換コードを実行します。その上の5,6行目はファイル名を取得し、拡張子を変換して変数に格納しています。
コンソールで次のように実行すれば動きます。

multi_converter.ps1 指定パス

コメント

WebGLで描画するためのOBJ形式の変換コードconvert_obj_three.pyですが、threejsのレポジトリを見ると、開発コミュニティがglTF形式の対応に集中するためversion r92以降では廃止されていました...

JSONからWebGLで描画するまでの工程はいつか別のところに"しっかり"と動くところまで記せればと思いますが筆遅です。
ざっくりとした流れはこんな感じです。

画像1

参照

blender python API : bpy.ops.export_scene.obj() ページ下段
Blender stack exchange : export-multiple-objects-to-obj 
About Blender exporting for Three.js(WebGL) format
Real-Time 3D Graphics with WebGL2(書籍)






この記事が気に入ったらサポートをしてみませんか?