TouchDesignerで被りなし条件付きランダム選択システムを作りました
作成したもの
今回制作したのはゼミで先輩方が設営した計8ブースをipadを触るたびに1つおすすめ(空きブースを案内)してくれる誘導システムを作成しました。
常時付け焼き刃で機能を追加していったので備忘録としてまとめます。
人のノードなんて説明されても普通わからんので直接聞いてください
いい感じに整理できたネットワークはtoxで配布しますのでご活用ください。
追記:ところどころ余計な仕組みありますが直す気力ないのでぜひ直してみてください
私はシステムを動くように作っただけなので、アイディアをくれたみんなのおかげで成り立った機能がほとんどです。
さらにそのシステムはChatGPTと先輩のおかげ、出来がいいのはアミッドや出力映像が綺麗なおかげ、システムには正解があるけどアートには正解がない。
システム要項一覧と作成方法
iPadを触るとランダムで映像が流れる
今回の肝となるシステムです。
上記画像の右真ん中のピンクノード(DAT)の中身です。
1.オフのボタンのみを監視し、ランダムで選ぶ対象とする
ちなみに、プログラム上で「完全な乱数」ってのは実現不可能なんです。
まぁ人間が観測して、法則性を見つけられるほどゆるくもないので「ほぼ完全」って感じです。「行けたら行く」よりかは信憑性あります。
つまりはぱっと見ランダムだったらOKって感じです。
ボタンが8つあるので規模が大きく感じますが、黄色と青がメインの機能です。赤はボタンの管理です。
赤の処理
右側から 1.ボタンを8つ用意し、出力の種類を分ける
ボタンが8つあるのでmath CHOPで「×2〜×8」をして出力の種類を作る
左側は、1から8の出力を仕分ける
一度選ばれたボタンをオンにし、ランダムから除かせるためです。
Expression CHOPで「me.inputVal == n」と書きます
意味は「私に入力されている数値がnなら1を返す」です
今回はnに1から8が入ります。その後DATが各ボタンのオンオフの処理をしてくれます。
本当はExpressionはいらないし、DATも1つでいけるはずです。
Pythonがかけるならば…
def onValueChange(channel, sampleIndex, val, prev):
op('button' + str(val)).par.value0 = 1
return
これで走るはずんなんですが、なぜがエラーが出ます。解決できるほどの知識がありません。
要件は"'button' と val(入力された数値) を連結して生成した名前を持つオペレータ上のパラメータ value0 の値を 1 に設定しています。"5が入力されたらbutton5がオンになる…はずなんですがねぇ…
青の処理
左から
Merge CHOPでブースボタンのオンオフをまとめる
Delete CHOPで0のチャンネルを消す
Shuffle CHOPでグラフ化?並べ替えを可能にする的な?
Sort CHOPのRandom seedで並べ方をランダムにする
CHOP to DATで整理
CHOP to DAT のRow指定でn番目を抽出
CHOP Execute DATで「左のdat to CHOPの数値が変わったら、右のconstant CHOPの数値に同じ数を入れる」
Deley CHOPで時間差で出力して、一番右のCHOP Execute DATでconstant1 CHOPに「constant1が0以外だった場合、0を出力する」
8の処理の簡単なPython↓(変数に代入した方が綺麗)
if op('constant1').par.value0 != 0:
op('constant1').par.value0 = 0
(読まなくてもいいよ)
7は冗長してるように思えますが、普通にCHOP Referenceなどで繋げると連打したり想定外の挙動の際にReferenceが途切れてしまいます。(原因不明)
8は一旦数値を0に戻さないと出力された数値が残ってしまい、同時に2つのボタンが返ってきてしまうことがあります。
黄色の処理
こっちの処理はシンプルなので処理の流れよりもオペレーターの解説をします。
(一番上の2つ、意味ないです。オンの時に0、オフの時に-1を出力できればいいのでconstant1つで足ります。配布toxは修正済みです。)
俺もよくわかってないですが、上から
処理ができる状態の種類(Off When Zero = 数値が0の時はOFF)
どうなったら処理をする?(Faling Edge = 数値が減った時)
2つのチャンネルを合わせる (AndやOr、数学のベン図的な)
チャンネルじゃなくてオペレーターバージョン
Combien Channels/CHOPsの違い
Type(今回のランダム以外使ったことないです)
Seed (ランダムシードを決める(マイクラのシード値と同じです))
Amplitude (数字を大きさを絶対値で決める(初期値は-1から1))
Offset(大きさはそのまま数値をずらす)
Trail CHOPを繋ぐと最大値と最小値がわかりやすいです
hold CHOPはその名の通り入力された数値をオンの時のみ保持する
math CHOPは色々な機能付き四則演算
思ったより長くなったので一旦区切ります
配布ファイル
この記事が気に入ったらサポートをしてみませんか?