MRが楽しい

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

MRTK v2のドキュメントを少しずつ読み解く Eye-supported target selection その2

本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。

MRTKv2のGuidesドキュメント

以下のドキュメントを読み進めていきます。
microsoft.github.io

以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io

本記事では以下のページを読み進めます。
microsoft.github.io
f:id:bluebirdofoz:20200226093411j:plain

Eye-supported target selection

2.独立した視線固有のEyeTrackingTarget

最後に、EyeTrackingTargetスクリプトを使用して、他のフォーカスポインターから完全に独立した視線の入力を処理できるソリューションを提供します。

これには3つの利点があります。

・ホログラムがユーザーの視線にのみ反応することを確認できます。
・アクティブなプライマリ入力から独立します。したがって複数の入力を一度に処理することができます。
例えば、目の照準と手のジェスチャーを組み合わせます。
・既存の動作を処理および再利用できるように、いくつかのUnityイベントが既にセットアップされています。

欠点もいくつかあります。

・個別の入力を個別に処理するため、より多くの作業が必要です。
・視線のみをサポートするため、アイトラッキングが機能しない場合は追加のフォールバックが必要です。

BaseFocusHandler と同様に、EyeTrackingTarget には、視線に固有のいくつかのUnityイベントが用意されています。
UnityEditor またはコードで AddListener() を使用して簡単に受け取ることができます。

・OnLookAtStart()
・WhileLookingAtTarget()
・OnLookAway()
・OnDwell()
・OnSelected()

以下では、EyeTrackingTargetの使用方法の例をいくつかご紹介します。

例#1:アイトラッキングのスマート通知

EyeTrackingDemo-02-TargetSelection.unity では、あなたの視線に反応する「スマート通知」の例を見つけることができます。
これらはシーンに配置できる3Dテキストボックスであり、見たときにスムーズに拡大し、ユーザーの方を向きます

ユーザーが通知を読んでいる間、情報は鮮明かつ明確に表示され続けます。
読み終わった後、通知から目をそらすと、通知は自動的に閉じられてフェードアウトします。

これを実現するために、視線追跡固有ではないいくつかの一般的な動作スクリプトがあります。

・FaceUser
・ChangeSize
・BlendOut

このアプローチの利点は、さまざまなイベントで同じスクリプトを再利用できることです。
と他えば、音声コマンド、または、仮想ボタンを押した後に、ホログラムがユーザーに向き合うようになります。
これらのイベントをトリガーするには GameObject にアタッチされている EyeTrackingTarget スクリプトのメソッドを参照するだけです。

「スマート通知」の例では、次のことが起こります。

・OnLookAtStart():以下の通知動作が開始されます。
 - FaceUser.Engage:ユーザーの方を向きます。
 - ChangeSize.Engage:サイズの増加を行います(指定された最大スケールまで)。
 - BlendOut.Engage:(アイドル状態になってから)ブレンドを開始します。
・OnDwell():通知が十分に確認されたことをBlendOutスクリプトに通知します。
・OnLookAway():以下の通知動作が開始されます...
 - FaceUser.Disengage:元の向きに戻ります。
 - ChangeSize.Disengage:元のサイズに戻します。
 - BlendOut.Disengage:ブレンドアウトを開始します … OnDwell() がトリガーされた場合、完全にブレンドアウトして破棄します。そうでなければ、アイドル状態に戻ります。

設計上の考慮事項

ここでの体験の鍵はこれらの動作の速度を慎重に調整することです。
ユーザーの視線に反応しすぎて不快感を引き起こさないようにします。
f:id:bluebirdofoz:20200226093434j:plain

例#2:ホログラフィックジェムを見るとゆっくり回転する

EyeTrackingDemo-02-TargetSelection.unity シーンでホログラフィックジェムのホバーフィードバックを簡単に作成できます。
これは、見たときに一定の方向に一定の速度でゆっくりと回転します。
必要なのは EyeTrackingTarget の WhileLookingAtTarget() イベントからホログラフィック宝石の回転をトリガーすることです。

詳細は次のとおりです。

関連付けられている GameObject を回転させるパブリック関数を含む汎用スクリプトを作成します。
以下は UnityEditor から回転方向と回転速度を調整できる RotateWithConstSpeedDir.cs の例です。

using UnityEngine;

namespace Microsoft.MixedReality.Toolkit.Examples.Demos.EyeTracking
{
    /// <summary>
    /// The associated GameObject will rotate when RotateTarget() is called based on a given direction and speed.
    /// 指定された方向と速度に基づいてRotateTarget() が呼び出されると、関連付けられた GameObject が回転します。
    /// </summary>
    public class RotateWithConstSpeedDir : MonoBehaviour
    {
        [Tooltip("Euler angles by which the object should be rotated by.")]
        [SerializeField]
        private Vector3 RotateByEulerAngles = Vector3.zero;

        [Tooltip("Rotation speed factor.")]
        [SerializeField]
        private float speed = 1f;

        /// <summary>
        /// Rotate game object based on specified rotation speed and Euler angles.
        /// 指定された回転速度とオイラー角に基づいて GameObject を回転します。
        /// </summary>
        public void RotateTarget()
        {
            transform.eulerAngles = transform.eulerAngles + RotateByEulerAngles * speed;
        }
    }
}

以下のスクリーンショットに示すように EyeTrackingTarget スクリプトをターゲットの GameObject に追加します。
UnityEvent トリガーで RotateTarget() 関数を参照します。
f:id:bluebirdofoz:20200226093447j:plain

例#3:ジェムをポップする(multi-modal eye-gaze-supported target selection)

前の例ではターゲットが見られているかどうかを検出するのがどれほど簡単か。
そして、それに対する反応をトリガーする方法を示しました。

次に EyeTrackingTarget の OnSelected() イベントを使用して、ジェムを爆発させましょう。
重要な部分は、選択をトリガーする方法です。
EyeTrackingTarget を使用すると、選択を呼び出す様々な方法をすばやく割り当てることができます。

ピンチジェスチャ

「Select Action」を「Select」に設定すると、デフォルトの手のジェスチャーを使用して選択がトリガーされます。
これは、ユーザーが単に手を上げて親指と人差し指を摘むだけで選択できることを意味します。

音声コマンド「Select」

ホログラムを選択するには、デフォルトの音声コマンド「Select」を使用します。

音声コマンド「Explode」または「Pop」

カスタム音声コマンドを使用するには、2つの手順を行う必要があります。

・プロファイルの Input -> Speech を開きます。
・「Add a new speech command」をクリックして音声コマンドを作成します。
・音声コマンドに作成したアクションを関連付けます。
・また、キーコードを割り当てて、ボタンを押すことでアクションをトリガーできるようにします。
f:id:bluebirdofoz:20200226093459j:plain

宝石を選択すると爆発し、音が鳴って消えます。
これは HitBehaviorDestroyOnSelect スクリプトによって処理されます。
次の2つのオプションがあります。

UnityEditor内の設定

ジェムに添付されているスクリプトを UnityEditor の OnSelected() の UnityEvent にリンクするだけです。

コード内の設定

GameObjects をドラッグアンドドロップしたくない場合はスクリプトにイベントリスナーを直接追加することもできます。
HitBehaviorDestroyOnSelect スクリプトで行った方法の例を次に示します

/// <summary>
/// Destroys the game object when selected and optionally plays a sound or animation when destroyed.
/// 選択するとゲームオブジェクトを破棄し、オプションで破棄するとサウンドまたはアニメーションを再生します。
/// </summary>
[RequireComponent(typeof(EyeTrackingTarget))] // This helps to ensure that the EyeTrackingTarget is attached
public class HitBehaviorDestroyOnSelect : MonoBehaviour
{
    ...
    private EyeTrackingTarget myEyeTrackingTarget = null;

    private void Start()
    {
        myEyeTrackingTarget = this.GetComponent<EyeTrackingTarget>();

        if (myEyeTrackingTarget != null)
        {
            myEyeTrackingTarget.OnSelected.AddListener(TargetSelected);
        }
    }

    ...

    ///
    /// This is called once the EyeTrackingTarget detected a selection.
    /// EyeTrackingTargetが選択を検出すると呼び出されます。
    ///
    public void TargetSelected()
    {
        // Play some animation
        // アニメーションを再生する
        // Play some audio effect
        // オーディオエフェクトを再生する
        // Handle destroying the target appropriately
        // ターゲットを適切に破壊する
    }
}

例#4:ハンドレイと視線入力を一緒に使用する

ハンドレイは、頭と視線のターゲティングより優先されます。
つまりハンドレイが有効になっている場合、手が見えるようになると、ハンドレイがプライマリポインターとして機能します。
一方でユーザーが特定のホログラムを見ていることを検出しながら、ハンドレイを使用したい場合があります。

これには2つの設定手順があります。

ハンドレイを有効にする

ハンドレイを有効にするには、プロファイルの Input-> Pointers を開きます。

EyeTrackingingDemo-00-RootScene では全てのアイトラッキングデモシーンに対して Mixed Reality Toolkit が構成されています
EyeTrackingDemoPointerProfile を確認してください。
新しい入力プロファイルを最初から作成するか、現在の視線追跡の設定をカスタマイズすることができます。

最初から作成する場合

Pointer タブのコンテキストメニューから DefaultMixedRealityInputPointerProfile を選択します。
これは、既にハンドレイが有効になっているデフォルトのポインタープロファイルです。
デフォルトのカーソル(不透明な白い点)を変更するにはプロファイルを複製して、独自のカスタムポインタープロファイルを作成します。
次に Gaze Cursor Prefab の下で DefaultCursor を EyeGazeCursor に置き換えます。
f:id:bluebirdofoz:20200226093523j:plain

EyeTrackingDemoPointerProfileをカスタマイズする場合

EyeTrackingDemoPointerProfile をダブルクリックし、ポインターオプションの下に次のエントリを追加します。
・PointerPrefab:DefaultControllerPointer
・ControllerType:Articulated Hand, Windows Mixed Reality
・Handedness:Any
f:id:bluebirdofoz:20200226093532j:plain

ホログラムが見られていることを検出する

前述の通り、EyeTrackingTarget スクリプトを使用して、ホログラムが見られることを検出できるようにします。
また、ハンドレイが有効かどうかに関係なく、視線のホログラムが表示されるので、インスピレーションを得るために FollowEyeGaze サンプルスクリプトを確認することもできます。
これでアイトラッキングデモシーンを開始すると、ハンドレイが見えるはずです。

例えば視線追跡ターゲット選択デモでは、半透明の円がまだ視線を追跡しており、宝石は見ているかどうかに反応します。
一方で、トップシーンメニューボタンはプライマリ入力ポインター(手)を使用できるようになります。
f:id:bluebirdofoz:20200226093542j:plain