MRが楽しい

MRやVRについて学習したことを書き残す

MetaHorizonの開発ドキュメントを読む その49(インタラクションの設定2)

本日はMetaQuestの学習枠です。
MetaHorizonの開発ドキュメントを読みながら実際に開発を行ってみました。

MetaHorizonの開発ドキュメント

MetaHorizonの開発ドキュメントを実際に手を動かしながら実行時のキャプチャをしていきます。
developers.meta.com

本記事は以下の「インタラクションの設定」の記事の中盤を試します。
developers.meta.com

インタラクションの追加

アプリ間でインタラクションを統一するため、OVR Handはフィルタリングされたポインターのポーズ情報やピンチジェスチャーの検出機能を提供しています。
これにより、開発するアプリをOculusのシステムアプリと同様のインタラクションモデルに適合させることができます。

ポインティングとクリックのみを行うシンプルなアプリであればポインターのポーズを利用して手を単純なポインティングデバイスとして扱い、ピンチジェスチャーを「クリック」操作として機能させることが可能です。

ピンチ(つまむ)

ピンチは手を使ったUI操作における基本的なインタラクション・プリミティブです。ピンチは指先が親指に触れたときに発生します。
人差し指でのピンチが成立すると、コントローラーの「選択」や「トリガー」操作に相当する動作が行われ、ボタンやその他のUIコントロールが作動します。

OVR Handは、各指に対して2種類の異なるピンチ値(ブール値の状態と連続的な強度)を提供します。
ブール値の状態はその指が現在ピンチしているかどうかを示します。
連続的な強度は指先が親指にどれだけ近づいているかを、0(近接なし)から1(接触)の範囲の正規化された値で表します。

HandFinger列挙型で使用可能な定数は、Thumb(親指)、Index(人差し指)、Middle(中指)、Ring(薬指)、Pinky(小指)です。
Index、Middle、Ring、Pinkyについてはその指の指先と親指との近接度としてピンチが測定されます。
Thumbの値は特殊なケースであり、そのピンチ強度は他の4本の指におけるピンチ強度の最大値を返し、ピンチ状態(ブール値)は他のいずれかの指がピンチしている場合にtrueを返します。

Detect pinch state (boolean)

GetFingerIsPinching() メソッドを呼び出し、指の定数を渡すことでその指が現在ピンチ状態にあるかどうかを確認できます。
このメソッドはブール値を返します。ピンチの閾値は Oculus ランタイムによって決定されるため、C# から設定することはできません。

Read pinch strength (float)

GetFingerPinchStrength() を呼び出し、指の定数を渡すことで現在のピンチジェスチャーの強さを読み取ることができます。
戻り値は 0 から 1 の範囲で、0 はピンチなし、1 は指先が親指に触れていることを示します。

このメソッドは、グローの強度制御、カーソルサイズの調整、ブレンドシェイプの駆動など連続的またはアナログ的なフィードバックに使用できます。

Check finger confidence

指のポーズの信頼度を確認するには、指を表す定数を引数として GetFingerConfidence() を呼び出します。
このメソッドはトラッキングシステムによる指のポーズの信頼度を示す TrackingConfidence.Low または TrackingConfidence.High を返します。
ピンチデータに基づいて処理を行う前にこの信頼度を確認してください。

var hand = GetComponent<OVRHand>();
bool isIndexFingerPinching = hand.GetFingerIsPinching(HandFinger.Index);
float indexFingerPinchStrength = hand.GetFingerPinchStrength(HandFinger.Index);
TrackingConfidence confidence = hand.GetFingerConfidence(HandFinger.Index);