Dodaj węzeł do wielu materiałów

Sep 07 2020

Widziałem, że skrypt Pythona może aktualizować kilka materiałów, które zawierają w zasadzie te same węzły, z prostymi zmianami wartości ( Zmień wiele określonych węzłów w wielu materiałach (z Pythonem?) )

Muszę zrobić coś takiego, aby wpłynąć na ponad 2400 prawie identycznych materiałów.

Użyłem globu mapy pobranego z 3D Warehouse. Ta kula ziemska jest czarno-biała i została stworzona przez projektanta przy użyciu ponad 2400 jpegów kwadratów mapy i identycznych materiałów z unikalnymi nazwami jpeg w początkowym węźle koloru podstawowego (patrz zdjęcie poniżej).

Nazwy materiałów to od GLOBE_0 do GLOBE_2448. Jeśli grupa węzłów została użyta z unikalnym jpeg jako danymi wejściowymi, mógłbym zmienić grupę węzłów, aby wpłynąć na wszystkie. Jednak tak się nie stało.

Chcę zmienić kolor z czarno-białego na złoty i kremowy. Uważam, że ta aktualizacja obrazu mogłaby zostać utworzona jako grupa węzłów z wejściem / wyjściem koloru i umieszczona pomiędzy węzłami Base Color i Principled BSDF. Mimo, że wciąż jestem nowicjuszem w Blenderze, ustalę, co powinna zawierać ta grupa węzłów (prawdopodobnie nic podobnego transformacji w Blender STackExchange, jeśli mam być szczery!). Jednak nie wiem, jak wstawianie nowej grupy węzłów byłoby skryptowane w Pythonie.

Wspólnymi cechami wszystkich tych materiałów są:

  1. Nazwy materiałów - od GLOBE_0 do GLOBE_2448
  2. Nowa grupa węzłów - nazwij ją ColorGold
  3. Połączenie między węzłami Base Color i Principled BSDF

Z góry dziękuję.

Odpowiedzi

1 scurest Sep 07 2020 at 06:13

Spróbuj tego

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])