TouchDesignerのオペレータをPythonで繋ぐ


この記事で伝えたいこと

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コードを以下のように書き換えます.

replicator1_callbacks.py
# 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と組み合わせることで,手間を減らすことが可能です.具体例では取り扱わなかった接続を切るコードも含め,是非役立ててみてください.