【Pythonライブラリ】「bpy」のサンプルコード(Blender PythonAPI)

Blender

こちらはBlenderのPythonAPIである「bpy」(Pythonライブラリ)のサンプルコードについての記事となっております。

その他、3Dモデルの処理方法についての情報は下記の記事で紹介しております。
open3d/plotly/trimesh/pyvista/vedo/pytorch3d/matplotlibといったPythonライブラリや3DツールのPythonAPIであるbpy(Blender)/unreal(Unreal Engine)といったPythonライブラリについて気になる方はこちらの記事をご覧ください。

目次

基本情報 … Basic Information

「bpy」とは、PythonからBlenderの機能を呼び出すことができるBlender Python APIのことです。Blenderはオープンソースの3Dアニメーションソフトウェアであり、bpyを使うことでBlenderの様々な機能をPythonスクリプトから呼び出して利用することができます。

bpyを使うことで、Blenderで作成した3Dオブジェクトの自動生成、変形、レンダリングなどをPythonスクリプトから制御することができます。また、BlenderのGUIで操作可能な機能をPythonスクリプトで実行することも可能です。

bpyには、Blenderで使用されるオブジェクトのデータ構造やカメラ、マテリアル、ライト、アーマチュアなどの機能が含まれています。Blenderで作成された3Dモデルの自動生成や変形、アニメーション作成などのタスクをPythonで自動化する場合に便利なライブラリです。

サンプルコード … Sample Code

001 Blenderプロジェクト内のコレクションデータの表示

Assign Collection Data in Python List and Show Collection Data in the Blender Project

import bpy

# 定義
bpy_collections = bpy.data.collections
collection_list = [ collection for collection in bpy_collections]

# 表示
print(f"Collection:\n{collection_list}")

上記のPythonプログラムは、Blenderで作成された3Dアニメーションにおいて、コレクションの一覧を表示するものです。

まず、bpy.data.collectionsオブジェクトを使ってコレクションを取得し、リスト内包表記を使ってコレクションのリストを作成します。 そして、print関数を使って、コレクションのリストを表示します。

このプログラムは、Blenderのスクリプトエディタで実行できます。スクリプトエディタを開いて、新しいファイルを作成し、このコードを貼り付けて実行します。実行すると、コンソールにコレクションの一覧が表示されます。

コレクションデータの表示

Collection:
[bpy.data.collections[‘Collection’]]

002 Blenderプロジェクト内のシーンデータの表示

Assign Scene Data in Python List and Show Scene Data in the Blender Project

import bpy

# 定義
bpy_scenes = bpy.data.scenes
scene_list = [ scene for scene in bpy_scenes]

# 表示
print(f"Scene:\n{scene_list}")

上記の Python コードは、Blender でシーンを取得する方法を示しています。
まず、bpy.data.scenes を使用して、すべてのシーンを取得し、リストに格納します。次に、リスト内包表記を使用して、リスト内の各シーンをループして、新しいリストに格納します。
最後に、print() 関数を使用して、シーンのリストを表示します。

このコードを実行すると、Blender コンソールに、すべてのシーンのリストが表示されます。
このプログラムを使用すると、Python を使用して Blender のシーンを操作できます。

シーンデータの表示

Scene:
[bpy.data.scenes[‘Scene’]]

003 Blenderプロジェクト内のオブジェクトデータの表示

Assign Object Data in Python List and Show Object Data in the Blender Project

import bpy

# 定義
bpy_objects = bpy.data.objects
object_list = [ object for object in bpy_objects]

# 表示
print(f"Object:\n{object_list}",end="\n\n")

# 表示
print(f"Object Information:")
for object in object_list:
    print(f"{repr(object)}: {object.type} -> {repr(object)}.data: {repr(object.data.type_recast())}")

上記のPythonプログラムは、Blenderのオブジェクトに関する情報を表示するプログラムです。このプログラムでは、まずすべてのオブジェクトをリストに格納し、その後、各オブジェクトのタイプとデータタイプを表示します。

このプログラムを実行すると、Blenderのすべてのオブジェクトと、各オブジェクトのタイプとデータタイプが表示されます。

オブジェクトデータの表示

Object:
[bpy.data.objects[‘Camera’], bpy.data.objects[‘Cube’], bpy.data.objects[‘Light’]]

Object Information:
bpy.data.objects[‘Camera’]: CAMERA -> bpy.data.objects[‘Camera’].data: bpy.data.cameras[‘Camera’]
bpy.data.objects[‘Cube’]: MESH -> bpy.data.objects[‘Cube’].data: bpy.data.meshes[‘Cube’]
bpy.data.objects[‘Light’]: LIGHT -> bpy.data.objects[‘Light’].data: bpy.data.lights[‘Light’]

004 Blenderプロジェクト内のメッシュデータの表示

Assign Mesh Data in Python List and Show Mesh Data in the Blender Project

import bpy

# 定義
bpy_meshes = bpy.data.meshes
mesh_list = [ mesh for mesh in bpy_meshes]

# 表示
print(f"Mesh:\n{mesh_list}")

上記のPythonプログラムは、Blenderで使用されるメッシュオブジェクトを取得する方法を示しています。

まず、bpy.data.meshesを使用して、Blenderファイル内のすべてのメッシュオブジェクトにアクセスします。その後、リスト内包表記を使用して、mesh_listに各メッシュオブジェクトを追加します。

最後に、print文を使用してmesh_listを出力します。

メッシュデータの表示

Mesh:
[bpy.data.meshes[‘Cube’]]

005 Blenderプロジェクト内のカメラデータの表示

Assign Camera Data in Python List and Show Camera Data in the Blender Project

import bpy

# 定義
bpy_cameras = bpy.data.cameras
camera_list = [ camera for camera in bpy_cameras]

# 表示
print(f"Camera:\n{camera_list}")

このプログラムは、Blender内で使用されるカメラの一覧を表示するものです。

まず、bpy.data.camerasを使用して、Blender内のすべてのカメラを含むリストbpy_camerasを作成します。次に、リスト内包表記を使用して、すべてのカメラをcamera_listに追加します。最後に、print文を使用して、カメラリストを表示します。

カメラデータの表示

Camera:
[bpy.data.cameras[‘Camera’]]

006 Blenderプロジェクト内のライトデータの表示

Assign Light Data in Python List and Show Light Data in the Blender Project

import bpy

# 定義
bpy_lights = bpy.data.lights
light_list = [ light for light in bpy_lights]

# 表示
print(f"Light:\n{light_list}")

BlenderのPythonスクリプトを使用すると、オブジェクトの生成、変換、削除など、多くのタスクを自動化できます。この記事では、BlenderのPython APIを使用して、ライトのリストを取得する方法について説明します。

まず、bpy.data.lightsを使用して、Blenderのデータにアクセスします。次に、リスト内包表記を使用して、ライトのリストを作成します。最後に、print関数を使用して、リストを表示します。

ライトデータの表示

Light:
[bpy.data.lights[‘Light’]]

007 Blenderプロジェクト内のテクスチャデータの表示

Assign Texture Data in Python List and Show Texture Data in the Blender Project

import bpy

# 定義
bpy_textures = bpy.data.textures
texture_list = [ texture for texture in bpy_textures]

# 表示
print(f"Texture:\n{texture_list}")

上記のPythonプログラムは、Blender内のテクスチャ情報を取得するためのものです。

このプログラムでは、まずBlender内のテクスチャ情報を取得しています。そして、リスト内包表記を使って、すべてのテクスチャ情報をtexture_listに格納しています。

最後に、取得したテクスチャ情報を表示するためにprint文を使っています。

テクスチャデータの表示

Texture:
[]

008 Blenderプロジェクト内のマテリアルデータの表示

Assign Material Data in Python List and Show Material Data in the Blender Project

import bpy

# 定義
bpy_materials = bpy.data.materials
material_list = [ material for material in bpy_materials]

# 表示
print(f"Material:\n{material_list}")

上記のPythonプログラムは、Blenderで使用されるマテリアルをリストアップするものです。

まず、Blenderのbpyモジュールをインポートします。そして、bpy.data.materialsからマテリアルのリストを作成し、リストの各要素についてループ処理を行い、リスト全体を出力します。

このプログラムを実行することで、Blenderで使用されているマテリアルの一覧が取得できます。このリストを使用して、マテリアルの名前やプロパティを取得し、編集することができます。

マテリアルデータの表示

Material:
[bpy.data.materials[‘Dots Stroke’], bpy.data.materials[‘Material’]]

009 Blenderプロジェクト内の選択中のオブジェクトデータの表示

Assign Selected Object Data in Python List and Show Selected Object Data in the Blender Project

import bpy

# 定義
slected_object_list = bpy.context.selected_objects

# 表示
print(f"Selected Object:\n{slected_object_list}", end="\n\n")

# 表示
print(f"Selected Object Information:")
for object in slected_object_list:
    print(f"{repr(object)}: {object.type} -> {repr(object)}.data: {repr(object.data.type_recast())}")

上記のPythonプログラムは、Blenderで実行されるスクリプトで、選択されたオブジェクトの情報を表示します。

まず、スクリプトはbpy.context.selected_objectsを使用して、選択されたオブジェクトのリストを定義します。次に、各オブジェクトについて、そのタイプとデータのタイプを表示します。

選択中のオブジェクトデータの表示

Selected Object:[bpy.data.objects[‘Cube’], bpy.data.objects[‘Light’], bpy.data.objects[‘Camera’]]

Selected Object Information:
bpy.data.objects[‘Cube’]: MESH -> bpy.data.objects[‘Cube’].data: bpy.data.meshes[‘Cube’]
bpy.data.objects[‘Light’]: LIGHT -> bpy.data.objects[‘Light’].data: bpy.data.lights[‘Light’]
bpy.data.objects[‘Camera’]: CAMERA -> bpy.data.objects[‘Camera’].data: bpy.data.cameras[‘Camera’]

010 Blenderプロジェクト内のアクティブオブジェクトデータの表示

Assign Active Object Data in Python List and Show Active Object Data in the Blender Project

import bpy

# 定義
active_object = bpy.context.active_object

# 表示
print(f"{repr(active_object)}: {active_object.type} \
-> {repr(active_object)}.data: {repr(active_object.data.type_recast())}")

アクティブオブジェクトデータの表示

bpy.data.objects[‘Cube’]: MESH -> bpy.data.objects[‘Cube’].data: bpy.data.meshes[‘Cube’]

011 Blenderプロジェクト内の特定のメッシュデータの頂点情報の表示

Show Vertex Information for Specific Mesh Data in the Blender Project

import bpy

# 定義
mesh = bpy.data.meshes['Cube']
vertices = mesh.vertices

# 表示
print(f"Vertices Information:")
for vertex in vertices:
    print(f"Vertex [{vertex.index}]: ({vertex.co.x}, {vertex.co.y}, {vertex.co.z})")

特定のメッシュデータの頂点情報の表示

Vertices Information:
Vertex [0]: (1.0, 1.0, 1.0)
Vertex [1]: (1.0, 1.0, -1.0)
Vertex [2]: (1.0, -1.0, 1.0)
Vertex [3]: (1.0, -1.0, -1.0)
Vertex [4]: (-1.0, 1.0, 1.0)
Vertex [5]: (-1.0, 1.0, -1.0)
Vertex [6]: (-1.0, -1.0, 1.0)
Vertex [7]: (-1.0, -1.0, -1.0)

012 Blenderプロジェクト内の特定のメッシュデータの辺情報の表示

Show Edge Information for Specific Mesh Data in the Blender Project

import bpy

# 定義
mesh = bpy.data.meshes['Cube']
vertices = mesh.vertices
edges = mesh.edges

# 表示
print(f"Edges Information:")
for edge in edges:
    vid1, vid2 = edge.vertices
    v1 = vertices[vid1].co
    v2 = vertices[vid2].co
    print(f"E[{edge.index}] -> V[{vid1}]-V[{vid2}] \
    -> ({v1.x}, {v1.y}, {v1.z})-({v2.x}, {v2.y}, {v2.z})")

特定のメッシュデータの辺情報の表示

Edges Information:
E[0] -> V[5]-V[7] -> (-1.0, 1.0, -1.0)-(-1.0, -1.0, -1.0)
E[1] -> V[1]-V[5] -> (1.0, 1.0, -1.0)-(-1.0, 1.0, -1.0)
E[2] -> V[0]-V[1] -> (1.0, 1.0, 1.0)-(1.0, 1.0, -1.0)
E[3] -> V[7]-V[6] -> (-1.0, -1.0, -1.0)-(-1.0, -1.0, 1.0)
E[4] -> V[2]-V[3] -> (1.0, -1.0, 1.0)-(1.0, -1.0, -1.0)
E[5] -> V[4]-V[5] -> (-1.0, 1.0, 1.0)-(-1.0, 1.0, -1.0)
E[6] -> V[2]-V[6] -> (1.0, -1.0, 1.0)-(-1.0, -1.0, 1.0)
E[7] -> V[0]-V[2] -> (1.0, 1.0, 1.0)-(1.0, -1.0, 1.0)
E[8] -> V[7]-V[3] -> (-1.0, -1.0, -1.0)-(1.0, -1.0, -1.0)
E[9] -> V[6]-V[4] -> (-1.0, -1.0, 1.0)-(-1.0, 1.0, 1.0)
E[10] -> V[4]-V[0] -> (-1.0, 1.0, 1.0)-(1.0, 1.0, 1.0)
E[11] -> V[3]-V[1] -> (1.0, -1.0, -1.0)-(1.0, 1.0, -1.0)

013 Blenderプロジェクト内の特定のメッシュデータの面情報の表示

Show Face Information for Specific Mesh Data in the Blender Project

import bpy

# 定義
mesh = bpy.data.meshes['Cube']
vertices = mesh.vertices
faces = mesh.polygons

# 表示
print(f"Faces Information:")
for face in faces:
    print(f"F[{face.index}]")
    for vid in face.vertices:
        vco = vertices[vid].co
        print(f"\tV[{vid}]: ({vco.x}, {vco.y}, {vco.z})")

特定のメッシュデータの面情報の表示

Faces Information:
F[0]
V[0]: (1.0, 1.0, 1.0)
V[4]: (-1.0, 1.0, 1.0)
V[6]: (-1.0, -1.0, 1.0)
V[2]: (1.0, -1.0, 1.0)
F[1]
V[3]: (1.0, -1.0, -1.0)
V[2]: (1.0, -1.0, 1.0)
V[6]: (-1.0, -1.0, 1.0)
V[7]: (-1.0, -1.0, -1.0)
F[2]
V[7]: (-1.0, -1.0, -1.0)
V[6]: (-1.0, -1.0, 1.0)
V[4]: (-1.0, 1.0, 1.0)
V[5]: (-1.0, 1.0, -1.0)
F[3]
V[5]: (-1.0, 1.0, -1.0)
V[1]: (1.0, 1.0, -1.0)
V[3]: (1.0, -1.0, -1.0)
V[7]: (-1.0, -1.0, -1.0)
F[4]
V[1]: (1.0, 1.0, -1.0)
V[0]: (1.0, 1.0, 1.0)
V[2]: (1.0, -1.0, 1.0)
V[3]: (1.0, -1.0, -1.0)
F[5]
V[5]: (-1.0, 1.0, -1.0)
V[4]: (-1.0, 1.0, 1.0)
V[0]: (1.0, 1.0, 1.0)
V[1]: (1.0, 1.0, -1.0)

014 Blenderプロジェクト内の特定のオブジェクトデータの位置情報の表示

Show Location Information for Specific Object Data in the Blender Project

import bpy

# 定義
object = bpy.data.objects['Cube']

# 表示
print(f"Object Location: ", end="")
print(f"({object.location[0]}, {object.location[1]}, {object.location[2]})")

特定のオブジェクトデータの位置情報の表示

Object Location: (0.0, 0.0, 0.0)

015 Blenderプロジェクト内の特定のオブジェクトデータの回転情報の表示

Show Rotation Information for Specific Object Data in the Blender Project

import bpy
import math

# 定義
rot_mode_dict = \
            {"XYZ": "euler",
             "XZY": "euler",
             "YXZ": "euler",
             "YZX": "euler",
             "ZXY": "euler",
             "ZYX": "euler",
             "QUATERNION": "quaternion",
             "AXIS_ANGLE": "axis_angle"
            }

# 定義
object = bpy.data.objects['Cube']
rot_mode = object.rotation_mode

if rot_mode_dict[rot_mode] == "euler":

    # 定義
    rot_rad = object.rotation_euler

    # ラジアンから度数に変換
    rot_deg = [math.degrees(i) for i in rot_rad]

    # 表示
    print(f"Euler {rot_mode}")
    print(f"Object Rotation (rad): ({rot_rad[0]}, {rot_rad[1]}, {rot_rad[2]})")
    print(f"Object Rotation (deg): ({rot_deg[0]}, {rot_deg[1]}, {rot_deg[2]})")

elif rot_mode_dict[rot_mode] == "quaternion":
    
    # 定義
    rot_quat = object.rotation_quaternion

    # 表示
    print(f"Quaternion")
    print(f"Object Rotation: ({rot_quat[0]}, {rot_quat[1]}, {rot_quat[2]}, {rot_quat[3]})")
    
elif rot_mode_dict[rot_mode] == "axis_angle":
    
    # 定義
    rot_rad = object.rotation_axis_angle[0]
    rot_deg = math.degrees(rot_rad)
    rot_vec = object.rotation_axis_angle[1:]

    # 表示
    print(f"Axis-Angle")
    print(f"Object Rotation (rad): {rot_rad}, ({rot_vec[0]}, {rot_vec[1]}, {rot_vec[2]})")
    print(f"Object Rotation (deg): {rot_deg}, ({rot_vec[0]}, {rot_vec[1]}, {rot_vec[2]})")

特定のオブジェクトデータの回転情報の表示

Euler XYZ
Object Rotation (rad): (0.0, -0.0, 0.0)
Object Rotation (deg): (0.0, -0.0, 0.0)

Quaternion
Object Rotation: (1.0, 0.0, 0.0, 0.0)

Axis-Angle
Object Rotation (rad): 0.0, (0.0, 1.0, 0.0)
Object Rotation (deg): 0.0, (0.0, 1.0, 0.0)

016 Blenderプロジェクト内の特定のオブジェクトデータのスケール情報の表示

Show Scale Information for Specific Object Data in the Blender Project

import bpy

# 定義
object = bpy.data.objects['Cube']

# 表示
print(f"Object Scale: ", end="")
print(f"({object.scale[0]}, {object.scale[1]}, {object.scale[2]})")

特定のオブジェクトデータのスケール情報の表示

Object Scale: (1.0, 1.0, 1.0)

017 Blenderプロジェクト内の特定のオブジェクトデータの位置情報の編集/変更

Edit/Change Location Information for Specific Object Data in the Blender Project

import bpy

def print_object_location(input_str):
    print(f"{input_str}", end="")
    print(f"({object.location.x}, {object.location.y}, {object.location.z})")

# 定義
object = bpy.data.objects['Cube']

# 表示
print_object_location(f"Object Location (before): ")

# オブジェクト位置の編集
object.location = (1, 1, 1)

# 表示
print_object_location(f"Object Location (after): ")

特定のオブジェクトデータの位置情報の表示

Object Location (before): (1.0, 1.0, 1.0)
Object Location (after): (1.0, 1.0, 1.0)

ETC

#################################################

### Blender Library
import bpy

#################################################
### Properties >> Blender File >> Current File

print(bpy.data.brushes)
### <bpy_collection[44], BlendDataBrushes>

print(bpy.data.cameras)
### <bpy_collection[1], BlendDataCameras>

for VAR_camera in bpy.data.cameras:
    print(VAR_camera)
### <bpy_struct, Camera("Camera") at 0x000001CD5A606C48>

print(bpy.data.collections)
### <bpy_collection[2], BlendDataCollections>

for VAR_collection in bpy.data.collections:
    print(VAR_collection)
### <bpy_struct, Collection("Camera") at 0x000001CD5960DB28>
### <bpy_struct, Collection("Collection") at 0x000001CD5960F088>

print(bpy.data.lights)
### <bpy_collection[1], BlendDataLights>

print(bpy.data.linestyles)
### <bpy_collection[1], BlendDataLineStyles>

print(bpy.data.meshes)
### <bpy_collection[1], BlendDataMeshes>

for VAR_mesh in bpy.data.meshes:
    print(VAR_mesh)
### <bpy_struct, Mesh("Cube") at 0x000001CD5ACD6DD8>


### meshes -> mesh / polygons -> polygon / vertices -> vert_id

print(bpy.data.objects)
### <bpy_collection[3], BlendDataObjects>

print(bpy.data.scenes)
### <bpy_collection[1], BlendDataScenes>

for VAR_scene in bpy.data.scenes:
    print(VAR_scene)
### <bpy_struct, Scene("Scene") at 0x000001CD5AC13738>

print(bpy.data.screens)
### <bpy_collection[16], BlendDataScreens>

print(bpy.data.window_managers)
### <bpy_collection[1], BlendDataWindowManagers>

print(bpy.data.workspaces)
### <bpy_collection[10], BlendDataWorkSpaces>

print(bpy.data.worlds)
### <bpy_collection[1], BlendDataWorlds>

#################################################

print(bpy.data.curves)
### <bpy_collection[0], BlendDataCurves>

print(bpy.data.textures)
### <bpy_collection[0], BlendDataTextures>

print(bpy.data.materials)
### <bpy_collection[0], BlendDataMaterials>

#################################################

上記はBlender Libraryに関するPythonプログラムの例です。このプログラムは、Blenderファイル内の各オブジェクトの情報を取得する方法を示しています。

Blenderファイルには、カメラ、ライト、メッシュ、ワールド、マテリアルなど、さまざまなタイプのオブジェクトが含まれています。このプログラムは、それらのオブジェクトを取得するための方法を示しています。

プログラムは、bpy.dataというBlenderのデータベースにアクセスしています。このデータベースには、Blenderファイル内のすべてのオブジェクトが含まれています。

プログラムの最初の部分では、Blender Libraryをインポートしています。その後、bpy.dataから、カメラ、ライト、メッシュ、オブジェクト、ワールド、マテリアルなどの各コレクションにアクセスしています。

プログラムの残りの部分では、各コレクションをループして、その中の各オブジェクトにアクセスしています。例えば、メッシュコレクション内の各メッシュにアクセスするために、forループを使用しています。

参考リンク … Reference Link