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 的 SimpleSinglePointerSelectorCursor字段。

簡單單一指標選取器設定

建置和部署

  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);
    }
}
  • 試試看! 建置和部署應用程式。
  • 觀看內容如何遵循注視點的中心,但不持續且不封鎖它。