LoginSignup
2
3

More than 1 year has passed since last update.

Collection個別にレンダリング画像を出力するようにするスクリプト

Last updated at Posted at 2021-09-09

Blender2.8以降ではビューレイヤーを使ってレンダリングに使用するコレクションの設定を切り替えることができます
コレクション1つだけを有効にしたビューレイヤ―を作成することで、コレクション個別のレンダリング画像を出力するスクリプトを作成してみました
image.png
特定の文字列で始まるコレクションは操作を無視するようにしています(デフォルトでは#を設定)
ライト等はシーンコレクション直下に置くか この文字を付けたコレクションの中に入れておくといいかと思います

yRenderLayer_from_Collection.py
import bpy
scene = bpy.context.scene
# 作成するノードの基準位置
node_origin = (0, 0)
# レンダーノードと出力ノードの距離
node_w_offset = 300
# レンダーノード同士の縦の距離
node_h_offset = 120
# 保存先の基本パスの指定  "//"は.blendファイルと同一ディレクトリ
base_path ="//comp/"
# この文字で始まるCollectionは操作を無視する
ignore_word = "#"

def set_view_layer(target_collection):
    '''指定のコレクション1つだけ表示したビューレイヤ―作成'''
    layer_ = view_layers.new( target_collection.name ) 
    # 対象のコレクション以外を不使用に設定
    # で名前が始まるコレクションは無視
    for Col in layer_.layer_collection.children:
        if Col.name.startswith(ignore_word):
            continue
        elif Col.name == target_collection.name:
            Col.exclude = False
        else:
            Col.exclude = True
    return (layer_ )

def meke_RenderLayer_node( node_tree, Rrnder_Scene, view_Layer, name, position ):
    '''レンダーレイヤノードの作成'''
    RL_Node = node_tree.nodes.new('CompositorNodeRLayers')
    RL_Node.name = name
    RL_Node.location = position
    RL_Node.scene = Rrnder_Scene
    RL_Node.layer = view_Layer.name #ビューレイヤ名
    RL_Node.show_preview = False
    return(RL_Node)

def make_PNG32Output_node(node_tree, name, base_path, position):
    '''ファイルアウトプットノードの作成'''
    File_Node = node_tree.nodes.new('CompositorNodeOutputFile')
    File_Node .name = name
    File_Node .location = position
    File_Node .base_path = base_path
    #初期設定の入力スロットを削除
    File_Node .file_slots.remove(File_Node .inputs[0])

    #8bitRGBAのPNGに設定
    File_Node .format.color_depth = "8"
    File_Node .format.color_mode = "RGBA"
    File_Node .format.file_format = "PNG"
    return (File_Node )

# シーンコレクション直下にあるコレクションの取得
collections = scene.collection.children
view_layers = scene.view_layers

# コレクション1つだけ表示したビューレイヤ―を作成
Col_layers = []
for target_collection in collections:
    if not target_collection.name.startswith(ignore_word):
        layer_ = set_view_layer(target_collection)
        Col_layers.append(layer_)

# ビューレイヤ個々でレンダリング出力するコンポジットを作成
# コンポジションノードの取得
node_tree = scene.node_tree
scene.use_nodes = True
# ファイルアウトプットノードの作成
File_Output = make_PNG32Output_node(node_tree, 'File_Output', base_path, node_origin)
# ビューレイヤ個々でレンダーノードの作成
Render_nodes = []
for i,layer_ in enumerate(Col_layers):
    position = (node_origin[0] -node_w_offset, node_origin[1] + node_h_offset *-i)
    node_ = meke_RenderLayer_node( node_tree, scene, layer_, layer_.name, position )
    # ファイルアウトプットノードのスロットを追加
    f_path = "%02d_%s_####" % (i, layer_.name)
    file_Slot = File_Output.file_slots.new(f_path)
    # レンダーレイヤとファイルアウトプットノードのスロットと接続
    node_tree.links.new(node_ .outputs[0], file_Slot)
    Render_nodes.append(node_)

# 作成したレンダーレイヤを削除する場合の処理
'''
for layer_ in Col_layers:
    scene.view_layers.remove(layer_)
node_tree.nodes.remove(File_Output)
for node_ in Render_nodes:
    node_tree.nodes.remove(node_)
#'''

コレクションはアウトライナ上で並び順が取得できるので上から順に番号を振るようにもしてあります

動画のフッテージ用に連番画像を書き出す場合には

    # ファイルアウトプットノードのスロットを追加
    f_path = "%02d_%s/%s_####" % (i, layer_.name, layer_.name)

といった具合にして コレクション名のフォルダの中に個々の画像ファイルが入るようにした方がいいかもしれません

現場に合わせてカスタマイズしてみてください

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3