Blenderのマテリアルでガラスの表現をオブジェクトに付与処理を、bpy(Blender Python API)を用いてテキストベースで実装し自動化しておきます。
「ShaderNodeBsdfGlass」のようないかにもな名前のテクスチャノードが新しいバージョンでは用意されていたのでこちらを使用してみます。
動作確認環境 : Blender 4.2
ガラス表現のテクスチャノード構成自動化
Glass Material :
次のようなテクスチャノードの構造を用いてガラスを表現するマテリアルを構成します。
- 透過性
- 反射率
- 屈折率 (IOR)
- 色味
- 表面の粗さ
生成するテクスチャノード構造 :
こちらの構造は、こちら↓を参考にさせていただいております。
複数のテクスチャノードを組み合わせる構造のため、プロジェクト毎に逐一設定するのが面倒ですのでこれらの生成をbpyを用いて自動化したものが以下です。
Python :
def MT_NODE_SET_Glass(
material_name="base_material"
, mix_shader_name="TX_Mix_Shader_00"
, base_position=-200
, IOR=1.45 # 屈折の調整(硝子1.4~1.6)
, Roughness=0.1 # 粗さ
):
# 現在のモードを保存
current_mode = bpy.context.object.mode
# Mix Shader 追加 (Mix)
# テクスチャ追加
add_new_texture(
material_name=material_name
, texture_name="ShaderNodeMixShader"
, texture_node_name=mix_shader_name
, node_location=(base_position, -100)
)
base_position = base_position - 200
# Glass BSDF 追加 (硝子)
add_new_texture(
material_name=material_name
, texture_name="ShaderNodeBsdfGlass"
, texture_node_name="TX_Glass_Bsdf_00"
, node_location=(base_position, -100)
)
# Trasparent BSDF 追加 (透過)
add_new_texture(
material_name=material_name
, texture_name="ShaderNodeBsdfTransparent"
, texture_node_name="TX_Transparent_Bsdf_00"
, node_location=(base_position, 0)
)
# Fresnel 追加 (フレネル)
add_new_texture(
material_name=material_name
, texture_name="ShaderNodeFresnel"
, texture_node_name="TX_Fresnel_00"
, node_location=(base_position, 100)
)
# --------------------
# - 接続
# --------------------
# ノードのリンク
node_link_func(
material_name=material_name
, texture_node_name_out="TX_Fresnel_00"
, texture_node_name_in=mix_shader_name
, output_link="Fac"
, input_link="Fac"
)
# ノードのリンク
node_link_func(
material_name=material_name
, texture_node_name_out="TX_Transparent_Bsdf_00"
, texture_node_name_in=mix_shader_name
, output_link="BSDF"
, input_link=1 # Shader[1]
)
# ノードのリンク
node_link_func(
material_name=material_name
, texture_node_name_out="TX_Glass_Bsdf_00"
, texture_node_name_in=mix_shader_name
, output_link="BSDF"
, input_link=2 # Shader[2]
)
# --------------------
# - 変数調節
# --------------------
# ノード 値変更
node_value_change(
material_name=material_name
, node_name="TX_Fresnel_00"
, element_name="IOR"
, set_value=IOR
)
# ノード 値変更
node_value_change(
material_name=material_name
, node_name="TX_Glass_Bsdf_00"
, element_name="IOR"
, set_value=IOR
)
# ノード 値変更
node_value_change(
material_name=material_name
, node_name="TX_Glass_Bsdf_00"
, element_name="Roughness"
, set_value=Roughness
)
# 元のモードに戻す
bpy.ops.object.mode_set(mode=current_mode)
▼add_new_texture / node_link_func
▼node_value_change
屈折率や粗さの値は、デフォルトでガラスの表現に近いものを設定しています。
マテリアルの追加後、引数に追加したマテリアルを指定することで自動的にテクスチャノードが追加のうえ、パラメータの設定が可能です。
ガラステクスチャノード生成処理使用例
使用例としてシンプルに、立方体オブジェクトを追加してガラスの表現のマテリアルを追加する処理を例に示します。
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")
MT_NODE_SET_Glass(
material_name="MT_cube_00"
, mix_shader_name="TX_Mix_Shader_00"
, base_position=-200
, IOR=1.45 # 屈折の調整(硝子1.4~1.6)
, Roughness=0.1 # 粗さ
)
# ノードのリンク
node_link_func(
material_name="MT_cube_00"
, texture_node_name_out="TX_Mix_Shader_00"
, texture_node_name_in="Material Output"
, output_link="Shader"
, input_link="Surface"
)
Base_create()
14行目でガラス表現のためのテクスチャノード構造を追加後、23行目で「Material Output」のSurfaceとMix ShaderのShaderを接続することで、オブジェクトにマテリアルを追加可能です。
▼add_new_material
以上