Zmiana węzła wartości w wielu materiałach za pomocą skryptu w języku Python

Aug 16 2020

Blender i python newbee tutaj.

Byłbym bardzo szczęśliwy, gdyby ktoś z was pomógł mi z następującym problemem, z którym się spotykam: zaimportowałem model w zmniejszonej skali do blendera, który chcę wyrenderować w skali rzeczywistej. Kiedy skaluję model, materiały nie skalują się z nim i źle wyglądają. Jednak wszystkie materiały mają węzeł wartości o nazwie „Skala”, który, jeśli edytuję go z tą samą skalą, skaluję model, naprawia wszystko i wtedy wygląda dobrze.

Byłoby o wiele łatwiej mieć skrypt wykonujący to półautomatycznie, ponieważ model wykorzystuje znacznie ponad 100 obiektów z różnych materiałów ...

Udało mi się znaleźć tego rodzaju podobny problem , ale nie byłem w stanie dostosować go do rozwiązania mojego problemu, ponieważ nie mam wcześniejszego doświadczenia ze skryptami.

Co chciałbym zrobić:

  • Wybierz obiekty, które chcę zmienić
  • Przejdź do skryptów
  • skopiuj do niego skrypt
  • edytuj liczbę, która powinna być umieszczona w węźle wartości oznaczonym „skala” wszystkich wybranych obiektów
  • uruchom skrypt
  • ciesz się z lepszych wyników renderowania.

Używam Blendera 2.83.4, w skrypcie konsola mówi PYTHON INTERACTIVE CONSOLE 3.7.4 (domyślnie, 17 lutego 2020 r., 16:23:28) [MSC v.1916 64 bit (AMD64)]

Każda pomoc jest mile widziana!

Odpowiedzi

1 RobertGützkow Aug 16 2020 at 18:07

Poniższy skrypt wykonuje iterację po wszystkich wybranych obiektach i dostosowuje węzły wartości w przypisanych materiałach, jeśli ich etykieta jest ustawiona na "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)