Pyhton
Cinema4D

[Cinema 4D] 任意の複数オブジェクトのパラメータを一括変更するためのスクリプト

任意の複数オブジェクトの同じパラメータを一括で変更するためのスクリプトを作成してみた.

例では任意のクローナー,またはインスタンスオブジェクトに対して,レンダーインスタンスをオンオフするためのスクリプトとした.

レンダーインスタンスはブール値なので,Use_Render_Instanceというヌルオブジェクトにユーザデータのブールを追加し,コントロールしたいクローナー,またはインスタンスのオブジェクトノードを追加してレンダーインスタンスに繋げて...

などとするとオブジェクトノードを追加してワイヤをつなぐ作業自体がストレスとなってくる.数個だとよいが何十個の時点でかなりつらくなる.
20171224-1.jpg
これはちょっと面倒だ...

そこで,オブジェクトノードに追加せずに,外部から任意のクローナーまたはインスタンスのレンダーインスタンスを操作できるようにしたい.

変更したいオブジェクトのリストを作成し,ユーザデータから,そのリストにある,任意のパラメータに渡してみることにした.

リストは「含む/除外」で作ってみた

ユーザデータに追加できるパラメータに「含む/除外」というものがある.これはそのリストに登録したオブジェクトに対して何かをさせたり,させなかったりということができるもので,Cinema 4Dのさまざまな箇所で使われている.例えばライトオブジェクトにあるプロジェクトに含める/除外するもこれにあたる.

そこで,ブール値のユーザデータを追加し,このブール値をリストにあるオブジェクトのレンダーインスタンスパラメータに渡すというひな形を作成してみることにした.

20171224-2.jpg

ブール値と「含む/除外」をユーザデータに追加したところ

Pyhtonノードを書く

XPressoをUse_Render_Instanceオブジェクトに適用し,中身を作る.といっても,自身のユーザデータからUse_Render_Instanceというブール値を出して,Phthonノードに繋げるだけ.

Pyhotoノードの中身

import c4d

def main():
    # Instance_Ctrlのコントロールオブジェクトを検索
    obj = doc.SearchObject('Instance_Ctrl')

    # ユーザデータからリストを取得
    inexclude = obj[c4d.ID_USERDATA,1]

    # リストのオブジェクト数を取得
    objCount = inexclude.GetObjectCount()

    # 以下のサンプルではクローナーとインスタンスオブジェクトのみを評価
    if objCount > 0:
        for i in range(objCount):
            ListObj = inexclude.ObjectFromIndex(doc, i)

            if ListObj.GetType() == 1018544: # ID1018544 = クローナーオブジェクトかどうか
                bc = ListObj.GetDataInstance(); # BaseObjectからBaseContainerのインスタンスを取得
                bc.SetBool(c4d.MGCLONER_VOLUMEINSTANCES, Input1) # レンダーインスタンスを操作

            elif ListObj.GetType() == c4d.Oinstance: # インスタンスかどうか
                bc = ListObj.GetDataInstance(); # BaseObjectからBaseContainerのインスタンスを取得
                bc.SetBool(c4d.INSTANCEOBJECT_RENDERINSTANCE, Input1) # レンダーインスタンスを操作

            else:
                print("Other Object Type")


今回はXPressoとスクリプトで作ったけれども,プラグインとして作ればリストに登録できるオブジェクトを限定したり,より柔軟なことができる.かも.