見出し画像

Blender、ジオメトリーノード内の 'Value' ノードにフレームアニメーションをPythonから追加。

import bpy

def animate_scale_value(node_tree_name, start_frame, end_frame, min_value=0.0, max_value=3.0):
    """
    ジオメトリーノード内の 'Value' ノードにフレームアニメーションを追加。
    
    Args:
        node_tree_name (str): ジオメトリーノードグループの名前。
        start_frame (int): アニメーションの開始フレーム。
        end_frame (int): アニメーションの終了フレーム。
        min_value (float): 値の最小値。
        max_value (float): 値の最大値。
    """
    # ノードツリーを取得
    node_tree = bpy.data.node_groups.get(node_tree_name)
    if not node_tree:
        print(f"ノードグループ '{node_tree_name}' が見つかりません。")
        return

    # ノードを検索
    value_node = None
    for node in node_tree.nodes:
        if node.type == 'VALUE':  # 'Value' ノード
            value_node = node
            break

    if value_node:
        # 以前のアニメーションキーを削除
        if value_node.outputs[0].is_linked:
            animation_data = node_tree.animation_data
            if animation_data and animation_data.action:
                action = animation_data.action
                for fcurve in action.fcurves:
                    action.fcurves.remove(fcurve)

        # アニメーションキーを追加
        frame_range = end_frame - start_frame
        for frame in range(start_frame, end_frame + 1):
            t = (frame - start_frame) / frame_range  # 正規化された時間 (0.0 - 1.0)
            animated_value = min_value + (max_value - min_value) * t  # 線形補間

            # ノードの 'Value' 入力を更新
            value_node.outputs[0].default_value = animated_value

            # キーフレームを挿入
            value_node.outputs[0].keyframe_insert(data_path="default_value", frame=frame)

        # 補間設定
        animation_data = node_tree.animation_data
        if animation_data and animation_data.action:
            action = animation_data.action
            for fcurve in action.fcurves:
                for keyframe in fcurve.keyframe_points:
                    keyframe.interpolation = 'BEZIER'  # 補間方法を設定

        # シーンの開始フレームを1に設定
        bpy.context.scene.frame_start = 1

        print(f"'{node_tree_name}' 内の 'Value' ノードにアニメーションを追加しました。")
    else:
        print(f"'{node_tree_name}' 内に 'Value' ノードが見つかりません。")


# 使用例: 0フレームから100フレームで値を0から3に変化させる
animate_scale_value(
    node_tree_name="test_monky", 
    start_frame=0, 
    end_frame=100, 
    min_value=0.0, 
    max_value=3.0
)

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