注意

Mixed Reality Academy チュートリアルでは、HoloLens として設計された (第 1 世代) と混在の現実イマーシブ ヘッドセットに注意してください。The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. そのため、これらのデバイス向けの開発にガイダンスがまだ必要な開発者のための場所でこれらのチュートリアルのままにすることが重要と思われます。As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. これらのチュートリアルは いない 最新のツールセットや相互作用が使用されている HoloLens 2 で更新されます。These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. サポートされているデバイスで作業を続行するが保持されます。They will be maintained to continue working on the supported devices. 一連の新しい HoloLens 2 を開発する方法を示すチュートリアルは、今後投稿があります。There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. この通知が投稿されるときにこれらのチュートリアルへのリンクが更新されます。This notice will be updated with a link to those tutorials when they are posted.

MR 入力 211:ジェスチャMR Input 211: Gesture

ジェスチャをアクションにユーザーの意図を変換します。Gestures turn user intention into action. ジェスチャでは、ユーザーはホログラムと対話できます。With gestures, users can interact with holograms. このコースでユーザーの手を追跡、ユーザーの入力に応答する方法について説明し、ユーザーに与えるフィードバック ベースの一方で状態と位置。In this course, we'll learn how to track the user's hands, respond to user input, and give feedback to the user based on hand state and location.

MR 基本 101、単純なエア タップ ジェスチャを使用して、ホログラムと対話します。In MR Basics 101, we used a simple air-tap gesture to interact with our holograms. ここで、エア タップのジェスチャだけにとどまらないし、新しい概念を検証します。、Now, we'll move beyond the air-tap gesture and explore new concepts to:

  • ユーザーの手が追跡されていることを検出し、ユーザーにフィードバックを提供します。Detect when the user's hand is being tracked and provide feedback to the user.
  • ホログラムを回転するのにには、ナビゲーションのジェスチャを使用します。Use a navigation gesture to rotate our holograms.
  • ユーザーの手がビューの外に出るときに、フィードバックを提供します。Provide feedback when the user's hand is about to go out of view.
  • 操作イベントを使用して、自分の手でホログラムを移動します。Use manipulation events to allow users to move holograms with their hands.

このコースで Unity プロジェクトを再度モデル エクスプ ローラーに組み込まれていますMR 入力 210します。In this course, we'll revisit the Unity project Model Explorer, which we built in MR Input 210. 「宇宙飛行士友人は、これら新しいジェスチャ概念のところ役立ちますに戻っています。Our astronaut friend is back to assist us in our exploration of these new gesture concepts.

重要

以前のバージョンの Unity と Mixed Reality Toolkit を使用して、以下の各章に埋め込まれたビデオが記録されています。The videos embedded in each of the chapters below were recorded using an older version of Unity and the Mixed Reality Toolkit. 詳細な手順については、正確かつ最新ですが、スクリプトとは、無効な対応するビデオの中でビジュアルを表示があります。While the step-by-step instructions are accurate and current, you may see scripts and visuals in the corresponding videos that are out-of-date. ビデオでは、後生のために含まれる保持され、概念説明のため、引き続き適用されます。The videos remain included for posterity and because the concepts covered still apply.

デバイスのサポートDevice support

コースCourse HoloLensHoloLens イマーシブ ヘッドセットImmersive headsets
MR 入力 211:ジェスチャMR Input 211: Gesture ✔️✔️ ✔️✔️

開始前の作業Before you start

前提条件Prerequisites

プロジェクト ファイルProject files

  • ダウンロード、ファイルプロジェクトに必要です。Download the files required by the project. Unity 2017.2 またはそれ以降が必要です。 Requires Unity 2017.2 or later.
  • 解除アーカイブをデスクトップまたは場所に到達する簡単なその他のファイル。Un-archive the files to your desktop or other easy to reach location.

注意

をダウンロードする前に、ソース コードを検索する場合があるGitHub で入手できますします。If you want to look through the source code before downloading, it's available on GitHub.

正誤表と注意事項Errata and Notes

  • 「マイ コードのみを有効にする」無効にする必要があります (unchecked) -> ツールの Visual Studio でのオプションには、デバッグ、コードにブレークポイントをヒットするには-> です。"Enable Just My Code" needs to be disabled (unchecked) in Visual Studio under Tools->Options->Debugging in order to hit breakpoints in your code.

0 - Unity のセットアップ」の章Chapter 0 - Unity Setup

手順Instructions

  1. Unity を起動します。Start Unity.
  2. [開く] を選択します。Select Open.
  3. 移動し、ジェスチャフォルダー以前されていないアーカイブします。Navigate to the Gesture folder you previously un-archived.
  4. 検索し、選択、開始/モデル エクスプ ローラーフォルダー。Find and select the Starting/Model Explorer folder.
  5. をクリックして、フォルダーの選択ボタンをクリックします。Click the Select Folder button.
  6. プロジェクトパネルで、展開、シーンフォルダー。In the Project panel, expand the Scenes folder.
  7. ダブルクリックModelExplorerシーン Unity で読み込めません。Double-click ModelExplorer scene to load it in Unity.

ビルドBuilding

  1. Unity では、次のように選択します。ファイル > Build Settingsします。In Unity, select File > Build Settings.
  2. 場合シーン/ModelExplorerに記載されていないScenes In Build、 をクリックして開くシーンを追加シーンを追加します。If Scenes/ModelExplorer is not listed in Scenes In Build, click Add Open Scenes to add the scene.
  3. 具体的には、HoloLens の開発中、設定ターゲット デバイスHoloLensします。If you're specifically developing for HoloLens, set Target device to HoloLens. それ以外の場合、残して任意のデバイスします。Otherwise, leave it on Any device.
  4. 確認ビルド タイプに設定されているD3DSDKに設定されているインストールされている最新(16299 またはそれ以降の SDK がある必要があります)。Ensure Build Type is set to D3D and SDK is set to Latest installed (which should be SDK 16299 or newer).
  5. [Build] をクリックします。Click Build.
  6. 作成、新しいフォルダー "App"という名前です。Create a New Folder named "App".
  7. 1 回のクリック、アプリフォルダー。Single click the App folder.
  8. キーを押してフォルダーの選択Unity は Visual Studio のプロジェクトのビルドを開始します。Press Select Folder and Unity will start building the project for Visual Studio.

Unity を完了すると、ファイル エクスプ ローラー ウィンドウが表示されます。When Unity is done, a File Explorer window will appear.

  1. 開く、アプリフォルダー。Open the App folder.
  2. 開く、 ModelExplorer Visual Studio ソリューションします。Open the ModelExplorer Visual Studio Solution.

HoloLens へのデプロイ: 場合If deploying to HoloLens:

  1. デバッグからターゲットを変更する Visual Studio で、上部のツールバーを使用してリリースを ARM からx86します。Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to x86.
  2. ローカル コンピューター] ボタンの横の矢印のドロップダウンをクリックし、[リモート マシンします。Click on the drop down arrow next to the Local Machine button, and select Remote Machine.
  3. 入力HoloLens デバイスの IP アドレス認証モードを設定およびユニバーサル (暗号化されていないプロトコル) します。Enter your HoloLens device IP address and set Authentication Mode to Universal (Unencrypted Protocol). クリックして選択します。Click Select. デバイスの IP アドレスがわからない場合に参照設定 > ネットワークとインターネット > 詳細オプションします。If you do not know your device IP address, look in Settings > Network & Internet > Advanced Options.
  4. 上部のメニュー バーで、クリックしてデバッグ]、[デバッグなしで開始またはキーを押しますctrl キーを押しながら f5 キーを押してします。In the top menu bar, click Debug -> Start Without debugging or press Ctrl + F5. 最初に、デバイスに展開するには、する必要がありますVisual Studio をペアリングします。If this is the first time deploying to your device, you will need to pair it with Visual Studio.
  5. アプリが展開されると、消去、 Fitboxで、ジェスチャ を選択します。When the app has deployed, dismiss the Fitbox with a select gesture.

場合は、イマーシブ ヘッドセットへのデプロイ。If deploying to an immersive headset:

  1. デバッグからターゲットを変更する Visual Studio で、上部のツールバーを使用してリリースを ARM からx64します。Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to x64.
  2. 必ず、配置ターゲットに設定されてローカル マシンします。Make sure the deployment target is set to Local Machine.
  3. 上部のメニュー バーで、クリックしてデバッグ]、[デバッグなしで開始またはキーを押しますctrl キーを押しながら f5 キーを押してします。In the top menu bar, click Debug -> Start Without debugging or press Ctrl + F5.
  4. アプリが展開されると、消去、 Fitboxアニメーション コント ローラーで、トリガーを取得することによって。When the app has deployed, dismiss the Fitbox by pulling the trigger on a motion controller.

注意

Visual Studio でエラー パネルの赤いエラーの一部が分かります。You might notice some red errors in the Visual Studio Errors panel. それらを無視しても安全になります。It is safe to ignore them. ビルドの進行状況を実際に表示する出力パネルへの切り替え。Switch to the Output panel to view actual build progress. エラー出力 パネルにでは修正プログラム (ほとんどの多くの場合、スクリプトで間違いに起因) を作成することが必要です。Errors in the Output panel will require you to make a fix (most often they are caused by a mistake in a script).

第 1 章 - 手の形にフィードバックが検出されましたChapter 1 - Hand detected feedback

目標Objectives

  • 追跡イベントを渡すためにサブスクライブします。Subscribe to hand tracking events.
  • 手の形が追跡されているときにユーザーを表示するのにには、カーソルのフィードバックを使用します。Use cursor feedback to show users when a hand is being tracked.

手順Instructions

  • 階層パネルで、展開、 InputManagerオブジェクト。In the Hierarchy panel, expand the InputManager object.
  • 探し、選択、 GesturesInputオブジェクト。Look for and select the GesturesInput object.

InteractionInputSource.csスクリプトは、次の手順を実行します。The InteractionInputSource.cs script performs these steps:

  1. InteractionSourceDetected と InteractionSourceLost イベントをサブスクライブします。Subscribes to the InteractionSourceDetected and InteractionSourceLost events.
  2. HandDetected 状態を設定します。Sets the HandDetected state.
  3. InteractionSourceDetected と InteractionSourceLost イベントからアンサブスク ライブします。Unsubscribes from the InteractionSourceDetected and InteractionSourceLost events.

次に、アップグレード、カーソルからMR 入力 210フィードバックによって、ユーザーのアクションを示す 1 つにします。Next, we'll upgrade our cursor from MR Input 210 into one that shows feedback depending on the user's actions.

  1. 階層パネルで、カーソルオブジェクトし、それを削除します。In the Hierarchy panel, select the Cursor object and delete it.
  2. プロジェクトパネルで、検索CursorWithFeedbackまでドラッグし、階層パネル。In the Project panel, search for CursorWithFeedback and drag it into the Hierarchy panel.
  3. をクリックしてInputManagerで、階層をドラッグして、パネル、 CursorWithFeedbackオブジェクトから、階層に、InputManager のSimpleSinglePointerSelectorカーソルフィールドでは、下部にある、インスペクターします。Click on InputManager in the Hierarchy panel, then drag the CursorWithFeedback object from the Hierarchy into the InputManager's SimpleSinglePointerSelector's Cursor field, at the bottom of the Inspector.
  4. をクリックして、 CursorWithFeedbackで、階層します。Click on the CursorWithFeedback in the Hierarchy.
  5. インスペクターパネルで、展開カーソル状態データ上、オブジェクト カーソルスクリプト。In the Inspector panel, expand Cursor State Data on the Object Cursor script.

カーソル状態データこれと同様に動作します。The Cursor State Data works like this:

  • すべて監視状態の意味は手が検出されなかった場合、ユーザーを探し、単にします。Any Observe state means that no hand is detected and the user is simply looking around.
  • すべてInteract状態では、手動またはコント ローラーが検出されたことを意味します。Any Interact state means that a hand or controller is detected.
  • すべてホバー状態の意味は、ユーザーはホログラム見る。Any Hover state means the user is looking at a hologram.

構築し、デプロイBuild and Deploy

  • Unity では、次のように使用します。ファイル > Build Settings 、アプリケーションをリビルドします。In Unity, use File > Build Settings to rebuild the application.
  • 開く、アプリフォルダー。Open the App folder.
  • 開くことがまだ開いていない場合、 ModelExplorer Visual Studio ソリューションします。If it's not already open, open the ModelExplorer Visual Studio Solution.
    • (既にビルド/展開して Visual Studio では、このプロジェクトのセットアップ中に場合、し、VS のインスタンスを開いて 'すべて再読み込み' が表示されたらクリックします)。(If you already built/deployed this project in Visual Studio during set-up, then you can open that instance of VS and click 'Reload All' when prompted).
  • Visual Studio で、次のようにクリックします。デバッグ]、[デバッグなしで開始またはキーを押しますctrl キーを押しながら f5 キーを押してします。In Visual Studio, click Debug -> Start Without debugging or press Ctrl + F5.
  • アプリケーションのデプロイは、HoloLens 後、は、エア タップ ジェスチャを使用して fitbox を無視します。After the application deploys to the HoloLens, dismiss the fitbox using the air-tap gesture.
  • ビューに手を移動し、人差し指をハンドの追跡を開始する、空にします。Move your hand into view and point your index finger to the sky to start hand tracking.
  • 自分の手を左に移動、右、上下します。Move your hand left, right, up and down.
  • 手が検出され、ビューから失われたときに、カーソルがどのように変化するかをご覧ください。Watch how the cursor changes when your hand is detected and then lost from view.
  • 場合は、イマーシブ ヘッドセットの場合は、接続し、コント ローラーを切断する必要があります。If you're on an immersive headset, you'll have to connect and disconnect your controller. このフィードバックは、接続されているコント ローラーは常に使用できる""、没入型のデバイスでは、重要なになります。This feedback becomes less interesting on an immersive device, as a connected controller will always be "available".

第 2 章 - ナビゲーションChapter 2 - Navigation

目標Objectives

  • 「宇宙飛行士を回転するには、ナビゲーション ジェスチャ イベントをを使用します。Use Navigation gesture events to rotate the astronaut.

手順Instructions

アプリケーションのナビゲーションのジェスチャを使用する編集するつもりはGestureAction.csナビゲーション ジェスチャが発生したときに、オブジェクトを回転します。To use Navigation gestures in our app, we are going to edit GestureAction.cs to rotate objects when the Navigation gesture occurs. さらに、ナビゲーションが使用可能なときに表示されるカーソルにフィードバックを追加します。Additionally, we'll add feedback to the cursor to display when Navigation is available.

  1. 階層パネルで、展開CursorWithFeedbackします。In the Hierarchy panel, expand CursorWithFeedback.
  2. ホログラムフォルダー、検索、 ScrollFeedback資産。In the Holograms folder, find the ScrollFeedback asset.
  3. ドラッグ アンド ドロップ、 ScrollFeedbackにプレハブ、 CursorWithFeedbackの GameObject、階層します。Drag and drop the ScrollFeedback prefab onto the CursorWithFeedback GameObject in the Hierarchy.
  4. をクリックしてCursorWithFeedbackします。Click on CursorWithFeedback.
  5. インスペクターパネルで、をクリックして、コンポーネントの追加ボタンをクリックします。In the Inspector panel, click the Add Component button.
  6. メニューで、検索ボックスに入力CursorFeedbackします。In the menu, type in the search box CursorFeedback. 検索結果を選択します。Select the search result.
  7. ドラッグ アンド ドロップ、 ScrollFeedbackオブジェクトから、階層上に、スクロール ゲーム オブジェクトの検出プロパティ、カーソル フィードバックコンポーネント、インスペクターします。Drag and drop the ScrollFeedback object from the Hierarchy onto the Scroll Detected Game Object property in the Cursor Feedback component in the Inspector.
  8. 階層パネルで、 AstroManオブジェクト。In the Hierarchy panel, select the AstroMan object.
  9. インスペクターパネルで、をクリックして、コンポーネントの追加ボタンをクリックします。In the Inspector panel, click the Add Component button.
  10. メニューで、検索ボックスに入力ジェスチャによる操作します。In the menu, type in the search box Gesture Action. 検索結果を選択します。Select the search result.

次に、 GestureAction.cs Visual Studio でします。Next, open GestureAction.cs in Visual Studio. コーディングの練習 2. c には、次のスクリプトを編集します。In coding exercise 2.c, edit the script to do the following:

  1. 回転、AstroManオブジェクトのナビゲーションのジェスチャを実行するたびにします。Rotate the AstroMan object whenever a Navigation gesture is performed.
  2. 計算、 rotationFactorオブジェクトに適用する回転の量を制御します。Calculate the rotationFactor to control the amount of rotation applied to the object.
  3. オブジェクトを回転させる左または右に、ユーザーが、手の形を移動したときに、y 軸を中心。Rotate the object around the y-axis when the user moves their hand left or right.

2. c では、スクリプト、または置換下の完成したソリューションを使用してコードを実行する完全なコーディングします。Complete coding exercises 2.c in the script, or replace the code with the completed solution below:

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();
    }
}

いくつかの情報を使用して、その他のナビゲーション イベントが既に入力されて表示されます。You'll notice that the other navigation events are already filled in with some info. ツールキットの上に GameObject プッシュ InputSystem のモーダル スタック、回転が始まった後に、「宇宙飛行士フォーカスを維持するために、ユーザーがないようにします。We push the GameObject onto the Toolkit's InputSystem's modal stack, so the user doesn't have to maintain focus on the Astronaut once rotation has begun. 同様に、ジェスチャが完了すると、スタックからポップ GameObject ポップします。Correspondingly, we pop the GameObject off the stack once the gesture is completed.

構築し、デプロイBuild and Deploy

  1. Unity でアプリケーションをリビルドし、ビルドして、HoloLens で実行する Visual Studio からデプロイします。Rebuild the application in Unity and then build and deploy from Visual Studio to run it in the HoloLens.
  2. 見つめます、飛行士カーソルの両側に 2 つの矢印が表示されます。Gaze at the astronaut, two arrows should appear on either side of the cursor. この新しいビジュアルは、「宇宙飛行士を回転できることを示します。This new visual indicates that the astronaut can be rotated.
  3. 準備ができて位置 (インデックスの指が空を指して) に手を設定するため、HoloLens は手の追跡を開始します。Place your hand in the ready position (index finger pointed towards the sky) so the HoloLens will start tracking your hand.
  4. 回転するには、「宇宙飛行士をピンチ位置、人差し指を削減し、左または右 NavigationX ジェスチャをトリガーする、手の形を移動します。To rotate the astronaut, lower your index finger to a pinch position, and then move your hand left or right to trigger the NavigationX gesture.

第 3 章 - 手の形のガイダンスChapter 3 - Hand Guidance

目標Objectives

  • 使用ガイダンスのスコアを渡す追跡手が失われる場合の予測をサポートします。Use hand guidance score to help predict when hand tracking will be lost.
  • 提供カーソル上でフィードバックときに、ユーザーの手の形に近いビューのカメラのエッジを表示します。Provide feedback on the cursor to show when the user's hand nears the camera's edge of view.

手順Instructions

  1. 階層パネルで、 CursorWithFeedbackオブジェクト。In the Hierarchy panel, select the CursorWithFeedback object.
  2. インスペクターパネルで、をクリックして、コンポーネントの追加ボタンをクリックします。In the Inspector panel, click the Add Component button.
  3. メニューで、検索ボックスに入力手ガイダンスします。In the menu, type in the search box Hand Guidance. 検索結果を選択します。Select the search result.
  4. プロジェクトパネルホログラムフォルダー、検索、 HandGuidanceFeedback資産。In the Project panel Holograms folder, find the HandGuidanceFeedback asset.
  5. ドラッグ アンド ドロップ、 HandGuidanceFeedback上に資産、手ガイダンス インジケータープロパティ、インスペクターパネル。Drag and drop the HandGuidanceFeedback asset onto the Hand Guidance Indicator property in the Inspector panel.

構築し、デプロイBuild and Deploy

  • Unity でアプリケーションをリビルドし構築、HoloLens でアプリを体験する Visual Studio からデプロイします。Rebuild the application in Unity and then build and deploy from Visual Studio to experience the app on HoloLens.
  • 手を表示し、追跡する際、人差し指を発生させます。Bring your hand into view and raise your index finger to get tracked.
  • ナビゲーションのジェスチャに「宇宙飛行士回転を開始 (インデックス指によるピンチ ジェスチャと一緒に thumb)。Start rotating the astronaut with the Navigation gesture (pinch your index finger and thumb together).
  • 実際には、左端、右端、上下に移動します。Move your hand far left, right, up, and down.
  • 矢印が横に表示する必要がありますを手がジェスチャのフレームの端に近づくと、追跡手札を警告する、カーソルが失われます。As your hand nears the edge of the gesture frame, an arrow should appear next to the cursor to warn you that hand tracking will be lost. 矢印は、損失を防止の追跡を防ぐために手を移動する方向を示します。The arrow indicates which direction to move your hand in order to prevent tracking from being lost.

第 4 章 - 操作Chapter 4 - Manipulation

目標Objectives

  • 操作イベントを使用すると、自分の手で「宇宙飛行士を移動できます。Use Manipulation events to move the astronaut with your hands.
  • ユーザーが操作を使用するタイミングを把握できるカーソル上でフィードバックを提供します。Provide feedback on the cursor to let the user know when Manipulation can be used.

手順Instructions

GestureManager.cs と AstronautManager.cs により、次の操作。GestureManager.cs and AstronautManager.cs will allow us to do the following:

  1. 音声キーワードを使用して"移動「宇宙飛行士"有効にする操作ジェスチャと"回転飛行士"を無効にします。Use the speech keyword "Move Astronaut" to enable Manipulation gestures and "Rotate Astronaut" to disable them.
  2. 応答に切り替えて、操作のジェスチャ レコグナイザーします。Switch to responding to the Manipulation Gesture Recognizer.

それでは始めましょう。Let's get started.

  1. 階層パネルで、新しい空の GameObject を作成します。In the Hierarchy panel, create a new empty GameObject. 名前を付けます"AstronautManager"。Name it "AstronautManager".
  2. インスペクターパネルで、をクリックして、コンポーネントの追加ボタンをクリックします。In the Inspector panel, click the Add Component button.
  3. メニューで、検索ボックスに入力飛行士 Managerします。In the menu, type in the search box Astronaut Manager. 検索結果を選択します。Select the search result.
  4. インスペクターパネルで、をクリックして、コンポーネントの追加ボタンをクリックします。In the Inspector panel, click the Add Component button.
  5. メニューで、検索ボックスに入力音声入力ソースします。In the menu, type in the search box Speech Input Source. 検索結果を選択します。Select the search result.

これで、「宇宙飛行士の相互作用の状態を制御するために必要な音声コマンドを追加します。We'll now add the speech commands required to control the interaction state of the astronaut.

  1. 展開、キーワードセクション、インスペクターします。Expand the Keywords section in the Inspector.
  2. をクリックして、 + 右側に新しいキーワードを追加します。Click the + on the right hand side to add a new keyword.
  3. As キーワードを入力 「宇宙飛行士を移動します。Type the Keyword as Move Astronaut. 自由に必要な場合は、キーのショートカットを追加します。Feel free to add a Key Shortcut if desired.
  4. をクリックして、 + 右側に新しいキーワードを追加します。Click the + on the right hand side to add a new keyword.
  5. As キーワードを入力 「宇宙飛行士を回転します。Type the Keyword as Rotate Astronaut. 自由に必要な場合は、キーのショートカットを追加します。Feel free to add a Key Shortcut if desired.
  6. 対応するハンドラーのコードが見つかりますGestureAction.csISpeechHandler.OnSpeechKeywordRecognizedハンドラー。The corresponding handler code can be found in GestureAction.cs, in the ISpeechHandler.OnSpeechKeywordRecognized handler.

第 4 章の音声入力ソースをセットアップする方法

次に、カーソル上で操作のフィードバックを設定します。Next, we'll setup the manipulation feedback on the cursor.

  1. プロジェクトパネルホログラムフォルダー、検索、 PathingFeedback資産。In the Project panel Holograms folder, find the PathingFeedback asset.
  2. ドラッグ アンド ドロップ、 PathingFeedbackにプレハブ、 CursorWithFeedbackオブジェクト、階層します。Drag and drop the PathingFeedback prefab onto the CursorWithFeedback object in the Hierarchy.
  3. 階層パネルで、をクリックしてCursorWithFeedbackします。In the Hierarchy panel, click on CursorWithFeedback.
  4. ドラッグ アンド ドロップ、 PathingFeedbackオブジェクトから、階層上に、のゲーム オブジェクトの検出パスプロパティ、カーソル フィードバックコンポーネント、インスペクターします。Drag and drop the PathingFeedback object from the Hierarchy onto the Pathing Detected Game Object property in the Cursor Feedback component in the Inspector.

コードを追加する必要がありますGestureAction.cs以下を有効にします。Now we need to add code to GestureAction.cs to enable the following:

  1. コードを追加、 IManipulationHandler.OnManipulationUpdated 、関数は、「宇宙飛行士を移動するときに、操作ジェスチャが検出されました。Add code to the IManipulationHandler.OnManipulationUpdated function, which will move the astronaut when a Manipulation gesture is detected.
  2. 計算、動きベクトル飛行士の移動先を決定するベースの手元に位置します。Calculate the movement vector to determine where the astronaut should be moved to based on hand position.
  3. 移動を新しい位置に「宇宙飛行士します。Move the astronaut to the new position.

4.a を練習する完全なコーディングGestureAction.cs、または完成したソリューションは、以下を使用します。Complete coding exercise 4.a in GestureAction.cs, or use our completed solution below:

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();
    }
}

構築し、デプロイBuild and Deploy

  • Unity で再構築し、ビルドして、HoloLens でアプリを実行する Visual Studio からデプロイします。Rebuild in Unity and then build and deploy from Visual Studio to run the app in HoloLens.
  • HoloLens の前に手を移動し、追跡できるように、人差し指を発生させます。Move your hand in front of the HoloLens and raise your index finger so that it can be tracked.
  • 「宇宙飛行士経由でカーソルをを注目します。Focus the cursor over the astronaut.
  • 操作のジェスチャに「宇宙飛行士を移動する ' 飛行士の移動 と答えてください。Say 'Move Astronaut' to move the astronaut with a Manipulation gesture.
  • 4 つの矢印は、プログラムが操作イベントに応答するようになりましたことを示すカーソルの周囲に表示されます。Four arrows should appear around the cursor to indicate that the program will now respond to Manipulation events.
  • 親指まで、人差し指を削減し、一緒に挟まれてしておきます。Lower your index finger down to your thumb, and keep them pinched together.
  • 「宇宙飛行士はも移動手周囲を移動すると、(これは操作です)。As you move your hand around, the astronaut will move too (this is Manipulation).
  • 「宇宙飛行士操作を停止する際人差し指を発生させます。Raise your index finger to stop manipulating the astronaut.
  • 注:手を移動する前に、' 飛行士移動 ' はいないと答えるとは、ナビゲーションのジェスチャを代わりに使用されます。Note: If you do not say 'Move Astronaut' before moving your hand, then the Navigation gesture will be used instead.
  • '回転「宇宙飛行士' 回転可能な状態に戻すことあるとします。Say 'Rotate Astronaut' to return to the rotatable state.

第 5 章「モデルの拡張Chapter 5 - Model expansion

目標Objectives

  • 複数「宇宙飛行士モデルを展開しユーザーが対話できることをより小さな部分。Expand the Astronaut model into multiple, smaller pieces that the user can interact with.
  • 移動および操作のジェスチャを使用して個別に各部分に移動します。Move each piece individually using Navigation and Manipulation gestures.

手順Instructions

このセクションでは、次のタスクを行いましています。In this section, we will accomplish the following tasks:

  1. New キーワードを追加"展開モデル"を「宇宙飛行士モデルを展開します。Add a new keyword "Expand Model" to expand the astronaut model.
  2. New キーワードを追加"リセット モデル"に、モデルを元のフォームに戻ります。Add a new Keyword "Reset Model" to return the model to its original form.

前の章から音声入力ソースに 2 つ以上のキーワードを追加することでこれを実行します。We'll do this by adding two more keywords to the Speech Input Source from the previous chapter. 認識のイベントを処理する別の方法も示します。We'll also demonstrate another way to handle recognition events.

  1. [戻る] をクリックしてAstronautManagerで、インスペクターを展開し、キーワードセクション、インスペクターします。Click back on AstronautManager in the Inspector and expand the Keywords section in the Inspector.
  2. をクリックして、 + 右側に新しいキーワードを追加します。Click the + on the right hand side to add a new keyword.
  3. As キーワードを入力展開モデルします。Type the Keyword as Expand Model. 自由に必要な場合は、キーのショートカットを追加します。Feel free to add a Key Shortcut if desired.
  4. をクリックして、 + 右側に新しいキーワードを追加します。Click the + on the right hand side to add a new keyword.
  5. As キーワードを入力モデルをリセットします。Type the Keyword as Reset Model. 自由に必要な場合は、キーのショートカットを追加します。Feel free to add a Key Shortcut if desired.
  6. インスペクターパネルで、をクリックして、コンポーネントの追加ボタンをクリックします。In the Inspector panel, click the Add Component button.
  7. メニューで、検索ボックスに入力音声入力ハンドラーします。In the menu, type in the search box Speech Input Handler. 検索結果を選択します。Select the search result.
  8. 確認はグローバル リスナーを絞っているこれらのコマンドを GameObject に関係なく機能するため、します。Check Is Global Listener, since we want these commands to work regardless of the GameObject we're focusing.
  9. をクリックして、 + ボタンをクリックし、選択展開モデルキーワードのドロップダウン リストから。Click the + button and select Expand Model from the Keyword dropdown.
  10. をクリックして、 + 応答、およびドラッグ下、 AstronautManagerから、階層に、 None (オブジェクト) フィールド。Click the + under Response, and drag the AstronautManager from the Hierarchy into the None (Object) field.
  11. をクリックして、いいえ関数] ドロップダウンで、[ AstronautManager、しExpandModelCommandします。Now, click the No Function dropdown, select AstronautManager, then ExpandModelCommand.
  12. 音声入力ハンドラーをクリックします。 + ボタンをクリックし、選択リセット モデルキーワードのドロップダウン リストから。Click the Speech Input Handler's + button and select Reset Model from the Keyword dropdown.
  13. をクリックして、 + 応答、およびドラッグ下、 AstronautManagerから、階層に、 None (オブジェクト) フィールド。Click the + under Response, and drag the AstronautManager from the Hierarchy into the None (Object) field.
  14. をクリックして、いいえ関数] ドロップダウンで、[ AstronautManager、しResetModelCommandします。Now, click the No Function dropdown, select AstronautManager, then ResetModelCommand.

第 5 章のセットアップ、音声入力ソースとハンドラーする方法

構築し、デプロイBuild and Deploy

  • お試しください。Try it! ビルドして、アプリ、HoloLens をデプロイします。Build and deploy the app to the HoloLens.
  • たとえば展開モデルに展開されている「宇宙飛行士モデルを参照してください。Say Expand Model to see the expanded astronaut model.
  • 使用ナビゲーション飛行士スーツの各部分を回転させる。Use Navigation to rotate individual pieces of the astronaut suit.
  • たとえば移動「宇宙飛行士しを使用して操作飛行士スーツの各部分を移動しますします。Say Move Astronaut and then use Manipulation to move individual pieces of the astronaut suit.
  • たとえば回転飛行士部分を再度回転。Say Rotate Astronaut to rotate the pieces again.
  • たとえばリセット モデルに、「宇宙飛行士元フォームに戻ります。Say Reset Model to return the astronaut to its original form.

最後ですThe End

これで終了です。Congratulations! 完了したのでMR 入力 211。ジェスチャします。You have now completed MR Input 211: Gesture.

  • 検出し、追跡、ナビゲーション、および操作イベントを渡すために応答する方法を理解します。You know how to detect and respond to hand tracking, navigation and manipulation events.
  • 移動および操作のジェスチャの違いを理解します。You understand the difference between Navigation and Manipulation gestures.
  • 手の形が検出されると、手が失われると、オブジェクトが別の相互作用 (ナビゲーション vs 操作) をサポートする場合は、視覚的なフィードバックを提供する、カーソルを変更する方法を理解します。You know how to change the cursor to provide visual feedback for when a hand is detected, when a hand is about to be lost, and for when an object supports different interactions (Navigation vs Manipulation).