はじめに
TouchDesignerアドカレ19日目に投稿させていただきます。
@theruleisobeyedです。XR系ベンチャーの中の研究系チームにいます。
昨年の記事はこちら↓
[TouchDesigner]Parent Shortcutを活用して強固なシステムを作る
当たり判定を取りたい
インタラクティブコンテンツを作る際に、トリガーに便利な衝突の判定に関して、TouchDesignerでの実装例が見当たらなかったため本稿ではその一例をご紹介できればと思います。
今回は空間上に配置された点群に対して空間上のオブジェクト(コライダー)の当たり判定を取得し、当たり判定が出ている点に対して情報を割り当てることを考えます。(今回は衝突中の点に中心からの距離に応じた色を付けます)
##サンプル
こちら↓
https://github.com/ktkt40208/TD_CollisionDetector
考え方
今回の例ではDelete SOPを1対多の当たり判定取得に用います。
DeleteSOPではBounding TypeでBounding BoxとBounding Sphereの二種類の形状を選択でき、
入力された点群に対してコライダーの形状の中に内包された点または内包されていない点の情報を取得できます。これを用いて空間上の点とコライダーとの当たり判定を取っていきます。ここでは7x7x7のグリッド状に配置された点群(総数343点)に対して直方体または球体(楕円体)を動かして衝突させます。
内包された点と内包されなかった点の情報の整理
ただしこのままではコライダーに内包されたorされなかった点のそれぞれの中でのindexと各点の座標情報しか残らないため、全体から見た各点のindexを情報として持たせます。Point SOPのCustomタブでCustom Attrib Type: int とし、custom1val1にme.inputPoint.indexを
指定することでにより343点に対して0-342のインデックスを割り当てることができます。
このindex情報をコライダーに内包された点と内包されなかった点それぞれの情報を0,1の値と対応したDATに変換し、合成することで343chの0-1情報へ変換します。
各点毎にユニークな情報の付加と可視化
それでは何かこの343点に対して各点毎にユニークな情報を付加して可視化してみましょう。
コライダーの中心座標からの距離に応じた0-1の値を計算(343ch)し、先程の衝突情報を記録した343chのCHOPと掛け合わせて、
衝突している点のみに対してそのコライダー中心座標からの距離に応じたRGBの値を計算し、
Geometry Instancingで表示します。
以上になります。
##制約
今回の実装ではDelete SOPを用いて行いました。その制約として、DeleSOPのBounding TypeのBounding BoxとBounding Sphereに形状が制限されています。
自身のプロジェクトでは点群との衝突を判定する形状はプリミティブで十分でしたので気にせず運用ができましたが、そうでない場合はSDF周りの計算を挟んで解決する形になるのではと考えています。
また、Delete SOPを使う上でBoundのSizeとCenterは操作可能なものの、Rotationのパラメタが存在しないため、Delete SOPの計算前にBoundオブジェクトの回転を打ち消す座標変換を行ってから計算を行う段取りになっています。
もし似たような課題に取り組まれた方がいらっしゃればコメントいただけると幸いです。