自动为实例化的 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)