見出し画像

blender,pythonでミックスノードをコントロールしてマテリアル3種類を切り替える

#


def create_mixed_material(name, colors):
    
    """
    任意の3色を切り替えるミックスマテリアルを作成します。
    
    Args:
        name (str): マテリアル名。
        colors (list): 色リスト [(R, G, B, A), (R, G, B, A), (R, G, B, A)]。
    
    Returns:
        bpy.types.Material: 作成したマテリアル。
    """
    mat = bpy.data.materials.get(name)
    if mat is None:
        mat = bpy.data.materials.new(name=name)
        mat.use_nodes = True
        
        nodes = mat.node_tree.nodes
        links = mat.node_tree.links
        
        # ノードのクリア
        for node in nodes:
            nodes.remove(node)
        
        # ノードの追加
        output_node = nodes.new(type="ShaderNodeOutputMaterial")
        mix_shader_1 = nodes.new(type="ShaderNodeMixShader")
        mix_shader_2 = nodes.new(type="ShaderNodeMixShader")
        diffuse_1 = nodes.new(type="ShaderNodeBsdfDiffuse")
        diffuse_2 = nodes.new(type="ShaderNodeBsdfDiffuse")
        diffuse_3 = nodes.new(type="ShaderNodeBsdfDiffuse")
        
        # 各シェーダーの設定
        diffuse_1.inputs["Color"].default_value = colors[0]
        diffuse_2.inputs["Color"].default_value = colors[1]
        diffuse_3.inputs["Color"].default_value = colors[2]
        
        # ミックスシェーダー1を構成
        links.new(diffuse_1.outputs["BSDF"], mix_shader_1.inputs[1])
        links.new(diffuse_2.outputs["BSDF"], mix_shader_1.inputs[2])
        
        # ミックスシェーダー2を構成
        links.new(mix_shader_1.outputs["Shader"], mix_shader_2.inputs[1])
        links.new(diffuse_3.outputs["BSDF"], mix_shader_2.inputs[2])
        
        # 出力ノードに接続
        links.new(mix_shader_2.outputs["Shader"], output_node.inputs["Surface"])
        
        # ファクター用ノードを追加
        factor_node_1 = nodes.new(type="ShaderNodeValue")
        factor_node_2 = nodes.new(type="ShaderNodeValue")
        
        factor_node_1.outputs[0].default_value = 0.0  # 最初はシェーダー1
        factor_node_2.outputs[0].default_value = 0.0  # 最初はミックスシェーダー1
        
        links.new(factor_node_1.outputs[0], mix_shader_1.inputs["Fac"])
        links.new(factor_node_2.outputs[0], mix_shader_2.inputs["Fac"])
    
    return mat

import bpy

def main():
    # 既存のオブジェクトとマテリアルを削除,カメラとライトを作成
    for obj in bpy.data.objects:
        bpy.data.objects.remove(obj, do_unlink=True)
    for mat in bpy.data.materials:
        bpy.data.materials.remove(mat, do_unlink=True)
    if not any(obj.type == 'CAMERA' for obj in bpy.data.objects):
        bpy.ops.object.camera_add(location=(0, -10, 5), rotation=(1.1, 0, 0))
    if not any(obj.type == 'LIGHT' for obj in bpy.data.objects):
        bpy.ops.object.light_add(type='POINT', location=(5, -5, 10))

    # 球体を作成
    bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 1))
    sphere = bpy.context.object
    bpy.ops.object.shade_smooth()
    sphere.name = "Sphere"

    # 3色ミックスマテリアルを作成
    colors = [
        (1.0, 0.0, 0.0, 1.0),  # 赤
        (0.0, 0.0, 1.0, 1.0),  # 青
        (0.0, 1.0, 0.0, 1.0)   # 緑
    ]
    mixed_material = create_mixed_material("ThreeColorMix", colors)
    sphere.data.materials.append(mixed_material)

    # 色切り替えアニメーションを設定
    frame_start = 1
    frame_interval = 60  # 色が切り替わる間隔(フレーム数)
    total_switches = 6  # 切り替え回数

    for i in range(total_switches):
        # シェーダー1と2を切り替え
        frame = frame_start + i * frame_interval
        if i % 3 == 0:
            # 赤に切り替え
            bpy.data.materials["ThreeColorMix"].node_tree.nodes["Value"].outputs[0].default_value = 0.0
        elif i % 3 == 1:
            # 青に切り替え
            bpy.data.materials["ThreeColorMix"].node_tree.nodes["Value"].outputs[0].default_value = 0.5
        else:
            # 緑に切り替え
            bpy.data.materials["ThreeColorMix"].node_tree.nodes["Value"].outputs[0].default_value = 1.0

        # アニメーションキーを挿入
        bpy.data.materials["ThreeColorMix"].node_tree.nodes["Value"].outputs[0].keyframe_insert(data_path="default_value", frame=frame)

    # 初期フレームを設定
    bpy.context.scene.frame_set(1)

# 実行
main()

いいなと思ったら応援しよう!