Ändern eines Werteknotens in vielen Materialien mit einem Python-Skript

Aug 16 2020

Mixer und Python Newbee hier.

Ich würde mich sehr freuen, wenn einer von Ihnen mir bei dem folgenden Problem helfen könnte, auf das ich stoße: Ich habe ein maßstabsgetreues Modell in Blender importiert, das ich im realen Maßstab rendern möchte. Wenn ich das Modell skaliere, skalieren die Materialien nicht damit und sehen schlecht aus. Die Materialien haben jedoch alle einen Werteknoten namens "Skalieren". Wenn ich ihn mit derselben Skalierung bearbeite, skaliere ich das Modell, korrigiere alles und es sieht dann richtig aus.

Es wäre viel einfacher, ein Skript zu haben, das dies halbautomatisch erledigt, da das Modell weit über 100 Objekte mit unterschiedlichen Materialien verwendet ...

Was ich finden konnte, war, dass diese Art von ähnlichem Problem gelöst wurde , aber ich konnte es nicht anpassen, um mein Problem zu lösen, da ich keine Erfahrung mit Skripten habe.

Was ich gerne machen würde:

  • Wählen Sie die Objekte aus, die ich ändern möchte
  • Gehen Sie in die Skripterstellung
  • Kopieren Sie ein Skript hinein
  • Bearbeiten Sie eine Zahl, die in den Werteknoten "scale" aller ausgewählten Objekte eingefügt werden soll
  • Skript ausführen
  • Seien Sie froh, viel bessere Rendering-Ergebnisse zu erzielen.

Ich verwende Blender 2.83.4. In Skripten der Konsole heißt es PYTHON INTERACTIVE CONSOLE 3.7.4 (Standard, 17. Februar 2020, 16:23:28) [MSC v.1916 64-Bit (AMD64)]

Jede Hilfe wird sehr geschätzt!

Antworten

1 RobertGützkow Aug 16 2020 at 18:07

Das folgende Skript durchläuft alle ausgewählten Objekte und passt die Werteknoten in den zugewiesenen Materialien an, wenn deren Beschriftung festgelegt ist "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)