bpy(Blender Python API)を用いて、マテリアルに追加したテクスチャノード内の変数の設定値を変更するための汎用的な処理についてまとめておきます。

マテリアルを操作する上で、頻繁に微調整を行う項目なのでテキストベースで操作できるようにしておくことで、Gitなどで値のバージョン管理が可能です。


動作確認環境 : Blender 4.2


汎用的なノードの値変更


まずは、ノード中の変数の値を変更するための汎用的な処理を実装します。
  • マテリアル名
  • テクスチャノード名
  • 変数名
  • 設定する値
を指定してノードを判別し、値の変更を行います。

Python :
def node_value_change(
    material_name="MT_NAME"
,   node_name="TX_NODE_NAME"
,   element_name="Scale"
,   set_value="0"
):
    # マテリアルを取得
    material = bpy.data.materials.get(material_name)
    if material is not None:
        # ノードツリーを取得
        node_tree = material.node_tree
        
        # ノードを取得
        node = node_tree.nodes.get(node_name)
        if node is not None:
            # スロットを名前で取得して値を設定
            node.inputs[element_name].default_value = set_value
        else:
            print(f"Node '{node_name}' not found.")
    else:
        print(f"Material '{material_name}' not found.")

引数
  • material_name
    • 処理対象のマテリアル名
  • node_name
    • 処理対象のテクスチャノード名
  • element_name
    • 値を変更する変数名
  • set_value
    • 設定する変数

ノードの変数値の変更処理使用例


こちらの「Principled BSDF」の「Base Color」の値を変更する処理を例に使用例を示します。直接的に値で示されていないColorのような変数でも書き方によって上記処理を適用可能です。

Python :
def Base_create():
    bpy.ops.object.mode_set(mode='OBJECT')

    # 立方体を追加
    bpy.ops.mesh.primitive_cube_add(
        size=1
    ,   location=(0, 0, 1)
    ,   scale=(1,1,1)
    )
    # 名前設定
    bpy.context.object.name = "cube_00"

    # マテリアル追加
    add_new_material(material_name="MT_cube_00")

    # ノード 値変更
    node_value_change(
        material_name="MT_cube_00"
    ,   node_name="Principled BSDF"
    ,   element_name="Base Color"
    ,   set_value=(
            0.100     # red
        ,   0.700     # green
        ,   0.900     # blue
        ,   1         # alpha
        )
    )

Base_create()

14行目 :
▼add_new_material


18行目 :
追加したマテリアル名を指定

19行目:
ノード名を指定

20行目:
変数名を指定

21行目 :
ここでは、RGBで色を指定するため複数の値を指定します。
ScaleやFactorなど、単一の値で指定できるものは括弧で括る必要はありません。


Color Ramapノードの値変更


Color_Rampノードの値は、上の汎用的なテクスチャノードの値変更処理では対応しきれないので、個別に処理を実装しておきます。

Python :
def node_color_ramp_setting(
    material_name
,   node_name
,   color_0=(0,0,0,1)
,   color_1=(1,1,1,1)
,   position_0=0
,   position_1=1
,   interpolation="LINEAR"
):
    common_path = bpy.data.materials[material_name].node_tree.nodes[node_name]
    common_path.color_ramp.elements[0].color = color_0
    common_path.color_ramp.elements[1].color = color_1
    common_path.color_ramp.elements[0].position = position_0
    common_path.color_ramp.elements[1].position = position_1
    common_path.color_ramp.interpolation = interpolation

colorにRGBおよび透過率の値を引数として入力し、positionに0~1までの値を設定します。


Color Ramapノード変数変更処理の使用例


Python :
def Base_create():
    bpy.ops.object.mode_set(mode='OBJECT')

    # 立方体を追加
    bpy.ops.mesh.primitive_cube_add(
        size=1
    ,   location=(0, 0, 1)
    ,   scale=(1,1,1)
    )
    # 名前設定
    bpy.context.object.name = "cube_00"

    # マテリアル追加
    add_new_material(material_name="MT_cube_00")

    # テクスチャ追加
    add_new_texture(
        material_name="MT_cube_00"
    ,   texture_name="ShaderNodeValToRGB"
    ,   texture_node_name="Color_Ramp_00"
    ,   node_location=(-300, 200)
    )

    # ノードのリンク
    node_link_func(
        material_name="MT_cube_00"
    ,   texture_node_name_out="Color_Ramp_00"
    ,   texture_node_name_in="Principled BSDF"
    ,   output_link="Color"
    ,   input_link="Base Color"
    )

    # 色の変更
    node_color_ramp_setting(
        material_name="MT_cube_00"
    ,   node_name="Color_Ramp_00"
    ,   color_0=(0.1,0.1,0.1,1)
    ,   color_1=(0.2,0.2,0.2,1)
    ,   position_0=0
    ,   position_1=1
    ,   interpolation="LINEAR"
    )

Base_create()

17行目 :
▼add_new_texture
25行目 :
▼node_link_func


以上

このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット