測域センサでインタラクティブ！（2）

[測域センサでインタラクティブ！（1）](https://qiita.com/snafkinliberty/items/b917cb02c70c7c95e64b)の続きになります。
前回で、測域センサの値を**hokuyoChop**で取得できたかと思います。次は、そのデータを用いて、指さした座標を取得するところまでを紹介したいと思います。
前回同様に、まずは測域センサをPCに接続し、壁際の下部に設置し、**hokuyoChop**の設定まで進めて下さい。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/311653/2a3c723a-6300-5f15-7d8d-38ea0994e635.jpeg)

# Step1 ty Channelの取得
**hokuyoChop**ではtx,tyの値が表示されていますが、まずは実際に映像を投影してください。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/311653/51969c9c-d6d2-3571-e96f-9f28dd6eeef3.jpeg)
この映像の投影されたエリア内で指を動かして、hokuyoChopの値の変化を確認してみてください。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/311653/c8c07d2a-f486-c736-bfaf-d647f961f197.jpeg)
そうすると、tyのchannelだけでtyの値が下がったところの横軸のindex番号がxで、下がったtyの値をyとすれば座標が取れそうです。(tyが平らなエリアはtxが一次関数的に下がっており、indexとxが1対1で対応が取れるので、この領域を使用するのが簡単です。tyが平らなので、後に示す閾値も決めやすいです。今回、映像はちょうどtyが平らな領域におさまるように表示しています。)
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/311653/426afa03-29d7-0a5a-58a1-4f4a51350e4a.jpeg)
なので、**hokuyoChop**に**selectChop**をつなぎ、**Channel Names**の欄の**ty**を入力し、tyだけ取得します。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/311653/6f0e36ec-2c1b-72db-04b8-a1fc0851b1c0.jpeg)

# Step2 位置取得関数の作成
次に、前回もやりましたが、**chopToDat**を接続し、そこに**selectChop**をドラッグ&ドロップします。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/311653/01424de9-80f5-048d-0d13-edbf3e70c62a.jpeg)
そうすると表形式でデータが表示されます。このデータをpythonで処理して、指さした位置を検知できるようにしてみましょう。
**textDat**を追加して下さい。いくつか方法が考えられますが、基本的なpythonの知識で作成できる例を紹介します。以下のコードを**textDat**に入力します。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/311653/154c0b1a-fb18-a4a6-2779-ca003544093b.jpeg)
解説すると、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**を用意します。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/311653/73fa9317-a6c8-4f10-eef5-4fb0b2332451.jpeg)
**name0**に**x**、**value0**に**me.mod.text1.calpos()[0]**
**name1**に**y**、**value1**に**me.mod.text1.calpos()[1]**
とすれば、指をさした時だけ、値が表示されると思います。
これでとりあえず、座標は取れました！
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/311653/995bf4f1-9ccd-9961-67ce-51bd34444c1d.jpeg)

# 続く...
ただし、この値は**hokuyoChop**における値のままですよね。
あとはこれを座標変換して、実際のTouchDesigner上の座標に合わせ込む必要があります。
それはまた次回ということで。

[測域センサでインタラクティブ！（3）](https://qiita.com/snafkinliberty/items/3bd064da4aac82fee049)

**＜制作環境＞**
　TouchDesigner099 COMMERCIAL 64-Bit Build 2019.10700
　CPU Corei9 9900K
　GPU Geforce RTX 2080Ti
　Windows10

**＜∀RroWs＞**
　[HomePage](https://www.arrowsofficial.com/)