HoloLens (第 1 代) Input 210: Gaze

重要

Mixed Reality Academy 教學課程是使用 HoloLens (第 1 代) 、Unity 2017 和 Mixed Reality 沈浸式頭戴式裝置所設計。 因此,對於仍在尋找這些裝置開發指引的開發人員而言,我們覺得這些教學課程很重要。 這些教學課程將不會更新為用於 HoloLens 2 的最新工具組或互動,而且可能與較新版本的 Unity 不相容。 系統會保留這些資訊,以繼續在支援的裝置上運作。 已針對 HoloLens 2 公佈一系列新的教學課程。

注視 是輸入的第一種形式,並顯示使用者的意圖和認知。 MR Input 210 (也稱為專案總管) 深入探討 Windows Mixed Reality 的注視相關概念。 我們將將內容感知新增至游標和全像投影,充分利用您的應用程式知道使用者的注視。

我們在這裡有一個易記的太空人,可協助您了解注視概念。 在 MR Basics 101 中,我們有一個簡單的游標,只是遵循您的注視。 今天,我們要將一個步驟移至簡單的數據指標之外:

  • 我們要讓游標和全像投影注視感知:這兩者都會根據使用者正在查看的位置而變更, 或使用者 未 查看的位置。 這可讓它們感知內容。
  • 我們會將意見反應新增至游標和全像投影,以為使用者提供更多目標內容。 此意見反應可以是音訊和視覺效果。
  • 我們將示範目標技術,以協助用戶達到較小的目標。
  • 我們將示範如何使用方向指示器來吸引使用者對全像投影的注意力。
  • 我們將教導您技術,讓全像投影與使用者一起在全球各地移動。

重要

下列每個章節中內嵌的影片都是使用舊版 Unity 和 Mixed Reality Toolkit 來錄製。 雖然逐步指示正確且目前,但您可能會在對應的影片中看到過期的腳本和視覺效果。 影片仍包含海報,因為涵蓋的概念仍適用。

裝置支援

課程 HoloLens 沉浸式頭戴裝置
MR Input 210:注視 ✔️ ✔️

在您開始使用 Intune 之前

必要條件

專案檔

  • 下載專案所需的 檔案 。 需要 Unity 2017.2 或更新版本。
  • 將檔案解除封存到桌面或其他容易觸達的位置。

注意

如果您想要在下載之前查看原始程式碼,可在 GitHub 上取得。

Errata 和 Notes

  • 在 Visual Studio 中,「Just My Code」必須在 [工具->選項->偵錯] 下取消核取 (取消核) 取,才能在程式代碼中叫用斷點。

第 1 章 - Unity 設定

目標

  • 最佳化 Unity 以用於 HoloLens 開發。
  • 匯入資產並設定場景。
  • 在 HoloLens 中檢視太空人。

指示

  1. 啟動 Unity。
  2. 選取 [新增專案]。
  3. 將專案命名為 ModelExplorer。
  4. 輸入位置作為您先前未封存的 Gaze 資料夾。
  5. 確定專案已設定為 3D。
  6. 按一下 [建立專案]。

HoloLens 的 Unity 設定

我們需要讓 Unity 知道我們嘗試導出的應用程式應該建立 沉浸式檢視 ,而不是 2D 檢視。 我們藉由將 HoloLens 新增為虛擬實境裝置來執行此動作。

  1. 移至 [編輯 > 專案設定 > 播放機]。
  2. 在 [播放機設定 的偵測器面板 ] 中,選取 [Windows 市集 ] 圖示。
  3. 展開 [XR 設定] 群組。
  4. 在 [轉譯] 區段中核取 [支援虛擬實境] 核取方塊,以新增 [虛擬實境 SDK] 清單。
  5. 確認 Windows Mixed Reality 出現在清單中。 如果沒有,請選取+清單底部的按鈕,然後選擇 [Windows 全像攝影]。

接下來,我們需要將腳本後端設定為 .NET。

  1. 移至 [編輯 > 項目設定 > 播放機 ] (您可能仍會從上一個步驟) 。
  2. 在 [播放機設定 的偵測器面板 ] 中,選取 [Windows 市集 ] 圖示。
  3. 在 [ 其他設定 組態] 區段中,確定 腳本後端 已設定為 .NET

最後,我們將更新質量設定,以在 HoloLens 上達到快速效能。

  1. 移至 [編輯 > 項目設定 > 品質]。
  2. 按兩下 [Windows 市集] 圖示下 [預設] 資料列中的向下指向箭號。
  3. 針對 Windows 市集應用程式選取 [非常低]。

匯入項目資產

  1. 以滑鼠右鍵按兩下 [專案] 面板中的 [資產] 資料夾。
  2. 按兩下 [匯入封裝自定義套件>]。
  3. 流覽至您下載的項目檔,然後按兩下 [ModelExplorer.unitypackage]。
  4. 按一下 [開啟] 。
  5. 封裝載入之後,按兩下 [ 匯 入] 按鈕。

設定場景

  1. 在階層中,刪除 主要相機。
  2. 在 HoloToolkit 資料夾中,開啟 [輸入 ] 資料夾,然後開啟 Prefabs 資料夾。
  3. 將 MixedRealityCameraParent 預 製專案從 Prefabs 資料夾拖放到 [階層]。
  4. 以滑鼠右鍵按兩下階層中的 方向光線 ,然後選取 [ 刪除]。
  5. 在 Holograms 資料夾中,將下列資產拖放到 階層的根目錄中:
    • AstroMan
    • 光線
    • SpaceAudioSource
    • SpaceBackground
  6. 啟動 播放模式 ▶以檢視太空人。
  7. 再次按兩下 [播放模式 ▶] 以 停止。
  8. 在 Holograms 資料夾中,尋找 Fitbox 資產,並將其拖曳至 階層的根目錄。
  9. 在 [階層] 面板中選取 [Fitbox]。
  10. 將 AstroMan 集合從 [階層] 拖曳到 [檢查] 面板中 [Fitbox] 的全像投影集合屬性。

儲存專案

  1. 儲存新的場景: 檔案 > 儲存場景為 。
  2. 按兩下 [新增資料夾 ],並將資料夾命名為 Scenes。
  3. 將檔案命名為 「ModelExplorer」 ,並將它儲存在 Scenes 資料夾中。

建置專案

  1. 在 Unity 中,選取 [ 檔案 > 建置設定]。
  2. 按兩下 [新增開啟場景 ] 以新增場景。
  3. 在 [平臺] 列表中選取 [通用 Windows 平台],然後按兩下 [切換平臺]。
  4. 如果您特別針對 HoloLens 進行開發,請將 目標裝置 設定為 HoloLens。 否則,請將它保留在任何 裝置上。
  5. 確定 [組建類型 ] 設定為 D3D ,且 SDK 已設定為 [最新安裝 ] (,這應該是 SDK 16299 或更新版本) 。
  6. 按一下 [建置]。
  7. 建立名為 「App」 的新資料夾 。
  8. 按兩下 [ 應用程式 ] 資料夾。
  9. 按 [選取資料夾]。

當 Unity 完成時,會出現 檔案總管 視窗。

  1. 開啟 [應用程式 ] 資料夾。
  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 。

第 2 章 - 資料指標和目標意見反應

目標

  • 數據指標可視化設計和行為。
  • 注視型數據指標意見反應。
  • 以注視為基礎的全像投影意見反應。

我們將以一些數據指標設計原則為基礎,也就是:

  • 數據指標一律存在。
  • 不要讓游標太小或大。
  • 避免妨礙內容。

指示

  1. 在 HoloToolkit\Input\Prefabs 資料夾中,尋找 InputManager 資產。
  2. 將 InputManager 拖放至 階層。
  3. 在 HoloToolkit\Input\Prefabs 資料夾中,尋找 Cursor 資產。
  4. 將 游標 拖放至 階層。
  5. 選取 Hierarchy 中的 InputManager 物件。
  6. 將 Cursor 物件從 Hierarchy 拖曳到 Inspector 底部的 InputManager 的 SimpleSinglePointerSelector 的 Cursor字段。

簡單單一指標選取器設定

建置和部署

  1. 從 [檔案 > 建置設定] 重建應用程式。
  2. 開啟 [應用程式] 資料夾。
  3. 開啟 ModelExplorer Visual Studio 方案。
  4. 按兩下 [偵錯 -> 啟動但不偵錯 ],或按 Ctrl + F5。
  5. 觀察游標的繪製方式,以及在觸控全像投影時如何變更外觀。

指示

  1. 在 [階層] 面板中,展開 AstroMan-GEO_G-Back_Center>> 物件。
  2. 按兩下 [Interactible.cs ] 以在Visual Studio 中開啟它。
  3. 在 Interactible.cs 中取消批注 IFocusable.OnFocusEnter () 和 IFocusable.OnFocusExit () 回呼中的行。 當焦點 (時,Mixed Reality 工具組的 InputManager 會透過注視或控制器指向) 進入並結束特定 GameObject 的碰撞器來呼叫這些專案。
/* TODO: DEVELOPER CODING EXERCISE 2.d */

void IFocusable.OnFocusEnter()
{
    for (int i = 0; i < defaultMaterials.Length; i++)
    {
        // 2.d: Uncomment the below line to highlight the material when gaze enters.
        defaultMaterials[i].EnableKeyword("_ENVIRONMENT_COLORING");
    }
}

void IFocusable.OnFocusExit()
{
    for (int i = 0; i < defaultMaterials.Length; i++)
    {
        // 2.d: Uncomment the below line to remove highlight on material when gaze exits.
        defaultMaterials[i].DisableKeyword("_ENVIRONMENT_COLORING");
    }
}

注意

EnableKeyword我們使用和 DisableKeyword 更新版本。 若要在您自己的應用程式中搭配工具組的標準著色器使用這些內容,您必須遵循 Unity 指導方針,以透過腳本存取數據。 在此情況下,我們已在 [資源] 資料夾中包含三種醒目提示 材質的變體 , (尋找名稱) 中具有醒目提示的三個材質。

建置和部署

  1. 如前所述,建置專案並部署至 HoloLens。
  2. 觀察注視的目標是物件,而不是物件時會發生什麼事。

第 3 章 - 目標技術

目標

  • 更輕鬆地以全像投影為目標。
  • 穩定自然頭部移動。

指示

  1. 在 [ 階層] 面板中,選取 InputManager 物件。
  2. 在 [偵測器 ] 面板中,尋找 注視穩定器 腳本。 如果您想要查看,請按兩下它以在Visual Studio中開啟。
    • 此腳本會逐一查看 Raycast 數據的樣本,並協助穩定使用者的注視以有效位數為目標。
  3. 在 Inspector 中,您可以編輯 [預存穩定性範例 ] 值。 這個值代表穩定器逐一查看以計算穩定值的樣本數目。

第 4 章 - 方向指示器

目標

  • 在游標上新增方向指示器,以協助尋找全像投影。

指示

我們將使用 DirectionIndicator.cs 檔案,這會:

  1. 如果使用者不在全像投影上,則顯示方向指示器。
  2. 如果使用者在全像投影上出現,請隱藏方向指示器。
  3. 更新方向指示器以指向全像投影。

現在就開始吧。

  1. 按兩下 [階層] 面板中的 AstroMan 物件,然後按兩下箭號展開它。
  2. 在 [階層] 面板中,選取 AstroMan 底下的 DirectionalIndicator 物件。
  3. 在 [偵測器] 面板中,按兩下 [ 新增元件 ] 按鈕。
  4. 在功能表中,於搜尋方塊中輸入 方向指示器。 選取搜尋結果。
  5. 在 [階層] 面板中,將 Cursor 物件拖放到 Inspector 中的 Cursor 屬性。
  6. 在 [專案] 面板中的 [全像投影] 資料夾中,將 DirectionalIndicator 資產拖放到 Inspector 中的 [方向指示器] 屬性。
  7. 建置及部署應用程式。
  8. 觀看方向指示器物件如何協助您尋找太空人。

第 5 章 - 計費

目標

  • 使用帳單板讓全像投影一律會面向您。

我們將使用 Billboard.cs 檔案來保留 GameObject 導向,使其隨時面向使用者。

  1. 在 [ 階層] 面板中,選取 AstroMan 物件。
  2. 在 [偵測器] 面板中,按兩下 [ 新增元件 ] 按鈕。
  3. 在功能表中,輸入搜尋方塊 Billboard。 選取搜尋結果。
  4. 在 偵測器 中,將 樞紐座標軸 設定為 Y。
  5. 試試看! 如先前一樣建置和部署應用程式。
  6. 不論您如何變更觀點,都瞭解 Billboard 物件如何面對您。
  7. 立即從 AstroMan 刪除文稿。

第 6 章 - Tag-Along

目標

  • 使用 Tag-Along 讓全像投影在房間周圍追蹤我們。

當我們處理此問題時,我們將遵循下列設計條件約束:

  • 內容一律應該一目了然。
  • 內容不應以這種方式運作。
  • 頭部鎖定內容很不方便。

這裡所使用的解決方案是使用「標記一起」方法。

標記沿著對象永遠不會完全離開用戶的檢視。 您可以將標籤視為由橡皮帶附加至使用者頭部的物件。 當用戶移動時,內容會透過滑動至檢視邊緣而不完全離開而保持簡單概覽。 當使用者注視標籤沿著物件時,會更完整地檢視它。

我們將使用 SimpleTagalong.cs 檔案,這會:

  1. 判斷 Tag-Along 物件是否在相機界限內。
  2. 如果不在檢視 frustum 中,請將 Tag-Along 放在檢視 frustum 中。
  3. 否則,請將 Tag-Along 放置在用戶的默認距離。

若要這樣做,我們必須先變更 Interactible.cs 腳本以呼叫 TagalongAction。

  1. 完成撰寫程式代碼練習 6.a (取消批注第 84 到 87 行) ,以編輯 Interactible.cs 。
/* TODO: DEVELOPER CODING EXERCISE 6.a */
// 6.a: Uncomment the lines below to perform a Tagalong action.
if (interactibleAction != null)
{
    interactibleAction.PerformAction();
}

與 Interactible.cs 配對的 InteractibleAction.cs 腳本會在點選全像投影時執行自定義動作。 在此案例中,我們將特別針對標記使用一個。

  • 在 [腳本] 資料夾中,按兩下 TagalongAction.cs 資產以在Visual Studio 中開啟。
  • 完成程式代碼撰寫練習,或將其變更為下列專案:
    • 在 [ 階層] 頂端的搜尋列中,輸入 ChestButton_Center 並選取結果。
    • 在 [ 偵測器] 面板中,按兩下 [ 新增元件] 按鈕。
    • 在功能表中,輸入搜尋方塊 Tagalong動作。 選取搜尋結果。
    • 在 Holograms 資料夾中,尋找 Tagalong 資產。
    • 在 [階層] 中選取ChestButton_Center物件。 將 TagAlong 物件從 [專案] 面板拖放到 [物件到 Tagalong] 屬性。
    • 將Tagalong Action 物件從偵測器拖曳到Interactible腳本上的 [互動動作] 字段。
  • 按兩下 TagalongAction 腳本,在Visual Studio中加以開啟。

可互動的設定

我們需要新增下列專案:

  • 將功能新增至TagalongAction腳本中的PerformAction函式, (繼承自InteractibleAction) 。
  • 將看板新增至注視物件,並將樞紐軸設定為 XY。
  • 然後將簡單的 Tag-Along 新增至物件。

以下是來自 TagalongAction.cs 的解決方案:

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using HoloToolkit.Unity;
using UnityEngine;

public class TagalongAction : InteractibleAction
{
    [SerializeField]
    [Tooltip("Drag the Tagalong prefab asset you want to display.")]
    private GameObject objectToTagalong;

    private void Awake()
    {
        if (objectToTagalong != null)
        {
            objectToTagalong = Instantiate(objectToTagalong);
            objectToTagalong.SetActive(false);

            /* TODO: DEVELOPER CODING EXERCISE 6.b */

            // 6.b: AddComponent Billboard to objectToTagAlong,
            // so it's always facing the user as they move.
            Billboard billboard = objectToTagalong.AddComponent<Billboard>();

            // 6.b: AddComponent SimpleTagalong to objectToTagAlong,
            // so it's always following the user as they move.
            objectToTagalong.AddComponent<SimpleTagalong>();

            // 6.b: Set any public properties you wish to experiment with.
            billboard.PivotAxis = PivotAxis.XY; // Already the default, but provided in case you want to edit
        }
    }

    public override void PerformAction()
    {
        // Recommend having only one tagalong.
        if (objectToTagalong == null || objectToTagalong.activeSelf)
        {
            return;
        }

        objectToTagalong.SetActive(true);
    }
}
  • 試試看! 建置和部署應用程式。
  • 觀看內容如何遵循注視點的中心,但不持續且不封鎖它。