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]
links.new(diffuse_1.outputs["BSDF"], mix_shader_1.inputs[1])
links.new(diffuse_2.outputs["BSDF"], mix_shader_1.inputs[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
factor_node_2.outputs[0].default_value = 0.0
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"
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):
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()