測域センサでインタラクティブ!(1)の続きになります。
前回で、測域センサの値をhokuyoChopで取得できたかと思います。次は、そのデータを用いて、指さした座標を取得するところまでを紹介したいと思います。
前回同様に、まずは測域センサをPCに接続し、壁際の下部に設置し、hokuyoChopの設定まで進めて下さい。
Step1 ty Channelの取得
hokuyoChopではtx,tyの値が表示されていますが、まずは実際に映像を投影してください。
この映像の投影されたエリア内で指を動かして、hokuyoChopの値の変化を確認してみてください。
そうすると、tyのchannelだけでtyの値が下がったところの横軸のindex番号がxで、下がったtyの値をyとすれば座標が取れそうです。(tyが平らなエリアはtxが一次関数的に下がっており、indexとxが1対1で対応が取れるので、この領域を使用するのが簡単です。tyが平らなので、後に示す閾値も決めやすいです。今回、映像はちょうどtyが平らな領域におさまるように表示しています。)
なので、hokuyoChopにselectChopをつなぎ、Channel Namesの欄のtyを入力し、tyだけ取得します。
Step2 位置取得関数の作成
次に、前回もやりましたが、chopToDatを接続し、そこにselectChopをドラッグ&ドロップします。
そうすると表形式でデータが表示されます。このデータをpythonで処理して、指さした位置を検知できるようにしてみましょう。
textDatを追加して下さい。いくつか方法が考えられますが、基本的なpythonの知識で作成できる例を紹介します。以下のコードをtextDatに入力します。
解説すると、pythonで指さして、tyの値が下がった座標を計算する関数を作成しています。
一行目は関数を定義しており、位置(position)を計算する(caluculate)意味で名前は付けています。
今回、リストとfor分を用いて、座標を取得します。
まず、空のリストを2つ用意します。これを元にx,y座標を求めるので、x_list, y_listとしました。
次に、for文を回しますが、x軸の左端から右端まで回したいので、投影した映像の右端と左端のindexを事前に確認して下さい。指さした時のchopToDatの値を読めば、indexの値が分かると思います。今回は320から475でした。
次に、指をさすとtyの値が局所的に下がると思いますが、その下がったと判断する閾値を決めます。
ty(指さしエリアの最大値) < 閾値 < ty(range区間における指をさしていない時の最小値)
これを満たす必要がありますが、ここでは2.0としました。
この閾値を下回ったindexを取得すれば、指をさしたx座標を求めることができます。
そこで、for文でrangeの区間で閾値を下回った場合に、x_listにindex番号を追加していくようにしています。
ただし、指さした箇所は幅を持つため、リストに複数の値が返ってくることが想定されます。
そこで、最初に閾値を下回ったindexと最後に下回ったindexの中心が指をさしたx座標としました。
yを計算するのにxは整数である必要があるので、intを付けています。
yはchopToDatの表からindexがxの時の値、つまり**op('chopto1')[x,0]**で求めます。
これで、この関数を用いてx,yを取得することができます。
Step3 位置の取得
この関数を用いて得たx,yを表示するためconstantChopを用意します。
name0にx、value0にme.mod.text1.calpos()[0]
name1にy、value1にme.mod.text1.calpos()[1]
とすれば、指をさした時だけ、値が表示されると思います。
これでとりあえず、座標は取れました!
続く...
ただし、この値はhokuyoChopにおける値のままですよね。
あとはこれを座標変換して、実際のTouchDesigner上の座標に合わせ込む必要があります。
それはまた次回ということで。
<制作環境>
TouchDesigner099 COMMERCIAL 64-Bit Build 2019.10700
CPU Corei9 9900K
GPU Geforce RTX 2080Ti
Windows10
<∀RroWs>
HomePage