我正在寻找一种方法来创建新 Material 并选择它,以在此 Material 中创建节点并对这些节点中的值进行动画处理。 这是我实际拥有的代码:
mat = bpy.ops.material.new()
mat_nodes = bpy.data.materials['USDiscoMaterial'].node_tree.nodes
但实际上,使用此代码,Blender 会将当前 Material 重命名为“USDiscoMaterial”,并创建一个新 Material 但不选择它。 如果我想在这个 Material 中创建一个节点?
最佳答案
您可以创建一种使用节点(用于循环)的新 Material -
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)
要使 Material 正常工作,您还需要在节点之间添加链接 -
mat_links.new(noise.outputs['Color'], diffuse.inputs['Color'])
检查对象中是否有可用的 Material 槽后,您可以将 Material 分配给该对象。
obj = bpy.context.active_object
if len(obj.material_slots) == 0:
bpy.ops.object.material_slot_add()
obj.material_slots[0].material = mat
关于python - 如何创建 Material 、选择它、使用该 Material 创建新节点并对它们进行动画处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185377/