【30cm超え】「Neptune 4 Plus」を実際に使って徹底解説!(詳細をチェック!)

3Dモデリングを自動化!BlenderをPythonで操作する方法【コピペ可能】

〜景品表示法に基づく表記:本サイトのコンテンツにはプロモーションが含まれている場合があります〜

こんにちは、管理人のウノケンです。

今回は、BlenderをPythonで簡単に操作する方法について初心者向けに解説していきます。

Blenderは、3Dモデリングやアニメーション制作などに利用されるオープンソースの3Dアプリケーションです。Pythonとの親和性も高く、うまく使いこなすことができれば手作業による面倒な反復作業を自動化することが可能です。

この記事では、画像を豊富に用いてPythonスクリプトを使ったBlender操作の基本について解説していきます。3Dモデリング初心者の方や、Pythonになじみのない方でもコピペで操作を実行することができるので、ぜひ自分でも操作して自動化の利便性を感じてみてください。

それでは見ていきましょう!



「Pythonを使ったBlenderの自動化」の基本

そもそもBlenderって?

Blenderは、アニメやゲーム、映画の制作に使用されるオープンソースの3DCGソフトです。誰でも無料で使えるソフトながら、非常に高度で豊富な機能を備えています。

メタバースやVTuberをはじめとする3D制作需要の高まりに伴って使用するユーザ数が急増している、いま注目のソフトウェアです。

その導入のしやすさから、Blenderは3Dプリンター用のデータ作成にも用いられています。3Dプリントすることによって、モデリングしたオリジナルキャラを、PCの中だけでなく現実世界で楽しむことが可能です。

Blender Python APIを使ってできること

Blenderは、プログラミング言語であるPythonを使って多くの操作を自動化することが可能です。Blender Python APIと呼ばれるインターフェースを用いることで、GUIを使わずにPythonスクリプトから直接Blenderの機能を操作することができます。

通常はBlenderのGUI上でマウスやキーボードのショートカットキーを使って実行している操作も、Pythonスクリプトを賢く用いることで、自動化や高速なバッチ処理が可能になります。

Blender Python APIを使ってできることは、簡単なオブジェクトの配置や移動だけではありません。マテリアルやアニメーションの設定、ファイル入出力といった、さまざまなタスクを処理することが可能です。

この記事の後半では、Blender Python APIを使ってできる多くの具体的な操作について、基本事項を中心に解説しています。

 



Pythonを使ってBlenderを自動化する際の準備【画像あり】

個別の操作の解説に入る前に、BlenderをPythonスクリプトで操作するための準備について簡単に説明していきます。

この記事に記載の内容は基本的にBlender2.8以降に対応します。操作画面のスクリーンショットは、バージョン3.4.1を使用したものです。

BlenderとPythonのインストール

BlenderをPythonスクリプトで操作するためには、Blenderのソフトウェア自体をインストールする必要があります。公式ページからダウンロードすることが可能なので、使用するPCのOS(Mac/Windows/Linux)に合わせて適切なものをダウンロードしましょう。

Pythonは個別にインストールする必要はありません。BlenderをインストールしてしまえばデフォルトでPythonスクリプトを使用することが可能です。

Pythonスクリプトの記述

「Scripting」ワークスペースに移動

画面上部中央の「Scripting」をクリックし、「Scripting」ワークスペースに移動します。

デフォルトでは3Dビューポートが左上に小さく表示され、左下に対話形式のPythonコンソールが表示されます。

「新規」を押してPythonスクリプトを記述

つづいて、画面上部中央の「新規」ボタンをクリックします。

中央のテキストエディタがアクティブになり、Pythonスクリプトを記述できるようになります。

すでに記述されたPythonスクリプトを使用する場合、「新規」ではなく「開く」からファイルを開いて編集・実行することも可能です。

「実行ボタン▷」を押して実行

試しに簡単な操作を実行してみましょう。後述する「既存のメッシュを削除」するスクリプトを記述し、実行してみます。

無事立方体(Cube)メッシュが削除されました。

「実行ボタン▷」を押す代わりに、ショートカット「Alt(Macの場合はOption)」+「Pキー」を使って「実行」することも可能です。

Blender Python APIを使用する際の注意点

Blender Python APIを使用する際には、バージョンアップに伴う仕様変更に注意しましょう。

例えば、バージョン2.Xとバージョン3.Xでは「プリンシプルBSDF」の各パラメータに対応するインデックスが異なります。後述する「マテリアルの設定」のスクリプトにおいて、バージョンにあわせて適切に設定する必要が生じる項目です。

バージョン2.9とバージョン3.4におけるプリンシプルBSDFの各パラメータと対応するインデックス。「サブサーフェスIOR」と「サブサーフェス異方性」の2つが加わったことにより、バージョン3.4では「メタリック」以降のインデックスが変更されている。

このように、Blenderのバージョンアップに応じて仕様変更になる項目が存在するため、注意しておきましょう。

 



Pythonを使ったBlender自動化の基本操作7選

Pythonを使ったBlender自動化の基本操作を7つ取り上げて解説してきます。

Pythonを使ってBlenderを自動化する際の準備」の項目まで準備ができていれば、以下の項目はすべてコピペで実行することが可能です。Blender初心者の方や、Pythonに不慣れな方もぜひ手元の環境で実行してみてください。

基本操作の紹介の最後で、これらの基本操作を組み合わせて実行できる自動化処理の例も掲載しています。

既存のオブジェクトを削除

Blenderを起動したときにデフォルトで表示されている立方体(Cube)を削除したいときなどに使用します。

import bpy

for mesh in bpy.data.meshes:
    bpy.data.meshes.remove(mesh)

以降のスクリプトではbpyモジュールのインポートに関する記述(import bpy)を省略します。

メッシュの追加

新しくメッシュを追加する際に使用するスクリプトの一例を示します。引数に「セグメント」や「リング」、「半径」といったパラメータを指定することも可能です。

# UV球を追加
bpy.ops.mesh.primitive_uv_sphere_add() 

# パラメータを指定してUV球を追加
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, 
                                                                       ring_count=16, 
                                                                       radius=1.0, 
                                                                       calc_uvs=True, 
                                                                       enter_editmode=False, 
                                                                       align='WORLD', 
                                                                       location=(0.0, 0.0, 5.0), 
                                                                       rotation=(0.0, 0.0, 0.0), 
                                                                       scale=(5.0, 1.0, 1.0)) 

UV球以外のメッシュを追加する際の関数の例は以下の通りです。

  • 平面を追加:bpy.ops.mesh.primitive_plane_add()
  • 立方体を追加:bpy.ops.mesh.primitive_cube_add()
  • ICO球を追加:bpy.ops.mesh.primitive_ico_sphere_add()
  • 円柱を追加:bpy.ops.mesh.primitive_cylinder_add()
  • トーラスを追加:bpy.ops.mesh.primitive_torus_add()

(参考:Mesh Operators — Blender Python API

オブジェクトの移動

オブジェクトを移動させるスクリプトは以下の通りです。引数valueにはxyz方向のそれぞれに対する所望の移動量を指定します。

bpy.ops.transform.translate(value=(1,2,3))

実行すると、x方向に1、y方向に2、z方向に3だけオブジェクトが移動します。

(参考:Transform Operators — Blender Python API

オブジェクトの回転

オブジェクトを回転させるスクリプトは以下の通りです。引数valueには回転量(単位:ラジアン)、orient_axisには回転軸を指定します。

bpy.ops.transform.rotate(value=3.1415/2 ,orient_axis='X')

実行すると、オブジェクトがx軸回りにπ/2(=90°)だけ回転します。

(参考:Transform Operators — Blender Python API

オブジェクトのリサイズ(拡大・縮小)

オブジェクトをリサイズ(拡大・縮小)するスクリプトは以下の通りです。引数valueにはxyz方向のそれぞれに対する所望の拡大倍率を指定します。

bpy.ops.transform.resize(value=(3.0,0.5,1.0))

実行すると、x方向は3.0倍、y方向は0.5倍、z方向は1.0倍にオブジェクトがリサイズされます。

(参考:Transform Operators — Blender Python API



マテリアルを追加し、パラメータを設定する

新しいマテリアルを追加するスクリプトは以下の通りです。引数にマテリアルに設定したい名称を指定します。

material_new = bpy.data.materials.new('Blue')

この時点ではマテリアルの雛形が生成されただけの状態です。ちょうどGUI上の「マテリアルプロパティ」から「新規」ボタンをクリックした状態に相当します。

いくつかの設定を実行するため、引き続き以下のコードを実行します。

# 「ノードを使用」をオンにする
material_new.use_nodes = True 

#「プリンシプルBSDF」のインスタンスbsdfを生成する
bsdf = material_new.node_tree.nodes["プリンシプルBSDF"]

#プリンシプルBSDFの各種パラメータを設定する
bsdf.inputs[0].default_value = (0, 0, 1, 1) # 「ベースカラー」を緑色に設定
bsdf.inputs[9].default_value = 0 # 「粗さ」を0に設定
bsdf.inputs[17].default_value = 1 #「伝搬」を1に設定

inputsのインデックスとパラメータの対応はシェーダーエディターで確認することができます。

言語設定によって、"プリンシプルBSDF"ではエラーが出る場合があります。英語に設定されている場合は、"Principled BSDF"に変更して実行してみてください。

オブジェクトにマテリアルを追加する

作成したマテリアルをオブジェクトに追加するには、以下のスクリプトを実行します。

bpy.context.object.data.materials.append(material_new)

上記を実行すると、マテリアルプレビューモードで表示した際に、マテリアルが適切に設定されたことを確認することができます。

【コピペ可能】基本操作を組み合わせた自動化処理の例

最後に、今回紹介した基本操作を組み合わせて実現できる自動化処理の例を示します。Blenderのテキストエディタに以下のスクリプトを記述します。

import bpy
import numpy as np
import random

# パラメータtに応じて(x, y, z)座標を返す関数を定義する
def lissajous(t):
   x = np.cos(t * 3)*6
   y = np.sin(t * 3)*6
   z = np.cos(t * 5)*6
   return((x, y, z))

# 既存のオブジェクトを削除する
for mesh in bpy.data.meshes:
    bpy.data.meshes.remove(mesh)

# 100個のオブジェクトを繰り返し作成する
ts = np.linspace(0, 2* np.pi, 100)
for i in range(len(ts) - 1):

    # オブジェクトを配置するxyz座標を設定する
    pos = lissajous(ts[i])
    
    # パラメータ設定に使用するランダム値を生成する
    rand1 = random.random()
    rand2 = random.random()
    rand3 = random.random()
   
    # トーラスを追加する
    bpy.ops.mesh.primitive_torus_add()

    # 設定したxyz座標にオブジェクトを移動する
    bpy.ops.transform.translate(value=pos)

    # オブジェクトをx軸・y軸・z軸回りに回転させる
    bpy.ops.transform.rotate(value=3.1415*rand1 ,orient_axis='Y')
    bpy.ops.transform.rotate(value=3.1415*rand2 ,orient_axis='Z')
    bpy.ops.transform.rotate(value=3.1415*rand3 ,orient_axis='X')

    # x方向、y方向、z方向のそれぞれにランダムな倍率でオブジェクトをリサイズする
    bpy.ops.transform.resize(value=(0.5+rand1/2,0.5+rand2/2,0.5+rand3/2))

    # マテリアルを追加する
    material_new = bpy.data.materials.new('Random')

    # 「ノードを使用」をオンにする
    material_new.use_nodes = True 

    #「プリンシプルBSDF」のインスタンスを生成する
    bsdf = material_new.node_tree.nodes["プリンシプルBSDF"]

    #プリンシプルBSDFの各種パラメータを設定する
    bsdf.inputs[0].default_value = (rand1, rand2, rand3, 1) # 「ベースカラー」をランダムに設定
    bsdf.inputs[6].default_value = 1 # 「メタリック」を1に設定
    bsdf.inputs[9].default_value = 0 # 「粗さ」を0に設定
    bsdf.inputs[17].default_value = 1 #「伝搬」を1に設定

    # オブジェクトにマテリアルを追加する
    bpy.context.object.data.materials.append(material_new)

これを実行すると、以下のようにマテリアルの設定されたオブジェクトが自動生成されます。

サイズや回転角、色の異なる多数のオブジェクトを何個も生成することは、手作業で行うにはあまりにも大変です。このように、マウスとキーボードで実施するには長い時間のかかる操作も、コードさえ書いておけば一瞬で実行することが可能です。



まとめ

今回は、BlenderをPythonで簡単に操作する方法について初心者向けに解説してきました。

今回紹介した操作は、Blender Python APIを用いたほんの一部の機能です。さらに幅広い機能を使いこなせるようになると、ライティングやレンダリング、アニメーションの設定を実行できることはもちろんのこと、オリジナルのアドオンを作成したりすることも可能になります。

Blender Python APIに関する日本語の情報は少ないです。もっと詳しい技術について興味のある方は、以下のようなBlender×Pythonの専門書籍を用いた学習も検討してみてください。

created by Rinker
¥3,386 (2024/03/05 06:51:25時点 Amazon調べ-詳細)

今回は「オブジェクトモード」における操作が基本でした。Pythonによる「編集モード」の操作についても知りたい!という方は以下の記事もご参照ください。