トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Meta SDKでGoodのハンドジェスチャー認識

MetaHorizonWorldで、サムズアップジェスチャーするとエモートが出た。同じようなことを自分のプロジェクトでもやりたい。

コントローラー

Horizonはハンドトラッキング未対応だから、コントローラーでグリップとトリガー同時押しでサムズアップできる。それはCopilotに聞いてすぐできた

public class ControllerHandPoseReaction : MonoBehaviour
{

    void Update()
    {
        // Oculusのコントローラーの入力を取得
        bool isRightTriggerPressed = OVRInput.GetDown(OVRInput.RawButton.RIndexTrigger);
        bool isRightGripPressed = OVRInput.Get(OVRInput.RawButton.RHandTrigger);
        bool isLeftTriggerPressed = OVRInput.GetDown(OVRInput.RawButton.LIndexTrigger);
        bool isLeftGripPressed = OVRInput.Get(OVRInput.RawButton.LHandTrigger);

        // トリガーとグリップが同時に押されたとき
        if (isRightTriggerPressed && isRightGripPressed)
        {
        }
        if (isLeftTriggerPressed && isLeftGripPressed)
        {

        }
        if (isLeftTriggerPressed && isLeftGripPressed && isRightTriggerPressed && isRightGripPressed)
        {
            //
        }
    }
}

ハンドトラッキング

せっかくなのでハンドトラッキングでもやりたい。

この記事見て、スクリプト書かなくても簡単にできそうなのでやってみた

qiita.com

公式ドキュメント

developer.oculus.com

手とかはもろもろセットアップ済みなので書かない

OVRInteraction下のHandFeatureRight(とLeft)にFingerFeatureStateProviderをつける。

各指には以下の場所にある何かをセットする。これがなんなのか全然わからない

 

次にプロジェクトで、Create>Oculus>PoseDetection>shapeから指の形を指定するファイルを作る

ここでジェスチャーを登録

むずかしい

https://developer.oculus.com/documentation/unity/unity-isdk-hand-pose-detection/

そして適当なオブジェクトにShapeRecognizerActiveStateをつけて、Handと今まで触ったもろもろを登録

あとはジェスチャーイベントを検知してやりたいことをするだけ。

ActiveStateUnityEventWrapperを使えばかんたんにInspectorでイベント検知&イベントができる

これで無事できた

でも腕の向き決めてないからブーでも出る

公式サンプル

自分でやった後に気づいたけど、公式でサムズアップのプレハブ用意されてた

そういえば昔このサンプルシーン触ったな。poseexample

ドキュメントを見るとちゃんと手の方向も設定できる

TransformFearureStateを手に付ける。

これをThumbsUpPoseから参照して全部埋まるとうまく動いた!

ちゃんと下向きの時は反応しない。

 

ちなみにShapeReacognizerもいろいろ用意されている

ThumsUpの正解はこれなのか