Help us understand the problem. What is going on with this article?

TouchDesigner で Python を使ってみよう!(2)

前記事 → TouchDesigner で Python を使ってみよう!(1)

では、実際にTouchDesignerの中でPythonを活用させていきましょう!


TouchDesignerでPythonを使う方法

  1. Textport
  2. DAT
  3. Operator Parameters

Textport

(1)で使用したような、書かれたソースコードや表現を逐次解釈しながら実行するものです。
開発していくにあたっては使いにくい。

DAT

ピンク色のオペレータ、DATを用いることにより、便利に効果的にTouchDesigner内でプログラミングができます。
ソースコードはテキストデータなのでDATで扱うことになります。

Operator Parameters

オペレータのパラメータを一行のPythonのScript(Expressionという)として扱うこともできます。
 2018-09-20 1.49.49.png
例えばこのように、movie filein TOPもデフォルトでfileというパラメータにExpressionが書かれています。
三つ並んだ小さな四角の真ん中が白っぽく塗られているとExpressionが書かれているということになります。


よく使うExpression

absTime.frame
 2018-09-21 19.47.13.png
起動してから経過したFrame数を取得します。
回転し続けさせるのとかに使ったりします。
absTime.secondsで起動してから経過した時間を取得します。


me.digits
 2018-09-21 19.49.50.png
名前の最後に付く数字を取得できます。


Text DATでPythonを書く

textDATを作ったら右下にある十字マークのボタンを押しアクティブな状態します。
そうするとテキストを打ち込めるようになります。
 2018-09-21 4.32.01.png

print("Hello World!")

と記述したら、アクティブ状態を解除しオペレータを右クリックします。
Run Scriptをクリックします。
何も起きませんがalt+tを押して再びテキストポートを開いてみると、Hello World!と表示されているはずです。

 2018-09-21 4.45.01.png
 2018-09-21 5.35.39.png
(1)でテキストポート上で一行一行実行していたように、Run ScriptをするとTextDATに書いてあるプログラムが実行されます。
複数行書くと一行目から順番に実行されていきます。これでテキストポート書くと面倒な複数行のプログラムも楽に書くことができました!


オペレータのパラメータにアクセス

次に、Pythonスクリプトからオペレータのパラメータにアクセスしてみましょう。
先ほど作ったTextDATの横に、ConstantTOPを作ります。
 2018-09-21 18.29.54.png

r = op('constant1').par.colorr
print(r)

これでRun Scriptすると、テキストポートに1.0と出力されていると思います。
これはConstant1のcolorRの値を表示しています。
Rの値を変えてみてもう一度Runすると変更した値が表示されるはずです。

パラメータの値を取得する行を詳しく見てみましょう。
op() でオペレータを取得します。
.par でオペレータのパラメータを取得します。
.colorr でパラメータの中のcolorrという値を取得しています。
colorrの部分を変更すると他の変数にもアクセスできます。

パラメータのこの部分でパラメータ名を確認できます。
 2018-09-21 18.37.08.png

次にPythonから値を変更してみましょう。

op('constant1').par.alpha = 0.5

これをRunさせるとConstantTOPのアルファが0.5に変わります。
パラメータウィンドウで数値を打ち込むのと同様な処理をPythonから処理できました。

しかし、処理をする度にRun Scriptをしなければならないのは困るので次は自動的にスクリプトを実行させる方法を学びます。


自動でスクリプトを実行

決まったタイミングでスクリプトを実行させるためのオペレータには、Executeという名前が含まれています。
 2018-09-18 23.33.50.png

名前 説明
CHOP Execute 指定したCHOPの値によってスクリプトを実行
DAT Execute 指定したDATによってスクリプトを実行
Execute 起動時や毎Frame時などにスクリプトを実行
OP Execute 指定したオペレータの名前が変わったり削除された時などにスクリプトを実行
Panel Execute 指定したPanel(Comp)によってスクリプトを実行
Parameter Execute 指定したオペレータのパラメータが変化した時などにスクリプトを実行

ExecuteとCHOP Executeを例に説明していきたいと思います。


Execute

Execute DAT は起動時やフレームの開始時などのタイミングで呼び出されるメソッドを持つDATです。

def onFrameStart(frame):
    print(frame)
    return

このようにメソッド名とreturnで囲まれた中でスクリプトを記述し、ExecuteDATのパラメータでFrame StartをOnにします。
 2018-09-21 18.59.59.png
このスクリプトは毎フレームのはじめに現在のFrame数をテキストポートに出力するものになっています。
常に行っておきたい処理はこのように記述したり、起動時に実行させたいものはOnStart()の中に書いてあげることで実現できます。


CHOP Execute

CHOP Execute は指定したCHOPの値が変化した時などに実行されるものになっています。
ここで出てくるOnとOffは、0よりも大きいものがOn、0以下のものがOffです。

では以下のようにButtonCOMP、NullCHOP、CHOPExecute、ConstantTOPを作り、CHOPExecuteのCHOPというパラメータにNull1を入れてください。
 2018-09-21 19.12.31.png

以下のようにCHOP Executeに記述し、パラメータのValue ChangeをOnにします。

def onValueChange(channel, sampleIndex, val, prev):
    op('constant1').par.alpha = val
    return

これでボタンをぽちぽちと押すとConstantTOPのアルファがボタンの値になります。(Nullの値をそのまま参照させるのと何も変わらないですね...)

もう少しプログラミングっぽくしてみましょう。
まず、ButtonのTypeをMomentaryに変更し、パラメータのValue ChangeをOff、Off to OnをOnにします。

import random

def onOffToOn(channel, sampleIndex, val, prev):
    op('constant1').par.colorr = random.random()
    op('constant1').par.colorg = random.random()
    op('constant1').par.colorb = random.random()
    return

これで先ほどと同様ボタンをぽちぽちしてみるとConstantTOPの色がランダムで変わります。
このように特定のタイミングのみで値を更新してあげられます。


外部エディタの使い方

スクリプトが大きくなってくるとTouchDesigner内でスクリプトを書いていくのが難しくなっていきます。
そこで外部のテキストエディタを使うことができます。
Preferencesを開きDATsの中のText Editorで指定することでそのエディタを使うことが可能になります。
 2018-09-21 19.30.16.png
設定したら、編集したいDATを右クリックし、Edit Contents...を選択します。
 2018-09-21 19.32.09.png

そうするとエディタが起動し、選択していたDATの中身を外部エディタで編集できるようになります。
 2018-09-21 19.35.02.png
編集後エディタ上で上書き保存をしTouchDesignerに戻ると変更が反映されています。


Callback関数

OSC In DAT, Serial DAT, Replicator COMPなどを作ると下にくっついてくるDATはCallback DATというものになっています。
Execute系のDAT以外の特定のタイミング、例えばOSCを受信した時に実行されるメソッドなどが記述されています。

Replicatorを例にしてみましょう。
ReplicatorCOMPを作成し、以下のように変更します。
 2018-09-21 20.07.17.png
ConstantTOPを作成しパラメータと名前を以下の通りに変更します。
書かれたExpressionは今までの復習だと思って意味を理解してみてください。
 2018-09-23 18.03.29.png

そうするとConstantTOPがNumber of Replicantsで設定した個数複製されます。
ここまでは普通のReplicatorの使い方です。

では、CallbackDATを使ってみたいと思います。
デフォルトでの中身を見てみるとこのようになっています。

def onReplicate(comp, allOps, newOps, template, master):

    for c in newOps:
        #c.display = True
        #c.render = True
        #c.par.display = 1
        #c.par.clone = comp.par.master
        pass

    return

onReplicateからreturnまでに書かれたスクリプトが複製をおこなす時に実行されます。
ではfor文の1行目にあるc.display = Trueの前にある#を消してみましょう。
その後、ReplicatorCOMPのRecreate All OperatorsAllというボタンを押してください。
複製したオペレータは背景にプレビューする基本的な機能をOnにされて生み出されます。(オペレータの右下にある青丸が押された状態)
 2018-09-21 20.16.50.png

このようにCallbackDATの付いたオペレータはより高度な処理をしてあげることが可能になっています。


最後に

TouchDesignerはプログラムを書かなくても開発できるビジュアルプログラミング環境ですが、プログラムを書くことで、それでしかできないことやオペレータの組み合わせだけでは難しいことを実現できるので覚えておいて損はないはずです!!


Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away