Web Top Page

BlenderのPythonスクリプト

Blender初心者が最初に覚えるべき内容をまとめたページは、このリンクにあります。
このページは、Blender(Portable_4.1.1)のPythonスクリプトでここで行ったモデリングを試みる実験のページです。

Pythonスクリプトの実行方法

Blenderのデフォルトは「レイアウト」ですが、トップメニューから「スクリプト作成」(下記赤マル部)にすると、次のエリア配置になります。

この場合、中央エリアが「テキストエディタ」になります。ここから黄色部の開く操作でPythonソースファイルを開くと、実行ボタンが現れて実行できるようになります。
左の水色のエリアは「Pythonコンソール」で、ここに簡単な命令を記述してEnterすることでインタープリタの直接実行できます。
左のピンクのエリアは「情報」で、操作に対応するPythonコードがここに表示されます。 このコードをコピーして「Pythonコンソール」に貼り付けて実行させることができます。
また、「テキストエディタ」で実行した場合のエラーメッセージなども、この「情報」エリアに表示されます。
なおBlenderPortable_4.1.1において、「テキストエディタ」内のprint命令は、ここに出力されません。(SystemConsolも使えなかった)


Pythonスクリプトの実行方法 その2

以下は私の開発、実験時の実行方法の紹介です。
開発、実験時には、print命令で情報の確認をしたいのですが、「テキストエディタ」内のprint命令出力が、希望表示できません。(Ver.4.1.1)
「Pythonコンソール」においては、一般と同じようにprint命令がそのコンソールに表示されるので、ここで実験するのが使いやすいと考えます

上記の黄色マルを「情報」にしてGUI操作のコードを取得し、それを「Pythonコンソール」に切り替え使って貼り付け実行するように使っています。
またこの「Pythonコンソール」で、指定のソースコードを実行させる方法を以下で解説します。
実行させる方法は、『import モジュール名』を使います。(これでモジュール名.pyが、実行されることを利用します)

まず、ソースコードとの名前と、その位置を決めます。
以下はソースコードが「test.py」、その配置位置が「D:\work」の場合の例です。
その場合、次のコードを「Pythonコンソール」に貼り付けます。
import sys
sys.path.append('D:\\work')
これで、「Pythonコンソール」で下記を実行させれば、最初の「test.py」を実行することができます。
import test 
続けて、再び「test.py」を実行する場合は、「import test」は使えません。代わりに次のコードを貼り付けて実行させます。
from importlib import reload
reload( test )
これ以降で再び実行する場合、「reload( test )」だけを実行させます。
この方法の利点は、好みのエディタで編集できることです。
そしてその「Pythonコンソール」で、オーソドックスなprintによるデバック作業ができます。



アクティブオブジェクトとは?

例 (cubeオブジェクトを作って、そのアクティブオブジェクトを移動し、名前を変更して確認する)
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0), scale=(1, 1, 1)) # 立方体作成(戻り値なし)
obj = bpy.context.active_object # 直前でアクセスしたアクティブなオブジェクト取得
obj.location = (obj.location.x + 1.0, obj.location.y + 2.0, obj.location.z + 3.0) # 移動
obj.name='直方体'
print(f"{obj.name} {obj.type} {bpy.data.objects['直方体'].location}") # '直方体 MESH <Vector (1.0000, 2.0000, 3.0000)>'
上記bpy.ops.mesh.primitive_cube_addのオブジェクト生成メソッドにしたは戻り値がありませんが、 実行直後では、生成オブジェクトは、アクティブオブジェクトになります。
obj=bpy.context.active_objectで、objに現在のシーンでアクティブなオブジェクトが得られます。
上記では、それを操作して移動しています。

選択した複数のオブジェクトの中から1つのオブジェクトが「アクティブオブジェクト」として扱われます。
アクティブオブジェクトは、例えば変換操作(移動、回転、スケール)やモディファイアの適用、 その他の操作の基準として使用されます。
なお、全てのオブジェクトが非選択状態など、アクティブオブジェクトが存在しない場合は、 bpy.context.active_objectがNoneになります。

objをアクティブなオブジェクトを指定するには、次のようにします。
bpy.context.view_layer.objects.active = obj
なお、アクティブオブジェクトにするには、そのオブジェクトを選択状態にする必要があるため、選択状態にします。
obj.select_set(True)

bmeshモジュールを利用する例
import bpy
import bmesh
obj=bpy.data.objects['Cube'] # bpy.types.Object型
bpy.ops.object.mode_set(mode='EDIT')# 編集モードにする
bm = bmesh.from_edit_mesh(obj.data) # bpy.types.Meshのobj.dataから、BMesh型を取得
# bm.verts[0]は BMVert型です。bm.verts[0].co の表現で、Vector((1.0, 1.0, 1.0))のようなデータが得られる。




新しいメッシュに頂点、辺、面を追加する例

import bpy

mesh = bpy.data.meshes.new("MyMesh")# 新しいメッシュを作成
verts = [(0, 0, 0), (1, 0, 0), (1, 1, 0), (0, 1, 0)]  # 4つの頂点(頂点データを用意)
faces = [(0, 1, 2, 3)]  # 1つの面を作成 # 面のインデックスを指定
mesh.from_pydata(verts, [], faces)# メッシュに頂点と面を設定(2番目の引数は辺のデータ)

obj = bpy.data.objects.new("MyObject", mesh)# オブジェクトを作成し、メッシュを割り当てる
bpy.context.collection.objects.link(obj)# シーンに追加
上記のmesh.from_pydataで、面だけ作っていますが、辺も自動的に作られます。
面を無しにして、辺だけを作る場合は、次のようになります。
edges = [(0, 1), (1, 2), (2, 3), (3, 0)]# 辺のインデックスを指定
mesh.from_pydata(verts, edges, [])# メッシュに頂点と辺を設定


上記の手法で、実験したPythonスクリプト