この記事で伝えたいこと
TouchDesignerのオペレータの繋がりをPythonで自動制御したいとき,以下の3つを覚えておけばなんとかなります.
- オペレータ
to
の入力としてオペレータfrom
を繋ぎたいときは,to.inputConnectors[0].connect(from)
とする. - 同様に,オペレータ
from
の出力としてオペレータto
を繋ぎたいときは,from.outputConnectors[0].connect(to)
とする. - 2つのオペレータの接続を切りたいときは,
me.outputConnectors[0].disconnect()
のように,disconnect()
を呼ぶ.
具体例
かわいい猫の画像をネットで漁っていると,とても癒されますよね.ということで,Twitterで"cat"と検索をかけたときにヒットする画像を取得して,スライドショー表示させるものを作ります.
プログラムの全体図は次の通りです.
左半分の赤色の部分で画像のURLを取得し,それをFile
プロパティに指定したMovie File In TOPを,Replicator COMPで生成します.そしてコピー結果を全てSwitch TOPに繋ぎ,そのIndex
プロパティをLFO CHOPで操作しています.
DATに画像のURLを収納し,その各成分を順に見ることで各画像を表示するMovie File In TOPを生成する方法は,TouchDesigner使いなら一度は通る道:Visual Thinking with TouchDesigner - プロが選ぶリアルタイムレンダリング&プロトタイピングの極意の3章14節「Replicator COMPで動的に複製する」に記載されたものと同一なので,ここでは詳細は省きます.
今問題にしたいのは,複製された各Movie File In TOPをSwitch TOPに繋ぐことです.ここを本記事の最初に述べたコードで解決します.Replicator COMPには,コールバック用のText DATがくっついています.このPythonコードを以下のように書き換えます.
# me - this DAT
#
# comp - the replicator component which is cooking
# allOps - a list of all replicants, created or existing
# newOps - the subset that were just created
# template - table DAT specifying the replicator attributes
# master - the master operator
#
def onReplicate(comp, allOps, newOps, template, master):
switch = op('switch1')
lfo = op('lfo1')
# switchオペレータのIndexが,1から画像の総数まで,1秒ごとにインクリメントされるように設定
lfo.par.frequency = 1.0 / len(newOps)
lfo.par.offset = 1
lfo.par.amp = len(newOps)
for c in newOps:
c.outputConnectors[0].connect(switch)
#c.display = True
#c.render = True
#c.par.display = 1
#c.par.clone = comp.par.master
pass
return
ここでは複製された各オペレータの出力としてSwitch TOPを繋ぎたいので,c.outputConnectors[0].connect(switch)
としました.
せっかくノードベースでプログラミングできるのにPythonで繋がりを制御する場面はそうそうない気もしますが,例えばこのようにReplicator COMPと組み合わせることで,手間を減らすことが可能です.具体例では取り扱わなかった接続を切るコードも含め,是非役立ててみてください.