Bir python betiği ile birçok malzemede bir değer düğümünü değiştirme

Aug 16 2020

Blender ve python newbee burada.

Karşılaştığım şu problemde biriniz bana yardımcı olabilirse çok mutlu olurum: ölçekli bir modeli blendere aktardım, bunu gerçek hayat ölçeğinde işlemek istiyorum. Modeli ölçeklendirdiğimde, malzemeler onunla ölçeklenmiyor ve kötü görünüyor. Bununla birlikte, malzemelerin hepsinin "Ölçek" adında bir Değer düğümü vardır , bu, aynı ölçekte düzenlersem, modeli ölçeklendiriyorum, her şeyi düzeltir ve o zaman doğru görünür.

Model farklı malzemelerle 100'den fazla nesne kullandığından, bunu yarı otomatik olarak yapacak bir komut dosyasına sahip olmak çok daha kolay olurdu ...

Bulabildiğim şey, bu tür benzer bir sorunun çözülmesiydi , ancak komut dosyasıyla daha önce hiç deneyimim olmadığı için, problemimi çözmek için onu uyarlayamadım.

Yapmak istediğim şey:

  • Değiştirmek istediğim nesneleri seçin
  • Komut dosyası oluşturmaya gidin
  • içine bir komut dosyası kopyala
  • Seçilen tüm nesnelerin "ölçek" etiketli değer düğümüne yerleştirilmesi gereken bir sayıyı düzenleyin
  • komut dosyasını çalıştır
  • daha iyi render sonuçları elde ettiğiniz için mutlu olun.

Blender 2.83.4'ü komut dosyası oluştururken konsolda PYTHON INTERACTIVE CONSOLE 3.7.4 yazıyor (varsayılan, 17 Şubat 2020, 16:23:28) [MSC v.1916 64 bit (AMD64)]

Her yardım çok takdir edilmektedir!

Yanıtlar

1 RobertGützkow Aug 16 2020 at 18:07

Aşağıdaki komut dosyası, seçilen tüm nesneler üzerinde yinelenir ve etiketleri olarak ayarlanmışsa, atanan malzemelerdeki değer düğümlerini ayarlar "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)