wrnchAIが入ったのが話題になりがちなTouchDesignerですが、同時にJSON DATも入ったの知ってました?
他アプリケーションで吐いたデータを使うときに、いままでTDのためにわざわざCSVで書き出してたのが結構楽になると思うのでとりあえず使ってみました。
本記事で使用したバージョンは2020.40290です。
Experimental:JSON DAT(公式ドキュメント)
https://docs.derivative.ca/Experimental:JSON_DAT
Experimental版のTouchDesignerのDLはこちら
https://derivative.ca/download/experimental
今回はサンプルとして、このページのスケルトンデータを読んで表示してみます。
https://kinectron.github.io/docs/example-skeleton-images-azure.html
#TouchDesigner experimentalに追加されてたJSON DATを使って https://t.co/PlE0ZPFnSB ここのモーションデータを表示してみた。 pic.twitter.com/dH6MAAcdHN
— 岩谷成晃 (@nariakiiwatani) August 17, 2020
ファイルからの読み込みはFile in DATで
書くほどでもないことですが、JSON DATはあくまでテキストのパーサなので、ファイルに書いてあるJSONデータを使いたい時は通常通りFile in DATで読み込んでから渡す必要があります。
NDJSONとか読むときに便利そうですね。
DATの出力は文字列。データはopアクセスもしくはevalで
JSONをパースした結果をXML DATのようにTableによしなに並べてくれるみたいな機能はなさそうでした。
DATからの出力はFormat(Pretty print的な)するかどうかを選べるだけで、あくまでひとつのJSON文字列であるようです。
パース結果は、dat.result
で取り出して利用することができます。
このリンクで言っているJSONable Python Object
にあたるものだと思います。
https://docs.derivative.ca/TDJSON
一応、resultをオペレータのStorageに入れて、Examine DATでTable化することはできはします。
トップレベルがArrayで包まれる
これまでのスクショで気づいた方もいるかも知れませんが、元データがJSON DATに入ると一層深くArrayで包まれます。
JSON DATの出力をさらにJSON DATに食わせるともう一層追加されます。
JSON DATのリファレンスを読むと、パース結果のオブジェクトへのアクセスは
-
DAT.source
: 入力のパース結果 -
DAT.results
:JSONPath Filter
パラメータでフィルタリングされた結果 -
DAT.result
:DAT.results
の最初の要素
の3通りが用意されているようです。
おそらくこのresult
とresults
が常に存在することを担保するために、Arrayで包む仕様になっているのかもしれません。
じゃあDAT.results
の方いらんくね?とも思うんですが、この辺まだよく捉え切れてなくてなんとも言えないです。
Python Objectはevalに突っ込むこともできます。
結果がArrayの場合、JSON DAT => Eval DAT => Convert DATでTableに変換すると扱いやすかったです。
結果がObject(dict)の場合、さっき書いたようにStorageに突っ込むか、ちまちまスクリプトを書くかしか扱う方法がなさそうで、それだといまいちJSON用オペレータが組み込まれたインパクトが薄いなーと思っています。
フィルタリング
ということで元データがどんな形であれ、最終的にArrayになるようなデータ抽出をしたいわけですが、それを可能にするのがこのフィルタリング機能です。
JSONPathという記法で抽出するデータを指定します。
ここでなんとなくDAT.results
にも意味があるような気がしてきましたが、なんか掴みどころがなくてやっぱりまだよくわかってません。
スケルトンデータ読み込み
ここまで書いて力尽きてきたのでGitHubにあげてリンクするだけにします。。
https://github.com/nariakiiwatani/TouchDesignerEx_JSONDAT_sample
ざっくり解説すると
- JSONファイルを読む(File in DAT)
- 各関節のカメラからの3D座標と回転(Quaternion)を1フレーム毎に取り出せるようJSONPathを記述(JSON DAT)
- 回転(Quaternion)をインスタンシングで使えるようにオイラー角に変換(Script CHOP)
- 各関節の1フレーム分の位置と回転をCHOPひとつになるようにShuffleとかSelectとかでデータをいじる
- それをGeometry COMPに突っ込んでインスタンシング
ということをやっています。