कई सामग्रियों में नोड जोड़ें

Sep 07 2020

मैंने देखा है कि एक पायथन स्क्रिप्ट कई सामग्रियों को अपडेट कर सकती है, जिसमें मूल रूप से एक ही नोड होते हैं, साधारण मूल्य परिवर्तन ( एकाधिक सामग्री में कई विशिष्ट नोड्स के साथ अजगर के साथ? )

लगभग 2400 से अधिक समान सामग्रियों को प्रभावित करने के लिए मुझे ऐसा कुछ करने की आवश्यकता है।

मैंने 3D वेयरहाउस से डाउनलोड किए गए मैप ग्लोब का उपयोग किया है। यह ग्लोब काले और सफेद है, और डिज़ाइनर द्वारा बेस बेस कलर नोड (नीचे चित्र देखें) में अद्वितीय जेपीईजी नामों के साथ मैप स्क्वायर और समान सामग्री के 2400 से अधिक jpegs का उपयोग करके बनाया गया है।

सामग्री के नाम GLOBE_24 से GLOBE_2448 हैं। यदि इनपुट के रूप में यूनीक जेपीईजी के साथ एक नोड समूह का उपयोग किया गया था, तो मैं सभी को प्रभावित करने के लिए नोड समूह को बदल सकता हूं। हालाँकि, ऐसा नहीं था।

मैं रंग को काले और सफेद से सोने और क्रीम में बदलना चाहता हूं। मेरा मानना ​​है कि छवि का यह अद्यतन कलर के इनपुट / आउटपुट के साथ नोड समूह के रूप में बनाया जा सकता है, और बेस कलर और प्रिंटेड बीएसडीएफ नोड्स के बीच में स्लैट किया जा सकता है। हालांकि मैं अभी भी एक ब्लेंडर नौसिखिया हूं, मैं यह काम करूंगा कि इस नोड समूह में क्या होना चाहिए (यदि मैं ईमानदार हूं तो शायद ब्लेंडर STackExchange में इसी तरह के परिवर्तन होंगे!)। हालाँकि, मुझे नहीं पता कि पायथन में एक नए नोड समूह में स्लॉटिंग कैसे होगी।

इन सभी सामग्रियों में समानताएँ हैं:

  1. सामग्री के नाम - GLOBE_24 से GLOBE_2448 तक
  2. एक नया नोड समूह - इसे ColorGold कहते हैं
  3. बेस कलर और प्रिंटेड बीएसडीएफ नोड्स के बीच लिंक

अग्रिम में धन्यवाद।

जवाब

1 scurest Sep 07 2020 at 06:13

ये कोशिश करें

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