マテリアルにテクスチャノードを追加して、接続するまでの処理をbpy(Blender Python API)を用いてテキストベースで簡略化したので、まとめておきます。
テクスチャを追加して、ノード間をリンクして次のような構造を構築可能です。
動作確認環境 : Blender 4.2
テクスチャ・ノードの追加
テクスチャ・ノードを追加します。
- マテリアル追加
- ノードを追加
Python :
def add_new_texture(
material_name="Material", # マテリアル名
texture_name="ShaderNodeTexName", # 追加するノードタイプ
texture_node_name="sample_texture_name", # 設定するノードの名前
node_location=(-400, 300), # ノード位置
settings=None # オプション設定
):
# シェーダーノードを持つマテリアルを取得または新規作成
material = bpy.data.materials.get(material_name)
if material is None:
material = bpy.data.materials.new(name=material_name)
# ノードを使用する設定へ変更
material.use_nodes = True
nodes = material.node_tree.nodes
# ノードを直接追加
texture_node = nodes.new(type=texture_name)
# ノードの名前を設定
texture_node.name = texture_node_name
# ラベル表示を設定
texture_node.label = f"{texture_node.name}"
# ノードの位置を設定
texture_node.location = node_location
# オプション設定があれば適用
if settings:
for setting in settings:
if hasattr(texture_node, setting['name']):
setattr(texture_node, setting['name'], setting['value'])
return texture_node
- material_name
- マテリアル名でマテリアルを指定
- texture_name
- 追加するテクスチャを指定
- texture_node_name
- ノードに付ける任意の名前
- node_location
- テクスチャノードの配置場所指定
- settings
- オプションの設定
ノード間の接続・リンク
上の処理で追加したノード間を接続するための処理を実装します。
接続元ノードのOutputの名前と、接続先のInputの名前を指定することでその間をマウスでドラッグして接続するように接続可能です。
Python :
def node_link_func(
material_name="Material"
, texture_node_name_out="TexNodeName_Out"
, texture_node_name_in="TexNodeName_in"
, output_link="Normal"
, input_link="Normal"
):
# シェーダーノードを持つマテリアルを取得または新規作成
material = bpy.data.materials.get(material_name)
if material is None:
material = bpy.data.materials.new(name=material_name)
# ノードを使用する設定へ変更
material.use_nodes = True
nodes = material.node_tree.nodes
# テクスチャノードを取得
from_node = nodes.get(texture_node_name_out)
if from_node is None:
print("[MyError] テクスチャが見つかりません")
# テクスチャノードを取得
to_node = nodes.get(texture_node_name_in)
if to_node is None:
print("[MyError] テクスチャが見つかりません")
# テクスチャノードの出力と入力接続
material.node_tree.links.new(from_node.outputs[output_link], to_node.inputs[input_link])
- material_name
- マテリアル名でマテリアルを指定
- texture_node_name_out
- 接続元ノード名
- texture_node_name_in
- 接続先ノード名
- output_link
- 接続元ノードのOutput
- input_link
- 接続先ノードのInput
テクスチャノード操作使用例
マテリアルを追加しテクスチャを追加して接続する例を2つ示します。
使用例1:基本的な操作
まず、マテリアルを追加しノイズノードテクスチャを追加してデフォルトの「Principled BSDF」と接続する例を示します。
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="ShaderNodeTexNoise"
, texture_node_name="TX_Noise_00"
, node_location=(-200, 200)
)
# ノードのリンク
node_link_func(
material_name="MT_cube_00"
, texture_node_name_out="TX_Noise_00"
, texture_node_name_in="Principled BSDF"
, output_link="Color"
, input_link="Base Color"
)
Base_create()
- 「MT_cube_00」マテリアル追加
- ノイズテクスチャ「ShaderNodeTexNoise」を「TX_Noise_00」という名前を付けて追加
- 「TX_Noise_00」と「Principled BSDF」ノードのColorを接続
add_new_textureの処理中でテクスチャノード名をノードエディタ上に表示する設定を行っているため、接続時ノード名はノードエディタに表示されているものを参考に接続します。
▼add_new_material
使用例2:オプションの使用
オプションを使用する場合の例を「RGB_Mix」ノードを使用して示します。
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="ShaderNodeMix"
, texture_node_name="Mix_RGB_00"
, node_location=(-200, 200)
, settings=[{"name": "data_type", "value": 'RGBA'}]
)
# ノードのリンク
node_link_func(
material_name="MT_cube_00"
, texture_node_name_out="Mix_RGB_00"
, texture_node_name_in="Principled BSDF"
, output_link="Result"
, input_link="Base Color"
)
Base_create()
22行目 :
オプションとして、[{"name": "data_type", "value": 'RGBA'}]を指定しています。
これを設定しない場合、このように別ノードとして生成されます。
以上