Agregar nodo a múltiples materiales

Sep 07 2020

He visto que un script de Python puede actualizar varios materiales, que contienen básicamente los mismos nodos, con cambios de valor simples (¿ Cambiar múltiples nodos específicos en múltiples materiales (con Python?) )

Necesito hacer algo como esto para afectar a más de 2400 materiales casi idénticos.

He utilizado un mapamundi descargado de 3d Warehouse. Este globo es blanco y negro, y ha sido creado por el diseñador utilizando más de 2400 jpegs de cuadrados de mapa y materiales idénticos con nombres jpeg únicos en el nodo de Color base inicial (ver imagen a continuación).

Los nombres de los materiales van desde GLOBE_0 hasta GLOBE_2448. Si se hubiera utilizado un grupo de nodos con el jpeg único como entrada, podría cambiar el grupo de nodos para afectar a todos. Sin embargo, ese no fué el caso.

Quiero cambiar el color de blanco y negro a dorado y crema. Creo que esta actualización de la imagen podría crearse como un grupo de nodos, con una entrada / salida de Color, y ubicarse entre los nodos Base Color y Principled BSDF. Aunque todavía soy un novato en Blender, averiguaré qué debería contener este grupo de nodos (¡probablemente apoye transformaciones similares en Blender STackExchange si soy honesto!). Sin embargo, no sé cómo se programaría la ubicación de un nuevo grupo de nodos en Python.

Los puntos en común de todos estos materiales son:

  1. Nombres de materiales: GLOBE_0 hasta GLOBE_2448
  2. Un nuevo grupo de nodos: llámelo ColorGold
  3. Enlace entre los nodos Base Color y Principled BSDF

Gracias por adelantado.

Respuestas

1 scurest Sep 07 2020 at 06:13

Prueba esto

import bpy

group_name = "ColorGold"

for mat in bpy.data.materials:
    if not mat.name.startswith("GLOBE_"): continue

    # Find Principled node
    for n in mat.node_tree.nodes:
        if n.type == 'BSDF_PRINCIPLED': break
    else: continue

    # Find Base Color texture node
    soc = n.inputs["Base Color"]
    if not soc.links: continue
    if soc.links[0].from_socket.name != "Color": continue
    tex = soc.links[0].from_node
    if tex.type != 'TEX_IMAGE': continue

    # Insert group node
    g = mat.node_tree.nodes.new("ShaderNodeGroup")
    g.node_tree = bpy.data.node_groups[group_name]
    g.location = tex.location[0] + 100, tex.location[1]
    tex.location = tex.location[0] - 250, tex.location[1]
    mat.node_tree.links.new(g.outputs[0], n.inputs["Base Color"])
    mat.node_tree.links.new(tex.outputs["Color"], g.inputs[0])