なんかいろいろしてみます

Mar 18, 2020 - 1 minute read - HoloLens

HoloLens 2で利用できるジェスチャー入力について(Unity 2019編)

Unity 2019以降ではPackege ManagerによるWindows XR PluginによるHoloLens 2アプリ開発が推奨されています.

Unity 2019でのHoloLens開発環境の設定項目

  • HoloLensアプリ開発用にUnityにUWPのモジュールを追加します.(Unity 2019からUWPビルドはIL2CPPのみサポートされます.)

  • Build SettingsのPlatformをUWPに変更

  • Windows XR Pluginを利用する場合XR Settingsは変更しないでください

Windows XR Pluginの導入

Unity 2019からは今までのUnityEngine.XR.WSA.Inputから利用できる機能ではなくWindows XR Pluginを利用するように推奨されています.

UnityEngine.XR.WSA.Inputを利用したジェスチャー入力の使い方はHoloLens 2で利用できるジェスチャー入力について(Unity 2018編)

Windows XR Pluginのドキュメントはこちら

UnityのScene設定

  • カメラにTracked Pose Driverをアタッチして以下のように設定値を指定します.

  • ハンドトラッキング用のGameObjectにTracked Pose Driverをアタッチして左右それぞれに設定を行います.

ここまでの設定でHoloLens 2のカメラとハンドの追従が行えるようになります.

ジェスチャー入力の実装方法

ハンドトラッキングまではWindows XR Pluginで行えるのですが,AirTapの利用がプラグインから見つけられなかったのでUWPの関数から検出を行うことにしています.

123
#if WINDOWS_UWP
using Windows.UI.Input.Spatial;
#endif

利用する機能によってはUWP,Unity共に動作可能なThreadが異なります.

InvokeOnUIThreadInvokeOnAppThreadを利用することで適切なThreadに切り替えを行う必要があります.

  • UI ThreadよりAirTap情報を取得できるSpatialInteractionManagerを取得しイベントを登録します. 今回はAirTapの検出なのでPressとReleaseのみですが,ハンドの検出・検出終了・更新のイベントも利用できます.
 1 2 3 4 5 6 7 8 910111213141516171819202122
#if WINDOWS_UWP
        SpatialInteractionManager spatialInteraction = null;
        UnityEngine.WSA.Application.InvokeOnUIThread(() =>
        {
            spatialInteraction = SpatialInteractionManager.GetForCurrentView();
        }, true);
        spatialInteraction.SourcePressed += SpatialInteraction_SourcePressed;
        spatialInteraction.SourceReleased += SpatialInteraction_SourceReleased;
#endif
    }

#if WINDOWS_UWP
    private void SpatialInteraction_SourceReleased(SpatialInteractionManager sender, SpatialInteractionSourceEventArgs args)
    {
        // Release
    }

    private void SpatialInteraction_SourcePressed(SpatialInteractionManager sender, SpatialInteractionSourceEventArgs args)
    {
        // Press
    }
#endif
  • イベント取得後のUnityへの反映時にはUnity Threadに戻ってくる必要があるのでInvokeOnAppThread内でGameObjectなどに反映させます.
 1 2 3 4 5 6 7 8 9101112131415
    private void SpatialInteraction_SourcePressed(SpatialInteractionManager sender, SpatialInteractionSourceEventArgs args)
    {
        var item = args.State;
        UnityEngine.WSA.Application.InvokeOnAppThread(() =>
        {
            if (item.Source.Handedness == SpatialInteractionSourceHandedness.Right)
            {
                // Right Hand
            }
            else if (item.Source.Handedness == SpatialInteractionSourceHandedness.Left)
            {
                // Left Hand
            }
        }, false);
    }

実際にWindows XR Pluginを利用して両手のハンドを利用した動画とサンプルプロジェクトが以下になります.

GitHub : HoloLens2InputSampleWithUnity

まとめ

  • プラグインを導入することでUnity Scene内のみでカメラとハンドの追従までできる
  • Hand Meshや関節情報の取得は行えない