Oculus Quest + Unity 2019.3 pinch test

今回はピンチ操作をかるく触ってみる

前回のつづきから

gamaspecial.hatenablog.com

なんかオブジェクトを配置

今回は「Cube」を使用

f:id:gamaspecial:20200605021945p:plain

(大きさ、場所は適当に調整する。

IsTrigger

言葉通り「引き金」の意で、物理的接触がない何かしらの処理をする場合に使用する
オブジェクトのIsTriggerにチェックを入れるだけ(今回はCubeの

f:id:gamaspecial:20200606051015p:plain

トリガー発生時のイベント処理

今回は、物理的接触がない処理としてピンチ操作を試してみる。

ピンチ操作の統合 ピンチ操作は、手を使用するUIインタラクションとしては、昔からある基本的なインタラクションです。人差し指のピンチ操作が適切に行われると、コントローラーの通常の選択やトリガーのアクションと同じ操作、つまり、UI上のボタンなどのコントロールをアクティブにする操作とみなされます。

指が現在ピンチ操作をしているかどうかを検出し、そのピンチ操作の強さをチェックするには、OVRHand.csからGetFingerIsPinching()およびGetFingerPinchStrength()のメソッドを呼び出します。クエリの対象となる指について、HandFinger列挙で定義される、関係する指の定数を渡します。指の定数は、Thumb、Index、Middle、Ring、およびPinkyです。

今回は人差し指(Index)でいきます

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.UI;

public class MyHand : MonoBehaviour {
    private OVRHand hand;
    private new Renderer renderer;

    void Start() { // Use this for initialization (初期化に使用)
        // Cubeを取得する
        renderer = GameObject.Find("Cube").GetComponent<Renderer>();
        hand = this.gameObject.GetComponent<OVRHand>();
    }

    void Update() { // Update is called once per frame (Update はフレームごとに 1 回呼び出されます)
        bool isPinch = hand.GetFingerIsPinching(OVRHand.HandFinger.Index);
        float strength = hand.GetFingerPinchStrength(OVRHand.HandFinger.Index);
        string message = "GetFingerIsPinching -> " + isPinch + "(" + strength + ")";

        if (isPinch) {
            renderer.material.color = Color.blue;
        } else {
            renderer.material.color = Color.white;
        }

        GameObject.Find("TrackingManager").GetComponent<TextMesh>().text = message;
    }
}

骨格ID

Invalid          = -1
Hand_Start       = 0
Hand_WristRoot   = Hand_Start + 0 // root frame of the hand, where the wrist is located
Hand_ForearmStub = Hand_Start + 1 // frame for user's forearm
Hand_Thumb0      = Hand_Start + 2 // thumb trapezium bone
Hand_Thumb1      = Hand_Start + 3 // thumb metacarpal bone
Hand_Thumb2      = Hand_Start + 4 // thumb proximal phalange bone
Hand_Thumb3      = Hand_Start + 5 // thumb distal phalange bone
Hand_Index1      = Hand_Start + 6 // index proximal phalange bone
Hand_Index2      = Hand_Start + 7 // index intermediate phalange bone
Hand_Index3      = Hand_Start + 8 // index distal phalange bone
Hand_Middle1     = Hand_Start + 9 // middle proximal phalange bone
Hand_Middle2     = Hand_Start + 10 // middle intermediate phalange bone
Hand_Middle3     = Hand_Start + 11 // middle distal phalange bone
Hand_Ring1       = Hand_Start + 12 // ring proximal phalange bone
Hand_Ring2       = Hand_Start + 13 // ring intermediate phalange bone
Hand_Ring3       = Hand_Start + 14 // ring distal phalange bone
Hand_Pinky0      = Hand_Start + 15 // pinky metacarpal bone
Hand_Pinky1      = Hand_Start + 16 // pinky proximal phalange bone
Hand_Pinky2      = Hand_Start + 17 // pinky intermediate phalange bone
Hand_Pinky3      = Hand_Start + 18 // pinky distal phalange bone
Hand_MaxSkinnable= Hand_Start + 19
// Bone tips are position only. They are not used for skinning but are useful for hit-testing.
// NOTE: Hand_ThumbTip == Hand_MaxSkinnable since the extended tips need to be contiguous
Hand_ThumbTip    = Hand_Start + Hand_MaxSkinnable + 0 // tip of the thumb
Hand_IndexTip    = Hand_Start + Hand_MaxSkinnable + 1 // tip of the index finger
Hand_MiddleTip   = Hand_Start + Hand_MaxSkinnable + 2 // tip of the middle finger
Hand_RingTip     = Hand_Start + Hand_MaxSkinnable + 3 // tip of the ring finger
Hand_PinkyTip    = Hand_Start + Hand_MaxSkinnable + 4 // tip of the pinky
Hand_End         = Hand_Start + Hand_MaxSkinnable + 5
Max              = Hand_End + 0