Modifica di un nodo valore in molti materiali con uno script python

Aug 16 2020

Blender e python newbee qui.

Sarei molto felice se uno di voi potesse aiutarmi con il seguente problema che sto incontrando: ho importato un modello in scala in Blender, che voglio renderizzare in scala reale. Quando ridimensiono il modello, i materiali non si adattano ad esso e hanno un brutto aspetto. I materiali, tuttavia, hanno tutti un nodo Valore chiamato "Scala", che, se lo modifico con la stessa scala sto ridimensionando il modello, aggiusta tutto e sembra a posto.

Sarebbe molto più semplice avere uno script per farlo in modo semiautomatico, poiché il modello utilizza oltre 100 oggetti con materiali diversi ...

Quello che ho trovato è stato risolto questo tipo di problema simile , ma non sono stato in grado di adattarlo per risolvere il mio problema, poiché non ho alcuna esperienza precedente con lo scripting.

Cosa vorrei fare:

  • Seleziona gli oggetti che voglio modificare
  • Entra nello scripting
  • copia uno script in esso
  • modificare un numero da inserire nel nodo valore etichettato "scala" di tutti gli oggetti selezionati
  • eseguire lo script
  • essere felice di ottenere risultati di rendering molto migliori.

Sto usando Blender 2.83.4, nello script la console dice PYTHON INTERACTIVE CONSOLE 3.7.4 (impostazione predefinita, 17 febbraio 2020, 16:23:28) [MSC v.1916 64 bit (AMD64)]

Ogni aiuto è molto apprezzato!

Risposte

1 RobertGützkow Aug 16 2020 at 18:07

Lo script seguente esegue l'iterazione su tutti gli oggetti selezionati e regola i nodi del valore nei materiali assegnati se la loro etichetta è impostata su "Scale".

import bpy
      
       
def set_scale_nodes_selected_objects(scale_val):
    for obj in bpy.context.selected_objects:
        for mat_slot in obj.material_slots:
            set_scale_nodes_material(mat_slot.material, scale_val)
    

def set_scale_nodes_material(mat, scale_val):
    if mat is not None and mat.use_nodes and mat.node_tree is not None:
        for node in mat.node_tree.nodes:
            if node.label == "Scale" and node.type == "VALUE":
                node.outputs["Value"].default_value = scale_val  


if __name__ == "__main__":
    scale_val = 1.0
    set_scale_nodes_selected_objects(scale_val)