Blender Python脚本开发:如何正确连接材质着色器节点
Blender 材质节点连接问题修复方案
错误说明
你末尾写的两行节点连接代码存在三个明确问题:
- 第二行代码未调用创建连接的
.new()方法,直接执行links()属于无效语法,无法生成节点连线 - 第一行通过
planet.active_material索引节点树的写法存在冗余,前文已经将目标材质赋值给planet_material变量,直接复用该变量即可,避免活动材质被意外修改时出现连接错位 - 额外逻辑缺失:
execute方法末尾缺少Blender Operator要求的标准返回值return {'FINISHED'},不补全会触发控制台报错,算子无法正常执行完成。
正确实现
节点连接的固定语法为材质节点树.links.new(输出端口, 输入端口),将最后两行错误代码替换为以下语句即可完成Noise1到Noise2的连接:
planet_material.node_tree.links.new(Noise1.outputs['Fac'], Noise2.inputs['Scale'])
建议优先使用端口名称而非数字索引指定输入输出端口,该写法不受Blender版本迭代时端口顺序调整的影响,兼容性更强。
修正后的完整可运行代码
class WM_OT_textOpBasic(bpy.types.Operator): """Creates the Base Planet""" bl_idname = "wm.textopbasic" bl_label = " Text Tool Operator" def execute(self, context): bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=6, radius=1.0, calc_uvs=True, enter_editmode=False, align='WORLD', location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0), scale=(1.0, 1.0, 1.0)) planet = bpy.context.selected_objects[0] planet.name = "Planet" planet_material = bpy.data.materials.get("planet material") if planet_material is None: # 创建材质 planet_material = bpy.data.materials.new(name="planet material") planet.data.materials.append(planet_material) planet_material.use_nodes = True nodes = planet_material.node_tree.nodes ColorRamp1 = nodes.new('ShaderNodeValToRGB') ColorRamp1.location = -400,100 ColorRamp2 = nodes.new('ShaderNodeValToRGB') ColorRamp2.location = -700,100 ColorRamp3 = nodes.new('ShaderNodeValToRGB') ColorRamp3.location = -1000,100 Noise1 = nodes.new('ShaderNodeTexNoise') Noise1.location = -1100,300 Noise2 = nodes.new('ShaderNodeTexNoise') Noise2.location = -900,300 Bump = nodes.new('ShaderNodeBump') Bump.location = -150,-150 # 连接Noise1的Fac输出到Noise2的Scale输入 planet_material.node_tree.links.new(Noise1.outputs['Fac'], Noise2.inputs['Scale']) return {'FINISHED'}
内容的提问来源于stack exchange,提问作者AnTicXz
相关产品推荐
相关产品推荐

