HoloLens (第 1 世代) 入力 211 - ジェスチャ

重要

Mixed Reality Academy のチュートリアルは、HoloLens (第 1 世代)、Unity 2017、Mixed Reality イマーシブ ヘッドセットを考慮して設計されています。 そのため、それらのデバイスの開発に関するガイダンスを引き続き探している開発者のために、これらのチュートリアルをそのまま残しておくことが重要だと考えています。 これらのチュートリアルは、HoloLens 2 に使用される最新のツールセットや対話式操作を反映して更新されることは "ありません"。また、最新バージョンの Unity には対応していない可能性があります。 これらは、サポートされているデバイス上で継続して動作するように、保守されます。 HoloLens 2 向けには、新しいチュートリアル シリーズが投稿されています。

ジェスチャにより、ユーザーの意図が動作になります。 ユーザーはジェスチャを使用して、ホログラムを操作できます。 このコースでは、ユーザーの手を追跡する方法、ユーザーの入力に応答する方法、手の状態と位置に基づいてユーザーにフィードバックを提供する方法について説明します。

MR 基本 101 では、単純なエアタップ ジェスチャを使用して、ホログラムを操作しました。 ここでは、エアタップ ジェスチャを超えて、次のような新しい概念を探ります。

  • ユーザーの手が追跡されていることを検出し、ユーザーにフィードバックを提供する。
  • ナビゲーション ジェスチャを使用して、ホログラムを回転させる。
  • ユーザーの手が視界から消えそうなときにフィードバックを提供する。
  • 操作イベントを使用して、ユーザーが自分の手でホログラムを移動できるようにする。

このコースでは、MR 入力 210 で構築した Unity プロジェクト モデル エクスプローラーを見直します。 宇宙飛行士である友だちが、これらの新しいジェスチャの概念の探索を支援するために戻ってきました。

重要

以下の各章に埋め込まれているビデオは、古いバージョンの Unity と Mixed Reality ツールキットを使用して録画されたものです。 詳細な手順は正確であり現行のものですが、対応するビデオの台本とビジュアルが最新ではない可能性があります。 ビデオは、今後のユーザーのため、また説明されている概念がまだ適用されるため、埋め込んだままになっています。

デバイス サポート

コース HoloLens イマーシブ ヘッドセット
MR 入力 211:ジェスチャ ✔️ ✔️

開始する前に

前提条件

プロジェクト ファイル

  • プロジェクトに必要なファイルをダウンロードします。 Unity 2017.2 以降が必要です。
  • デスクトップなどのアクセスしやすい場所にファイルをアーカイブ解除します。

Note

ダウンロードする前にソース コードを確認する場合は、GitHub で参照できます。

正誤表と注意事項

  • コード内のブレークポイントにヒットさせるために、Visual Studio で、[ツール] -> [オプション] -> [デバッグ] の下にある [マイ コードのみを有効にする] を無効 (''オフ'') にする必要があります。

第 0 章 - Unity のセットアップ

Instructions

  1. Unity を起動します。
  2. [Open] を選択します。
  3. 先ほどアーカイブ解除した Gesture フォルダーに移動します。
  4. Starting/Model Explorer フォルダーを見つけて選択します。
  5. [フォルダーの選択] ボタンをクリックします。
  6. [プロジェクト] パネルで、Scenes フォルダーを展開します。
  7. [ModelExplorer] シーンをダブルクリックして Unity に読み込みます。

ビルド

  1. Unity で、[File] (ファイル) > [Build Settings] (ビルド設定) の順に選択します。
  2. Scenes/ModelExplorer[ビルド内のシーン] に一覧表示されていない場合は、[開いているシーンを追加] をクリックしてシーンを追加します。
  3. HoloLens 向けに特別に開発している場合は、[ターゲット デバイス][HoloLens] に設定します。 それ以外の場合は、[任意のデバイス] のままにします。
  4. [ビルドの種類][D3D] に設定され、[SDK][最新のインストール] に設定されていることを確認します (SDK 16299 以降である必要があります)。
  5. [ビルド] をクリックします。
  6. 「App」という名前の新しいフォルダーを作成します。
  7. [App] フォルダーを 1 回クリックします。
  8. [フォルダーの選択] をクリックすると、Unity によって Visual Studio のプロジェクトのビルドが開始されます。

Unity での作業が終了すると、エクスプローラー ウィンドウが表示されます。

  1. [App] フォルダーを開きます。
  2. ModelExplorer Visual Studio ソリューションを開きます。

HoloLens に配置する場合:

  1. Visual Studio の上部ツールバーを使用して、ターゲットを [デバッグ] から [リリース] に変更し、[ARM] から [x86] に変更します。
  2. [ローカル コンピューター] ボタンの横にあるドロップダウン矢印をクリックし、[リモート コンピューター] を選択します。
  3. HoloLens デバイスの IP アドレスを入力し、認証モードを [ユニバーサル (暗号化されていないプロトコル)] に設定します。 [選択] をクリックします。 デバイスの IP アドレスがわからない場合は、[設定] [ネットワーク] & [インターネット>の詳細オプション] > を参照してください
  4. 上部メニュー バーで [デバッグ] > [デバッグなしで開始] をクリックするか、Ctrl + F5 キーを押します。 初めてデバイスにデプロイしている場合は、Visual Studio とのペアリングが必要です。
  5. アプリが配置されたら、選ぶというジェスチャを使用して、Fitbox を閉じます。

イマーシブ ヘッドセットに配置する場合:

  1. Visual Studio の上部ツールバーを使用して、ターゲットを [デバッグ] から [リリース] に変更し、[ARM] から [x64] に変更します。
  2. 配置ターゲットが [ローカル コンピューター] に設定されていることを確認します。
  3. 上部メニュー バーで [デバッグ] > [デバッグなしで開始] をクリックするか、Ctrl + F5 キーを押します。
  4. アプリが配置されたら、モーション コントローラーでトリガーをプルして、Fitbox を閉じます。

Note

Visual Studio の [エラー] パネルに赤色のエラーがいくつか表示されることがあります。 これらは無視してかまいません。 実際のビルドの進行状況を表示するには、[出力] パネルに切り替えます。 [出力] パネル内のエラーは修正する必要があります (ほとんど場合、スクリプトの誤りが原因です)。

第 1 章 - 検出された手に関するフィードバック

目標

  • 手を追跡するイベントをサブスクライブする。
  • カーソル フィードバックを使用して、手が追跡されていることをユーザーに示す。

Note

HoloLens 2 では、手が表示されるたびに (指差し時だけではなく)、手が検出されます。

Instructions

  • [階層] パネルで、[InputManager] オブジェクトを展開します。
  • [GesturesInput] オブジェクトを探して選択します。

InteractionInputSource.cs スクリプトでは、これらの手順が実行されます。

  1. InteractionSourceDetected および InteractionSourceLost イベントをサブスクライブします。
  2. HandDetected 状態を設定します。
  3. InteractionSourceDetected および InteractionSourceLost イベントからアンサブスクライブします。

次に、ユーザーの操作に応じてフィードバックが表示されるように、MR 入力 210 のカーソルをアップグレードします。

  1. [階層] パネルで、[Cursor] オブジェクトを選択して削除します。
  2. [プロジェクト] パネルで、CursorWithFeedback を検索し、[階層] パネルにドラッグします。
  3. [階層] パネルで [InputManager] をクリックし、[CursorWithFeedback] オブジェクトを [階層] から [InputManager] の [SimpleSinglePointerSelector][カーソル] フィールド ([インスペクター] の下部にある) にドラッグします。
  4. [階層][CursorWithFeedback] をクリックします。
  5. [インスペクター] パネルで、オブジェクト カーソル スクリプトの [カーソル状態データ] を展開します。

[カーソル状態データ] はこのように動作します。

  • [観察] 状態は、手が検出されず、ユーザーがただ見回していることを意味します。
  • [操作] 状態は、手またはコントローラーが検出されたことを意味します。
  • [ホバー] 状態は、ユーザーがホログラムを見ていることを意味します。

ビルドと配置

  • Unity で、[ファイル] > [ビルド設定] を使用してアプリケーションをリビルドします。
  • [App] フォルダーを開きます。
  • ModelExplorer Visual Studio ソリューションがまだ開いていない場合は開きます。
    • (セットアップ中にこのプロジェクトを Visual Studio で既にビルドおよび配置している場合は、VS のそのインスタンスを開き、プロンプトが表示されたら [すべて再読み込み] をクリックできます)。
  • Visual Studio で、[デバッグ] > [デバッグなしで開始] をクリックするか、Ctrl + F5 キーを押します。
  • アプリケーションが HoloLens に配置されたら、エアタップ ジェスチャを使用して、fitbox を閉じます。
  • 手の追跡を開始するには、手を視界内に移動し、人差し指を空に向けます。
  • 手を上下左右に動かします。
  • 手が検出され、その後視界から消えたとき、カーソルがどのように変化するか見続けます。
  • イマーシブ ヘッドセットを使用している場合は、コントローラーに接続して切断する必要があります。 接続されたコントローラーは常に "利用可能" になるため、イマーシブ デバイスでは、このフィードバックにはあまり注意を向けません。

第 2 章 - ナビゲーション

目標

  • ナビゲーション ジェスチャ イベントを使用して、宇宙飛行士を回転させる。

Instructions

アプリでナビゲーション ジェスチャを使用するために、GestureAction.cs を編集し、ナビゲーション ジェスチャが発生したときにオブジェクトを回転させるようにします。 さらに、カーソルにフィードバックを追加して、ナビゲーションが利用可能になったときに表示されるようにします。

  1. [階層] パネルで、[CursorWithFeedback] を展開します。
  2. Holograms フォルダーで、ScrollFeedback アセットを見つけます。
  3. ScrollFeedback プレハブを、[階層]CursorWithFeedback GameObject にドラッグ アンド ドロップします。
  4. [CursorWithFeedback] をクリックします。
  5. [インスペクター] パネルで、[コンポーネントの追加] ボタンをクリックします。
  6. メニューの検索ボックスに、「CursorFeedback」と入力します。 検索結果を選びます。
  7. [階層] から、[インスペクター][カーソル フィードバック] コンポーネントの Scroll Detected Game Object プロパティに、[ScrollFeedback] オブジェクトをドラッグ アンド ドロップします。
  8. [階層] パネルで、[AstroMan] オブジェクトを選択します。
  9. [インスペクター] パネルで、[コンポーネントの追加] ボタンをクリックします。
  10. メニューの検索ボックスに、「Gesture Action」と入力します。 検索結果を選びます。

次に、Visual Studio で GestureAction.cs を開きます。 コーディングの演習 2.c で、スクリプトを編集して次のことを行います。

  1. ナビゲーション ジェスチャが実行されるたびに、AstroMan オブジェクトを回転させます。
  2. rotationFactor を計算して、オブジェクトに適用される回転の数を制御します。
  3. ユーザーが手を左または右に動かしたときに y 軸を中心にオブジェクトを回転させます。

スクリプトでコーディングの演習 2.c を完了するか、コードを以下の完成したソリューションに置き換えます。

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

他のナビゲーション イベントには何らかの情報が既に入力されていることがわかります。 GameObject をツールキットの InputSystem のモーダル スタックにプッシュし、回転が始まったら、ユーザーが宇宙飛行士へのフォーカスを維持しなくて済むようにします。 それに応じて、ジェスチャが完了したら、スタックから GameObject を取り出します。

ビルドと配置

  1. Unity でアプリケーションをリビルドし、Visual Studio からビルドおよび配置して HoloLens で実行します。
  2. 宇宙飛行士を見つめると、カーソルの両側に矢印が表示されるはずです。 この新しいビジュアルは、宇宙飛行士を回転できることを示します。
  3. HoloLens で手の追跡が開始されるように、手を準備完了の位置に置きます (人差し指を空に向ける)。
  4. 宇宙飛行士を回転させるには、人差し指を下げてつまんだ状態にし、手を左または右に動かして NavigationX ジェスチャをトリガーします。

第 3 章 - ハンド ガイダンス

目標

  • ハンド ガイダンス スコアを使用して、手を追跡できなくなるタイミングを予測できるようにする。
  • カーソルにフィードバックを追加して、ユーザーの手がカメラの視野の端に近づいたときに表示されるようにする。

Instructions

  1. [階層] パネルで、CursorWithFeedback オブジェクトを選択します。
  2. [インスペクター] パネルで、[コンポーネントの追加] ボタンをクリックします。
  3. メニューの検索ボックスに、「Hand Guidance」と入力します。 検索結果を選びます。
  4. [プロジェクト] パネルの Holograms フォルダーで、HandGuidanceFeedback アセットを見つけます。
  5. [インスペクター] パネルで、Hand Guidance Indicator プロパティに HandGuidanceFeedback アセットをドラッグ アンド ドロップします。

ビルドと配置

  • Unity でアプリケーションをリビルドし、Visual Studio からビルドおよび配置して HoloLens でアプリを試します。
  • 手を視界内に移動し、人差し指を上げて追跡を開始します。
  • ナビゲーション ジェスチャ (人差し指と親指でつまむ) を使用して、宇宙飛行士の回転を開始します。
  • 手を上下左右に動かします。
  • 手がジェスチャ フレームの端に近づくと、カーソルの横に矢印が表示され、手を追跡できなくなることが警告されます。 矢印は、追跡不能にならないようにするために手を動かす方向を示します。

第 4 章 - 操作

目標

  • 操作イベントを使用して、手で宇宙飛行士を動かす。
  • カーソルにフィードバックを追加して、操作を使用できるタイミングをユーザーに知らせる。

Instructions

GestureManager.cs と AstronautManager.cs により、以下を行うことができます。

  1. 音声キーワード "宇宙飛行士を移動させる" を使用して操作ジェスチャを有効にする。"宇宙飛行士を回転させる" を使用してそれらを無効にする。
  2. 操作ジェスチャ レコグナイザーに応答するように切り替える。

それでは、始めましょう。

  1. [階層] パネルで、新しい空の GameObject を作成します。 これに "AstronautManager" という名前を付けます。
  2. [インスペクター] パネルで、[コンポーネントの追加] ボタンをクリックします。
  3. メニューの検索ボックスに、「Astronaut Manager」と入力します。 検索結果を選びます。
  4. [インスペクター] パネルで、[コンポーネントの追加] ボタンをクリックします。
  5. メニューの [検索] ボックスに、「音声入力ソース」と入力します。 検索結果を選びます。

ここで、宇宙飛行士の対話式操作の状態を制御するために必要な音声コマンドを追加します。

  1. [インスペクター][キーワード] セクションを展開します。
  2. 右側にある [+] をクリックして、新しいキーワードを追加します。
  3. 宇宙飛行士を移動させる」というキーワードを入力します。 必要に応じて、キーのショートカットを追加してかまいません。
  4. 右側にある [+] をクリックして、新しいキーワードを追加します。
  5. 宇宙飛行士を回転させる」というキーワードを入力します。 必要に応じて、キーのショートカットを追加してかまいません。
  6. 対応するハンドラー コードは、GestureAction.csISpeechHandler.OnSpeechKeywordRecognized ハンドラーにあります。

第 4 章の音声入力ソースを設定する方法

次に、カーソルに対して操作フィードバックを設定します。

  1. [プロジェクト] パネルの Holograms フォルダーで、PathingFeedback アセットを見つけます。
  2. PathingFeedback プレハブを、[階層]CursorWithFeedback オブジェクトにドラッグ アンド ドロップします。
  3. [階層] パネルで、[CursorWithFeedback] をクリックします。
  4. [階層] から、[インスペクター][カーソル フィードバック] コンポーネントの Pathing Detected Game Object プロパティに、PathingFeedback オブジェクトをドラッグ アンド ドロップします。

次に、以下を行えるようにするために、GestureAction.cs にコードを追加する必要があります。

  1. コードを IManipulationHandler.OnManipulationUpdated 関数に追加して、操作ジェスチャが検出されたときに宇宙飛行士が移動されるようにする。
  2. 移動ベクトルを計算して、手の位置に基づいて宇宙飛行士を移動させる場所を決定する。
  3. 宇宙飛行士を新しい位置に移動する。

GestureAction.cs のコーディング演習 4.a を完了するか、以下の完成したソリューションを使用します。

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
            transform.position = manipulationOriginalPosition + eventData.CumulativeDelta;
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

ビルドと配置

  • Unity でリビルドし、Visual Studio からアプリをビルドおよび配置して HoloLens でアプリを実行します。
  • HoloLens の前に手を移動し、人差し指を上げて追跡できるようにします。
  • カーソルを宇宙飛行士に合わせます。
  • 「宇宙飛行士を移動させる」と言って、操作ジェスチャで宇宙飛行士を移動させます。
  • プログラムが操作イベントに応答したことを示す 4 つの矢印がカーソルの周りに表示されます。
  • 人差し指を親指の方に下げて、それらの指でつまんだ状態にします。
  • 手を移動させると、宇宙飛行士も移動します (これが操作です)。
  • 人差し指を上げて、宇宙飛行士の操作を停止します。
  • 注: 手を移動させる前に「宇宙飛行士を移動させる」と言わないと、代わりにナビゲーション ジェスチャが使用されます。
  • 「宇宙飛行士を回転させる」と言って、回転可能な状態に戻します。

第 5 章 - モデルの展開

目標

  • ユーザーが操作できる複数のより小さなパーツに宇宙飛行士モデルを展開する。
  • ナビゲーションおよび操作ジェスチャを使用して、各パーツを個別に移動させる。

Instructions

このセクションでは、次のタスクを実行します。

  1. 新しいキーワード "モデルを展開する" を追加して、宇宙飛行士モデルを展開します。
  2. 新しいキーワード "モデルをリセットする" を追加して、モデルを元の形に戻します。

これを行うには、前の章の音声入力ソースにさらに 2 つのキーワードを追加します。 認識イベントを処理する別の方法も示します。

  1. [インスペクター]AstronautManager で [戻る] をクリックし、[インスペクター][キーワード] セクションを展開します。
  2. 右側にある [+] をクリックして、新しいキーワードを追加します。
  3. モデルを展開する」というキーワードを入力します。 必要に応じて、キーのショートカットを追加してかまいません。
  4. 右側にある [+] をクリックして、新しいキーワードを追加します。
  5. モデルをリセットする」というキーワードを入力します。 必要に応じて、キーのショートカットを追加してかまいません。
  6. [インスペクター] パネルで、[コンポーネントの追加] ボタンをクリックします。
  7. メニューの [検索] ボックスに、「音声入力ハンドラー」と入力します。 検索結果を選びます。
  8. フォーカスしている GameObject に関係なく、これらのコマンドを機能させる必要があるため、[グローバル リスナーです] をオンにします。
  9. [+] ボタンをクリックし、[キーワード] ドロップダウンから [モデルを展開する] を選択します。
  10. [応答] の下にある [+] をクリックし、[階層] から [None (Object)] (なし (オブジェクト)) フィールドに AstronautManager をドラッグします。
  11. 次に、[No Function] (関数なし) ドロップダウンをクリックし、[AstronautManager][ExpandModelCommand] の順に選択します。
  12. 音声入力ハンドラーの [+] ボタンをクリックし、[キーワード] ドロップダウンから [モデルをリセットする] を選択します。
  13. [応答] の下にある [+] をクリックし、[階層] から [None (Object)] (なし (オブジェクト)) フィールドに AstronautManager をドラッグします。
  14. 次に、[No Function] (関数なし) ドロップダウンをクリックし、[AstronautManager][ResetModelCommand] の順に選択します。

第 5 章の音声入力ソースとハンドラーを設定する方法

ビルドと配置

  • 試してみる アプリをビルドして HoloLens に配置します。
  • モデルを展開する」と言って、展開された宇宙飛行士モデルを確認します。
  • [ナビゲーション] を使用して、宇宙飛行士の服の個々のパーツを回転させます。
  • 宇宙飛行士を移動させる」と言ってから、操作を使用して宇宙飛行士の服の個々のパーツを移動させます。
  • 宇宙飛行士を回転させる」と言って、各パーツをもう一度回転させます。
  • モデルをリセットする」と言って、宇宙飛行士を元の形に戻します。

終了

おめでとうございます。 これで、MR 入力 211: ジェスチャは完了です。

  • 手の追跡、ナビゲーション、操作イベントを検出して応答する方法について学習しました。
  • ナビゲーションと操作ジェスチャの違いについて理解しました。
  • 手が検出されたとき、手が視界から消えそうなとき、オブジェクトで異なる対話式操作が使用できるようになったときに、カーソルを変更して視覚的フィードバックを提供する方法について学習しました (ナビゲーションと操作)。