UnityでOculus IntegrationのSampleFrameworkを使ってOculus Questのハンドトラッキングを試す


はじめに

前回は、公式通りにハンドトラッキングを試しました。
UnityでOculus Questのハンドトラッキングを使ってみる(タッチ&ピンチ)

今回は、SampleFrameworkを使ってみます。

サンプルの HandsInteractionTrainScene は試しましたか?
これを参考に、キューブをタッチしたら色が変わるシンプルなものを作っていきます。

環境

Unity 2019.2.17f1

事前準備

  • UnityでQuest用のビルドができること
  • Oculus Integration Assetsを追加していること

Scene作成

Hierarchy
Oculus > VR > Prefabs > OVRCameraRig を追加
(最初にあったMainCameraは削除しておく)

Inspector
OVR Manager (script) > Input > Hand Tracking Support → [Controllers and Hands]
OVR Manager (script) > Tracking > Tracking Origin Type → [Floor Level]

手を追加

Oculus > SampleFramework > Core > HandsInteractions > Prefabs > Hands

これだけで両手の表示ができ、タイプも指定できる

掌を手前にすると手が黄色くなるので、ホームに戻るジェスチャーをしやすい

追記

OculusIntegration v13では↓を追加するようになっていた
Oculus > SampleFramework > Core > HandsInteractions > Prefabs > HandsManager

LeftHandとRightHandにはOVRCameraRigのLeftHandAnchorとRightHandAnchorに↓を追加して指定している
Oculus > VR > Prefabs > OVRHandPrefab

インタラクティブツール追加

Oculus > SampleFramework > Core > HandsInteractions > Prefabs > InteractableToolsSDKDriver

これだけで指で操作ができる

FingerTipPokeToolIndex で、人差し指の先に青い丸が表示され、コライダーが付いている状態になる
FingerTipPokeToolMiddle を RightHandTools に追加すると、中指もインタラクティブになる
RayToolで手から線がでる

キューブ追加

Cube を追加して CubeButton とする
位置と大きさを適当に調整(Scale:0.2, position: 0, 0.5, 1)

CubeButton の下にCreateEmptyで空のGameObjectを4つ作り、それぞれ
ButtonProximity、ButtonContact、ButtonAction、ButtonPlaneCenter にしておく

Inspector

  • ButtonProximity はボタンの近接なので、Scaleを2にしておく
  • ButtonContact はボタンの位置なのでそのまま
  • ButtonAction は押した位置なので小さくしておく(positionY:-0.3, ScaleY: 0.4)

3つのGameObject全てに↓を反映

  • Box Colliderを追加し Is Triggerをチェック
  • Add Component で Button Trigger Zone(Script) を追加
  • Button Trigger Zone の Parent Interactable Obj に親のCubeButtonを指定

CubeButtonに↓を反映

  • Add Component で Button Controller (Script) を追加
  • Proximity Zone に ButtonProximity を指定
  • Contact Zone に ButtonContact を指定
  • Action Zone に ButtonAction を指定
  • Button Plane Center に ButtonPlaneCenter を指定
  • All Valid Tools Tags でどの動作をしたときに有効にするか選べる

  • CubeButtonController.csスクリプトを作成して CubeButton に追加する

CubeButtonController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OculusSampleFramework;

public class CubeButtonController : MonoBehaviour
{
    private Renderer renderer;

    private void Awake()
    {
        renderer = this.GetComponent<Renderer>();
    }

    public void ColorChanged(InteractableStateArgs obj)
    {
        switch (obj.NewInteractableState)
        {
            case InteractableState.ProximityState:
                renderer.material.color = Color.yellow;
                break;
            case InteractableState.ContactState:
                renderer.material.color = Color.red;
                break;
            case InteractableState.ActionState:
                renderer.material.color = Color.green;
                break;
            default:
                renderer.material.color = Color.blue;
                break;
        }
    }
}

インタラクティブ情報を取得し、どのステートかによって色を変えています。

  • ButtonController の Interactable State Change で+をクリック
  • 追加したCubeButtonControllerスクリプトのColorChangeを反映

ビルド

最初青で、近くなったら黄色、キューブに当たったら赤、押し込んだら緑になる

さいごに

手を下に垂らしてお化けのポーズになると、手を認識してくれないので、
真上からボタンを押すことはできなかった。

単純に楽しむためなら、簡単で使いやすい。
サンプルのようにボタンの位置がカメラに追従したり、ボタンが凹んだり、色が付いたり、クリック音が鳴ったり、作り込むのはすごいなと思った。

次回はHandsを使ったピンチ操作を試します。
UnityでOculus IntegrationのSampleFrameworkを使ってOculus Questのハンドトラッキングを試す (2)