我正在寻找一种创建新材质并选择它的方法,以在此材质中创建节点并为这些节点中的值设置动画。 这是我实际拥有的代码:
mat = bpy.ops.material.new()
mat_nodes = bpy.data.materials['USDiscoMaterial'].node_tree.nodes
但实际上,使用此代码,Blender将使用“USDiscoMaterial”重命名当前材料,并创建一个新材料但不选择它。 如果我想在这个材料中创建一个节点?
答案 0 :(得分:1)
您可以使用 -
创建一个使用节点(用于循环)的新材质mat = bpy.data.materials.new(name='USDiscoMaterial')
mat.use_nodes = True
mat_nodes = mat.node_tree.nodes
mat_links = mat.node_tree.links
# a new material node tree already has a diffuse and material output node
output = mat_nodes['Material Output']
diffuse = mat_nodes['Diffuse BSDF']
要添加新节点,请使用node_tree.nodes.new('type')
,其中可以找到可用节点类型列表on this page。大多数节点将其可编辑值存储在用于连接节点的输入套接字中。如果节点具有没有输入连接的值,则可以在每个节点的api引用中找到属性名称。
noise = mat_nodes.new('ShaderNodeTexNoise')
noise.inputs['Detail'].default_value = 5.0
cur_frame = bpy.context.scene.frame_current
noise.inputs['Detail'].keyframe_insert('default_value', frame=cur_frame)
要使材料工作,您还需要在节点之间添加链接 -
mat_links.new(noise.outputs['Color'], diffuse.inputs['Color'])
在检查对象中是否有可用的材质槽后,您可以将材质指定给对象。
obj = bpy.context.active_object
if len(obj.material_slots) == 0:
bpy.ops.object.material_slot_add()
obj.material_slots[0].material = mat