夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderのPythonで現在選択しているオブジェクトの使用しているマテリアルの色情報を取得する

本日はBlenderモデリング枠です。

〇選択しているオブジェクトからマテリアルの数を取得しマテリアル名の名前をリストに格納する

マテリアルの情報を取得するためにはまずはマテリアル数を取得し、マテリアル名をリストに格納します。

これはBlenderを含め3Dモデルは一つのオブジェクトに複数のマテリアルを保持することができるため最初にマテリアルをリストとして格納することで複数のマテリアルを使用している状況に対処することができます。

これは次のような処理で実現できます。

import bpy


# 現在選択中のオブジェクトを取得
selected_objects = bpy.context.selected_objects

# マテリアル名を格納するリスト
material_names = []

# 選択中の各オブジェクトのマテリアル名を取得してリストに格納
for obj in selected_objects:
    if obj.type == 'MESH':  # メッシュオブジェクトのみ処理する
        for slot in obj.material_slots:
            if slot.material:
                material_names.append(slot.material.name)

# マテリアル名をコンソールに出力
for name in material_names:
    print(name)

これを実行すると次のようにコンソールにマテリアル名が出力されます。

〇任意のマテリアルの色情報を取得する

次に色情報を取得します。

material_names[i]でi番目のマテリアルスロットのマテリアルを選択することができます。

次のようなコードでコンソールログにRGBAの色情報を出力できます。

import bpy

# 現在選択中のオブジェクトを取得
selected_objects = bpy.context.selected_objects

# マテリアル名を格納するリスト
material_names = []

# 選択中の各オブジェクトのマテリアル名を取得してリストに格納
for obj in selected_objects:
    if obj.type == 'MESH':  # メッシュオブジェクトのみ処理する
        for slot in obj.material_slots:
            if slot.material:
                material_names.append(slot.material.name)

# マテリアル名をコンソールに出力
for name in material_names:
    print(name)

# 特定のマテリアルのベースカラー情報を取得してコンソールに出力
selected_material_index = 0  # 出力したいマテリアルのインデックス(0から始まる)
if selected_material_index < len(material_names):
    selected_material_name = material_names[selected_material_index]
    selected_material = bpy.data.materials.get(selected_material_name)  # マテリアルの情報を取得
    if selected_material:  # マテリアルが正しければ
        base_color_node = selected_material.node_tree.nodes.get("Principled BSDF")
        if base_color_node:
            base_color = base_color_node.inputs["Base Color"].default_value
            print(f"Material: {selected_material_name}")
            print(f"Base Color (RGBA): ({base_color[0]}, {base_color[1]}, {base_color[2]}, {base_color[3]})")
        else:
            print(f"Base color node not found in material '{selected_material_name}'.")
    else:  # 不正なマテリアルの場合
        print("Invalid material index")
else:
    print("Invalid material index")

base_color_node = selected_material.node_tree.nodes.get("Principled BSDF")はまずBlenderのシェーダーのプロパティにアクセスするためにノードを指定しています。

 つまり上記コードはあくまでPrincipled BSDFシェーダーを使用しているマテリアルに限定されるコードになります。

base_color = base_color_node.inputs["Base Color"].default_valueによってBase Colorのプロパティを取得しています。

これを実行するとコンソールに次のようにログを出力できます。

以上でPythonで現在選択しているオブジェクトの使用しているマテリアルの色情報を取得できました。