Alterar um nó de valor em muitos materiais com um script Python

Aug 16 2020

Blender e python newbee aqui.

Eu ficaria muito feliz se um de vocês pudesse me ajudar com o seguinte problema que estou encontrando: importei um modelo em escala para o blender, que desejo renderizar em escala real. Quando eu dimensiono o modelo, os materiais não são dimensionados com ele e ficam mal. Todos os materiais, entretanto, têm um nó de valor chamado "Escala", que, se eu editar com a mesma escala que estou escalando o modelo, corrige tudo e fica certo então.

Seria muito mais fácil ter um script para fazer isso de forma semi-automática, já que o modelo usa mais de 100 objetos com diferentes materiais ...

O que consegui encontrar foi esse tipo de problema semelhante resolvido , mas não consegui adaptá-lo para resolver o meu problema, pois não tenho experiência anterior com scripting.

O que eu gostaria de fazer:

  • Selecione os objetos que eu quero mudar
  • Vá para o script
  • copie um script para ele
  • edite um número que deve ser colocado no nó de valor denominado "escala" de todos os objetos selecionados
  • executar script
  • fique feliz em obter resultados de renderização muito melhores.

Estou usando o Blender 2.83.4, no script do console diz PYTHON INTERACTIVE CONSOLE 3.7.4 (padrão, 17 de fevereiro de 2020, 16:23:28) [MSC v.1916 64 bits (AMD64)]

Cada ajuda é muito apreciada!

Respostas

1 RobertGützkow Aug 16 2020 at 18:07

O script abaixo itera sobre todos os objetos selecionados e ajusta os nós de valor nos materiais atribuídos se seu rótulo estiver definido como "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)