自动为实例化的 Blender 对象分配不同的颜色
Assign different colors for instanced Blender objects automatically
我希望能够实例化一个 object/objects 并给它随机颜色(出于某种搅拌机内部原因,似乎有必要为材料创建一个唯一的名称)。
当我手动执行此操作并将命令从 信息上下文菜单 中复制到一个多维数据集时,它似乎有效。但是,一旦我尝试将一个简单的脚本放在一起,它就不会。对于以下代码,我得到一个 AttributeError
,因为显然属性 name
不存在。
import bpy
import random
#delete everything
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
bpy.ops.mesh.primitive_cube_add(size=2, align='WORLD', location=(0, 0, 0))
bpy.ops.material.new()
#create unique name for material
bpy.context.object.active_material.name = "test"
r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255)
#change material
bpy.data.materials[name].node_tree.nodes["Principled BSDF"].inputs[0].default_value = (r, g, b, 1)
我看过 Assign a material to an object in Blender using Python and Artistic Coding in Blender by David Mignot - YouTube。
我认为这是您想要的操作
如 here 中所述,这非常棘手,您需要设置输入和输出着色器并link 正确设置
import bpy
import random
mat = bpy.data.materials.new(name="test")
mat.use_nodes = True
if mat.node_tree:
mat.node_tree.links.clear()
mat.node_tree.nodes.clear()
nodes = mat.node_tree.nodes
links = mat.node_tree.links
output = nodes.new(type='ShaderNodeOutputMaterial')
#shader = nodes.new(type='ShaderNodeBsdfDiffuse')
shader = nodes.new(type='ShaderNodeBsdfPrincipled')
r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255)
nodes["Principled BSDF"].inputs[0].default_value = (r/255, g/255, b/255, 1)
links.new(shader.outputs[0], output.inputs[0])
bpy.ops.mesh.primitive_cube_add(size=2, align='WORLD', location=(0, 0, 0))
bpy.context.active_object.data.materials.append(mat)
我希望能够实例化一个 object/objects 并给它随机颜色(出于某种搅拌机内部原因,似乎有必要为材料创建一个唯一的名称)。
当我手动执行此操作并将命令从 信息上下文菜单 中复制到一个多维数据集时,它似乎有效。但是,一旦我尝试将一个简单的脚本放在一起,它就不会。对于以下代码,我得到一个 AttributeError
,因为显然属性 name
不存在。
import bpy
import random
#delete everything
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
bpy.ops.mesh.primitive_cube_add(size=2, align='WORLD', location=(0, 0, 0))
bpy.ops.material.new()
#create unique name for material
bpy.context.object.active_material.name = "test"
r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255)
#change material
bpy.data.materials[name].node_tree.nodes["Principled BSDF"].inputs[0].default_value = (r, g, b, 1)
我看过 Assign a material to an object in Blender using Python and Artistic Coding in Blender by David Mignot - YouTube。
我认为这是您想要的操作
如 here 中所述,这非常棘手,您需要设置输入和输出着色器并link 正确设置
import bpy
import random
mat = bpy.data.materials.new(name="test")
mat.use_nodes = True
if mat.node_tree:
mat.node_tree.links.clear()
mat.node_tree.nodes.clear()
nodes = mat.node_tree.nodes
links = mat.node_tree.links
output = nodes.new(type='ShaderNodeOutputMaterial')
#shader = nodes.new(type='ShaderNodeBsdfDiffuse')
shader = nodes.new(type='ShaderNodeBsdfPrincipled')
r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255)
nodes["Principled BSDF"].inputs[0].default_value = (r/255, g/255, b/255, 1)
links.new(shader.outputs[0], output.inputs[0])
bpy.ops.mesh.primitive_cube_add(size=2, align='WORLD', location=(0, 0, 0))
bpy.context.active_object.data.materials.append(mat)