Изменение узла значения во многих материалах с помощью скрипта Python

Aug 16 2020

Blender и python newbee здесь.

Я был бы очень рад, если бы один из вас помог мне со следующей проблемой, с которой я столкнулся: я импортировал в блендер масштабную модель, которую хочу визуализировать в реальном масштабе. Когда я масштабирую модель, материалы не масштабируются и выглядят плохо. Однако все материалы имеют узел Value с именем «Scale», который, если я редактирую его с тем же масштабом, что и масштабирую модель, исправляет все, и тогда все выглядит правильно.

Было бы намного проще создать сценарий, который делал бы это полуавтоматически, поскольку модель использует более 100 объектов с разными материалами ...

Я смог найти решение подобной подобной проблемы , но я не смог адаптировать ее для решения моей проблемы, так как у меня нет предыдущего опыта работы со сценариями.

Что бы я хотел сделать:

  • Выберите объекты, которые я хочу изменить
  • Зайти в сценарии
  • скопируйте в него скрипт
  • отредактируйте число, которое должно быть помещено в узел значений с пометкой «масштаб» всех выбранных объектов
  • запустить скрипт
  • будьте счастливы получить намного лучшие результаты рендеринга.

Я использую Blender 2.83.4, при написании сценария консоль говорит PYTHON INTERACTIVE CONSOLE 3.7.4 (по умолчанию, 17 февраля 2020 г., 16:23:28) [MSC v.1916, 64 бит (AMD64)]

Любая помощь очень ценится!

Ответы

1 RobertGützkow Aug 16 2020 at 18:07

Приведенный ниже скрипт выполняет итерацию по всем выбранным объектам и корректирует узлы значений в назначенных материалах, если для их метки установлено значение "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)