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.")
引数
こちらの「Principled BSDF」の「Base Color」の値を変更する処理を例に使用例を示します。直接的に値で示されていないColorのような変数でも書き方によって上記処理を適用可能です。
Python :
14行目 :
▼add_new_material
18行目 :
追加したマテリアル名を指定
19行目:
ノード名を指定
20行目:
変数名を指定
21行目 :
ここでは、RGBで色を指定するため複数の値を指定します。
ScaleやFactorなど、単一の値で指定できるものは括弧で括る必要はありません。
Color_Rampノードの値は、上の汎用的なテクスチャノードの値変更処理では対応しきれないので、個別に処理を実装しておきます。
Python :
colorにRGBおよび透過率の値を引数として入力し、positionに0~1までの値を設定します。
Python :
17行目 :
▼add_new_texture
25行目 :
▼node_link_func
以上
- 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
以上