任意の複数オブジェクトの同じパラメータを一括で変更するためのスクリプトを作成してみた.
例では任意のクローナー,またはインスタンスオブジェクトに対して,レンダーインスタンスをオンオフするためのスクリプトとした.
レンダーインスタンスはブール値なので,Use_Render_Instanceというヌルオブジェクトにユーザデータのブールを追加し,コントロールしたいクローナー,またはインスタンスのオブジェクトノードを追加してレンダーインスタンスに繋げて...
などとするとオブジェクトノードを追加してワイヤをつなぐ作業自体がストレスとなってくる.数個だとよいが何十個の時点でかなりつらくなる.
これはちょっと面倒だ...
そこで,オブジェクトノードに追加せずに,外部から任意のクローナーまたはインスタンスのレンダーインスタンスを操作できるようにしたい.
変更したいオブジェクトのリストを作成し,ユーザデータから,そのリストにある,任意のパラメータに渡してみることにした.
リストは「含む/除外」で作ってみた
ユーザデータに追加できるパラメータに「含む/除外」というものがある.これはそのリストに登録したオブジェクトに対して何かをさせたり,させなかったりということができるもので,Cinema 4Dのさまざまな箇所で使われている.例えばライトオブジェクトにあるプロジェクトに含める/除外するもこれにあたる.
そこで,ブール値のユーザデータを追加し,このブール値をリストにあるオブジェクトのレンダーインスタンスパラメータに渡すというひな形を作成してみることにした.
ブール値と「含む/除外」をユーザデータに追加したところ
Pythonノードを書く
XPressoをUse_Render_Instanceオブジェクトに適用し,中身を作る.といっても,自身のユーザデータからUse_Render_Instanceというブール値を出して,Phthonノードに繋げるだけ.
Pythonノードの中身
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とスクリプトで作ったけれども,プラグインとして作ればリストに登録できるオブジェクトを限定したり,より柔軟なことができる.かも.