5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TouchDesignerAdvent Calendar 2023

Day 12

TouchDesigner: ScriptTOPのScriptが階層上がったりPerformance Modeにするとcookされない時の対処法

Last updated at Posted at 2023-12-12

こんにちは!こちらは TouchDesigner Advent Calendar 2023 12日目の記事です。

サンプル

今回作ったサンプルは以下にあります。
chimanaco/touchdesigner-advent-calendar-2023

はじめに

表題の件、Script TOP を使って OpenCV で顔認識をしてその位置を元に何か出す、ということをやっていた時に起こった問題について書いていきます。他にもっと根本的な解決方法がある気がしますが、自分の対処方法を残しておきます。
この記事のサンプルは 2023.11290 で作っていますが、2022.33910 でも同じでした。

うまくいかなかった例

2023-12-12_12h15_47.png

script1_callbacks はこんな感じです(2023から const の value が value0 から const0value になった…?)。script1_callbacks で得られた値(サンプルではランダムな値にしています)を他で使用するべく Constant CHOP に入れています。

def onCook(scriptOp):
	frame = op('SRC').numpyArray()
	scriptOp.copyNumpyArray(frame)
	
	op('constant1').par.const0value = tdu.rand(absTime.frame)
	return

これが各オペレーターがあるネットワーク上だと更新されるものの Performance Mode にすると更新されなくなってしまいました。上の階層に行っても同様の症状でした。

うまくいった例

解決方法としてどこかで見かけたのが Storage を使う方法(フォーラムだったと思うのですが見つけたら追記します)です。Stroage を使うとオペレーターに紐づけて値を保存することができます。Constant CHOP の代わりに Script CHOP を使って実装します。

2023-12-12_12h16_59.png

script1_callbacks はこんな感じです。scriptOp.store('var1', 10) のところで script1 に紐づけて var1 の値を保存しています。また、script2 の変数名と値を更新しています。scr.lock = Truescr.lock = False を入れておくと script1script2 の Loop を回避できます。

def onCook(scriptOp):
	frame = op('SRC').numpyArray()
	scriptOp.copyNumpyArray(frame)
	
	# This fix the cooking bug
	scriptOp.store('var1', 10)
	
	scr = op('script2')
	scr.lock = True
	scr.clear()
	tx = scr.appendChan('tx')	
	tx[0] = tdu.rand(absTime.frame)
	scr.lock = False
	return

script2_callbacks はこんな感じです。fetch()script1 の Storage に保存されている値を読み込んでいます。

def onCook(scriptOp):
	# Force creating a relation between script1 and script2
	features = op('script1').fetch('var1')
	return

これで無事 Performance Mode にしたり階層上がったりしても値が更新されるようになりました。
store する値はこのサンプルのように同じ値でも強制的に cook してくれるようです。サンプルだと Script TOP が cook されるごとに store() していますが、これを Execute DATonStart()me.parent().store とかしてもうまくいきませんでした。また困ったことがあったら調べてみようと思います。

それではみなさま Happy Holidays!!

参考

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?