ダイレクトタッチ(ポーク)を実現する Poke Interaction の概説【Oculus Interaction SDK】
Oculus Interaction SDK
Oculus Interaction SDK についてはこちらの記事を参照ください.
検証環境
- Unity 2020.3.26f1
- Oculus Integration v39
Poke Interaction
ユーザーが直接タッチ(ダイレクトタッチ)することで平面とインタラクションすることができる機能です. Poke という言葉をご存じでしょうか.Facebook アプリの Poke を知っている方がいれば馴染み深いですが, 「(指で)つつく」イメージです.ダイレクトタッチのことをポークと呼んでいるようです.
機能説明
Poke Interaction を構成する各機能群について説明します.
Poke Interactor
ポークを行うための IIteractor 実装コンポーネントです.主に指先,拳,掌,手などに使われると思います. Poke Interactable の平面に対して,ホバーとセレクトを実行するための点のTransform を定義しています.
Poke Interactor の主な役割としては以下の通りです.
- 最も近い Poke Interactable を探索する
- 最も近い Poke Interactable との距離を計算し,Interactable の状態を Normal・Hover・Selected の状態に更新する
Poke Interactable
ポークされるための IInteractable 実装コンポーネントです. 本コンポーネントがアタッチされたオブジェクトはポークされるようになります. 面を持つコンポーネントであれば UI Canvas でも Mesh Renderer でもどちらでも適用できます.
Proximity Field,Max Distance,Release Distance を定義して,Normal・Hover・Select の状態に更新されるようにします.
Poke Interactor,Max Distance,Release Distance,Poke Interactable (Proximity Field) の関係は以下の図になります.
Poke Interactor と Poke Interactable の距離が Max Distance 内になった瞬間,Hover 状態になります. Poke Interactor が Poke Interactable の平面と平面法線方向と交わった時,Select 状態になります. Release Distance が 0 の場合,Select 状態からそのままポークし続けても Select 状態を保ちますが, Release Distance が 0 より大きい場合,Poke Interactable から Release Distance で設定した値を超えると, Select 状態が解除され,Normal 状態になります.
Enter Hover Distance が 0 より大きい値に設定されていた場合,Max Distance の値と Enter Hover Distance の値で, 小さい方が Hover 判定距離として利用されます. (上記の図は v37 の時に描いてた時は Enter Hover Distance がありませんでしたが v39 現在では追加されていました)
Interactable Unity Event Wrapper
Interactable の状態が変化した時にイベントを発火した場合に利用します.
IProximity Field
Collider.ClosestPoint()
を利用せずに指定座標に最も近い3次元座標を見つけるVector3 ComputeClosestPoint(Vector3 point)
を持っています.
Interaction SDK では Box Proximity Field,Circle Proximity Field,Point Proximity Field が提供されており,
自前で ComputeClosestPoint の計算をしています.
Poke Interactable Visual
Interactor と Interactable の距離が Max Distance 内にある場合に Interactable の位置を更新する役割を持ちます. ボタンに見かけ上の圧力を加えているかのような描画をさせることができます.
Interactable Color Visual
Interactable の状態(Normal・Hover・Select)に合わせて,色のビジュアルを更新する役割を持ちます.
排他制御
Poke Interaction は Interactor がすでに Interactable とインタラクションしている時, 他の Interactable とインタラクションできないようになっています.結構優秀です.
Hand Poke Limiter Visual
Hand Poke Limiter Visual を利用しない場合,Select 完了後にそのまま押し込んでしまうと突き抜けてしまいますが, こちらを利用することで突き抜けを防止することができます.機能を有効にするためには以下のコンポーネントが必要になります.
Synthetic Hand
Poke Interaction を実行している手のデータの手首の位置を固定させているように見せかけるために必要なコンポーネントです. Synthetic は直訳すると合成という意味なので,見かけ上の手みたいな感じでしょうか. 手のメッシュのアニメーションを上書きしている感じです.
終わりに
後日別の記事に挙げますが,Oculus Interaction SDK のコンポーネント設計はいい感じにキレイになっています. なので,1コンポーネントに対する機能が明確になっていると感じます. Unity Event 用のラッパーもわかれていたり,SerializeField も疑似 DI として利用している点もあってすごくいい. Oculus Interaction SDK の InterfaceAttribute が個人的に Unity 標準で欲しい.
誤りなどあれば指摘お願いします!m(_ _)m
本当であれば 2月時点で記事をあげていたのですが,だらだらしてたら5月になりました…. 2月時点の v37 と5月時点の v39 で色々コンポーネント名が変わったり,Inspector の設定が変わっています. 画像は一通り置き換えたり Obsolete になった命名も新しい方に変えたはずですが漏れがあればご指摘ください.
参考資料
Direct Touch | Oculus Developers