Blenderは3Dモデリング、アニメーション、レンダリングなど多機能なツールですが、
手作業だけで行うには時間がかかることもあります。
そこで活躍するのがPythonです!
BlenderではPythonを使って作業を自動化したり、複雑な操作をシンプルにすることができます。
本記事では、BlenderとPythonを組み合わせることで、
どんなことができるのかをわかりやすく解説していきます。
作業を少なくして!期待したものを作れる!
良いですね~
できること
今回は以下の5点を紹介します。
自動化やカスタマイズで、もっと楽ができる開発環境を作っていきましょう!
- モデリングの自動化
- アニメーションの制御
- バッチ処理
- UIのカスタマイズ
- カスタムアドオンの作成
実行環境:Blender 4.1.1
モデリングの自動化
オブジェクトを複数作成したり、パラメータを変更したりする作業を自動化できます。
たとえば、特定のパターンでオブジェクトを並べたり、
ランダムな配置を作成したりすることも可能です。
以下は立方体をランダムに配置した例です。
手作業ではバラバラに配置しようとしても時間がかかりますが、コードで書くと一瞬です。
コードサンプル
import bpy
import random
# 乱数範囲の設定
min_range = -10
max_range = 10
# 作成する立方体の数
num_cubes = 10
# 立方体を生成して配置.
for i in range(num_cubes):
# 立方体の生成
bpy.ops.mesh.primitive_cube_add(size=2)
# 作成した立方体をアクティブオブジェクトとして取得.
cube = bpy.context.object
# 立方体をランダムな位置に配置
cube.location = (
random.uniform(min_range, max_range), # x座標
random.uniform(min_range, max_range), # y座標
random.uniform(min_range, max_range) # z座標
)
# 立方体をランダムな大きさにスケール
scale_factor = random.uniform(0.5, 2.0)
cube.scale = (scale_factor, scale_factor, scale_factor)
アニメーションの制御
モデルの動きやカメラワークをPythonで制御できます。
特に複雑なアニメーションや複数のアクションを繰り返す場合は、
スクリプトを使用することでスムーズな管理が可能です。
以下はランダム配置した立方体に回転のアニメーションをつけた例です。
1個づつアニメーションをつける必要が無いのは楽ですね。
コードサンプル
以下コードを実行して、スペースキーなどでアニメーションを再生。
import bpy
import random
# 乱数範囲の設定.
min_range = -10
max_range = 10
# 作成する立方体の数.
num_cubes = 10
# すべての立方体を生成して配置し、回転アニメーションを設定.
for i in range(num_cubes):
# 立方体の生成
bpy.ops.mesh.primitive_cube_add(size=2)
# 作成した立方体をアクティブオブジェクトとして取.
cube = bpy.context.object
# ランダムな初期位置に配置.
cube.location = (
random.uniform(min_range, max_range), # x座標
random.uniform(min_range, max_range), # y座標
random.uniform(min_range, max_range) # z座標
)
# ランダムな初期回転を設定.
initial_rotation = (
random.uniform(0, 3.14), # x軸回りの回転 (ラジアン単位、約0〜180度).
random.uniform(0, 3.14), # y軸回りの回転.
random.uniform(0, 3.14) # z軸回りの回転.
)
# 初期回転のキーフレームを挿入 (フレーム10).
bpy.context.scene.frame_set(10)
cube.rotation_euler = initial_rotation
cube.keyframe_insert(data_path="rotation_euler", index=-1)
# ランダムな新しい回転を設定.
new_rotation = (
random.uniform(0, 3.14 * 2), # x軸回りの回転 (ラジアン単位、0〜360度).
random.uniform(0, 3.14 * 2), # y軸回りの回転.
random.uniform(0, 3.14 * 2) # z軸回りの回転.
)
# 新しい回転のキーフレームを挿入 (フレーム50).
bpy.context.scene.frame_set(50)
cube.rotation_euler = new_rotation
cube.keyframe_insert(data_path="rotation_euler", index=-1)
バッチ処理
バッチ処理とは、複数の処理をまとめて一度に実行することです。
複数のファイルを一度に処理したり、
異なる設定で同じ操作を複数のオブジェクトに適用することも可能です。
以下は複数のblenderファイルのレンダリングを一括で行う処理です。
実行すると入力フォルダ内のblenderファイルのレンダリングを実行し、
出力フォルダに結果を保存してくれます。
コードサンプル
まずはサンプル用のフォルダ構成です。
C:\Blender\sample_render以下に入れています。
①output : レンダリング結果を入れるフォルダ
②render_batch.py: レンダリングするバッチ。コードは後述
③sample_render1~3.blend: レンダリング対象。それぞれ色違いの立方体です。
次はrender_batch.pyの中身の紹介です。
こちらに先ほどレンダリング対象を追加したフォルダをblend_directoryに指定します。
レンダリング結果を出力するoutputフォルダの場所はoutput_directoryに設定しています。
import bpy
import os
# Blenderファイルが格納されているディレクトリ.
blend_directory = r"C:\\Blender\\sample_render\\" # 実際のパスに置き換えてください.
# 出力ディレクトリ
output_directory = r"C:\\Blender\\sample_render\\output\\" # 実際のパスに置き換えてください.
# ディレクトリ内のすべての.blendファイルを処理.
for filename in os.listdir(blend_directory):
if filename.endswith(".blend"):
# .blendファイルのパス.
blend_filepath = os.path.join(blend_directory, filename)
# .blendファイルを開く.
bpy.ops.wm.open_mainfile(filepath=blend_filepath)
# 出力ファイルのパス(ファイル名に.pngを付ける).
output_filepath = os.path.join(output_directory, filename.replace(".blend", ".png"))
# レンダリング設定.
bpy.context.scene.render.filepath = output_filepath
# シーンをレンダリングして画像を保存.
bpy.ops.render.render(write_still=True)
print(f"Rendered and saved: {output_filepath}")
実行すると、outputフォルダ内にレンダリングした結果が
pngファイルとして出力されます。
1度の実行で複数のblenderファイルのレンダリング結果を得ることができましたね。
対象のファイルを開いていなくても、実行できるので便利です。
UIのカスタマイズ
Blenderのインターフェースを自分仕様にカスタマイズできます。
不要なボタンを削除したり、便利な機能を新しいメニューとして追加したりすることが可能です。
以下は、立方体をランダム配置するコードをUIのボタンにした例です。
”モデリングの自動化”の例を”Generate Random Cubes”というボタンにしてます。
コードサンプル
import bpy
import random
# ランダムに立方体を生成.
def create_random_cube():
# 乱数範囲の設定.
min_range = -10
max_range = 10
# 作成する立方体の数.
num_cubes = 10
# 立方体を生成して配置.
for i in range(num_cubes):
# 立方体の生成
bpy.ops.mesh.primitive_cube_add(size=2)
# 作成した立方体をアクティブオブジェクトとして取得.
cube = bpy.context.object
# 立方体をランダムな位置に配置.
cube.location = (
random.uniform(min_range, max_range), # x座標.
random.uniform(min_range, max_range), # y座標.
random.uniform(min_range, max_range) # z座標.
)
# 立方体をランダムな大きさにスケール.
scale_factor = random.uniform(0.5, 2.0)
cube.scale = (scale_factor, scale_factor, scale_factor)
# ランダムに立方体を生成するオペレーター.
class OBJECT_OT_RandomCubeOperator(bpy.types.Operator):
bl_idname = "object.random_cube_operator"
bl_label = "Generate Random Cubes"
bl_description = "Generates multiple cubes at random positions"
def execute(self, context):
# 立方体をランダムな位置に生成.
create_random_cube()
self.report({'INFO'}, "Random cubes generated")
return {'FINISHED'}
# カスタムパネル: 新しいタブ「My Custom Tab」に追加.
class VIEW3D_PT_RandomCubePanel(bpy.types.Panel):
bl_label = "Random Cube Generator"
bl_idname = "VIEW3D_PT_random_cube_panel"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'My Custom Tab' # 新しいタブ「My Custom Tab」に表示
def draw(self, context):
layout = self.layout
row = layout.row()
# ランダムな立方体を生成するボタン
row.operator("object.random_cube_operator", text="Generate Random Cubes")
# 登録.
def register():
bpy.utils.register_class(OBJECT_OT_RandomCubeOperator)
bpy.utils.register_class(VIEW3D_PT_RandomCubePanel
if __name__ == "__main__":
register()
カスタムアドオンの作成
Blenderにはアドオン機能があり、Pythonで自分専用のツールを作成できます。
頻繁に使う機能やカスタマイズしたい操作を、
簡単に呼び出せるようにすることで作業効率がアップします。
また、スクリプトで実行した場合は、再起動するとその機能は消えてしまいますが、
アドオンとして登録すると機能が残り続けるので、ずっと使用できる状態にできます。
以下は、立方体のランダム配置のボタンをアドオンにする設定です。
画面は”UIのカスタマイズ”の例と変化はありませんが、コードと実行方法は変わってきます。
コードサンプル
bl_info = {
"name": "Random Cube Generator",
"blender": (4, 1, 1), # Blenderのバージョンに合わせて変更してください
"category": "Object"
}
import bpy
import random
# ランダムに立方体を生成.
def create_random_cube():
# 乱数範囲の設定.
min_range = -10
max_range = 10
# 作成する立方体の数.
num_cubes = 10
# 立方体を生成して配置.
for i in range(num_cubes):
# 立方体の生成
bpy.ops.mesh.primitive_cube_add(size=2)
# 作成した立方体をアクティブオブジェクトとして取得.
cube = bpy.context.object
# 立方体をランダムな位置に配置.
cube.location = (
random.uniform(min_range, max_range), # x座標.
random.uniform(min_range, max_range), # y座標.
random.uniform(min_range, max_range) # z座標.
)
# 立方体をランダムな大きさにスケール.
scale_factor = random.uniform(0.5, 2.0)
cube.scale = (scale_factor, scale_factor, scale_factor)
# ランダムに立方体を生成するオペレーター.
class OBJECT_OT_RandomCubeOperator(bpy.types.Operator):
bl_idname = "object.random_cube_operator"
bl_label = "Generate Random Cubes"
bl_description = "Generates multiple cubes at random positions"
def execute(self, context):
# 立方体をランダムな位置に生成.
create_random_cube()
self.report({'INFO'}, "Random cubes generated")
return {'FINISHED'}
# カスタムパネル: 新しいタブ「My Custom Tab」に追加.
class VIEW3D_PT_RandomCubePanel(bpy.types.Panel):
bl_label = "Random Cube Generator"
bl_idname = "VIEW3D_PT_random_cube_panel"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'My Custom Tab' # 新しいタブ「My Custom Tab」に表示
def draw(self, context):
layout = self.layout
row = layout.row()
# ランダムな立方体を生成するボタン
row.operator("object.random_cube_operator", text="Generate Random Cubes")
# アドオンの登録.
def register():
bpy.utils.register_class(OBJECT_OT_RandomCubeOperator)
bpy.utils.register_class(VIEW3D_PT_RandomCubePanel)
# アドオンの解除.
def unregister():
bpy.utils.unregister_class(OBJECT_OT_RandomCubeOperator)
bpy.utils.unregister_class(VIEW3D_PT_RandomCubePanel)
# スクリプトが直接実行された場合にアドオンを登録
if __name__ == "__main__":
register()
アドオンの登録
以下リンクで解説してますので、参考にしてみてください!
まとめ
今回はBlender上でPythonを利用して、自動化やカスタマイズをする方法を解説しました。
開発作業を進めていくと、どんどん独自性が生まれ、
他の人がやっていない作業も増えていきます。
そうなると、欲しいものは自分で用意していかなければなりません。
やりたいことを簡単に実現したり、他の作業を行う時間を生み出すためにも、
自動化やカスタマイズを行う術は身に着けていくことをおススメします!
おわり