HoloLens (第 1 代) 輸入 210:注視

重要

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

注視 是輸入的第一種形式,並顯示使用者的意圖和認知。 MR Input 210 (也稱為 Project Explorer) 是深入探討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. 按一下[建立Project]。

HoloLens的 Unity 設定

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

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

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

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

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

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

匯入專案資產

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

設定場景

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

儲存專案

  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 Solution

如果部署至 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欄位。

Simple Single Pointer Selector set-up

建置和部署

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

指示

  1. 在 [階層]面板中,展開AstroMan-GEO_G-Back_Center>> 物件。
  2. 按兩下[Interactible.cs] 以在 Visual Studio 中開啟它。
  3. Interactible.cs中取消批註IFocusable.OnFocusEnter () IFocusable.OnFocusExit () 回呼中的行。 當焦點 (或控制器指向) 進入並結束特定 GameObject 的碰撞器時,Mixed Reality工具組的 InputManager 會呼叫這些專案。
/* 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. [Project]面板中的[全像投影]資料夾中,將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 動作。 選取搜尋結果。
    • 全像投影資料夾中,尋找Tagalong資產。
    • [階層] 中選取ChestButton_Center物件。 將TagAlong物件從Project面板拖放到[物件到 Tagalong]屬性中。
    • Tagalong Action物件從偵測器拖曳到Interactible腳本上的[互動動作] 欄位。
  • 按兩下TagalongAction腳本,以在Visual Studio中開啟它。

Interactible set-up

我們需要新增下列專案:

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