Pythonスクリプトを使用して多くのマテリアルの値ノードを変更する

Aug 16 2020

ブレンダーとパイソンニュービーはこちら。

私が遭遇している次の問題について、あなたの1人が私を助けてくれたらとてもうれしいです:私は実際のスケールでレンダリングしたいスケールモデルをblenderにインポートしました。モデルをスケーリングすると、マテリアルがそれに合わせてスケーリングされず、見栄えが悪くなります。ただし、すべてのマテリアルには「スケール」という名前の値ノードがあります。同じスケールで編集すると、モデルをスケーリングし、すべてを修正して、すぐに表示されます。

モデルはさまざまな素材の100を超えるオブジェクトを使用するため、これを半自動で実行するスクリプトを作成する方がはるかに簡単です...

私が見つけたのは、この種の同様の問題が解決されたことでしたが、スクリプトの経験がないため、問題を解決するためにそれを適応させることができませんでした。

私がしたいこと:

  • 変更したいオブジェクトを選択します
  • スクリプトに入る
  • スクリプトをコピーします
  • 選択したすべてのオブジェクトの「スケール」というラベルの付いた値ノードに配置する必要がある数値を編集します
  • スクリプトを実行する
  • より良いレンダリング結果を得ることができて幸せです。

私はBlender2.83.4を使用していますが、コンソールのスクリプトでPYTHON INTERACTIVE CONSOLE 3.7.4(デフォルト、2020年2月17日、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)