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_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
animated_value = min_value + (max_value - min_value) * t
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'
bpy.context.scene.frame_start = 1
print(f"'{node_tree_name}' 内の 'Value' ノードにアニメーションを追加しました。")
else:
print(f"'{node_tree_name}' 内に 'Value' ノードが見つかりません。")
animate_scale_value(
node_tree_name="test_monky",
start_frame=0,
end_frame=100,
min_value=0.0,
max_value=3.0
)