Dodaj węzeł do wielu materiałów
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ą:
- Nazwy materiałów - od GLOBE_0 do GLOBE_2448
- Nowa grupa węzłów - nazwij ją ColorGold
- Połączenie między węzłami Base Color i Principled BSDF
Z góry dziękuję.
Odpowiedzi
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])