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 之前
必要條件
- 已安裝正確工具的 Windows 10 計算機。
- 一些基本的 C# 程式設計能力。
- 您應該已完成 MR Basics 101。
- 已 設定用於開發的 HoloLens 裝置。
專案檔
- 下載專案所需的 檔案 。 需要 Unity 2017.2 或更新版本。
- 將檔案解除封存到桌面或其他容易觸達的位置。
注意
如果您想要在下載之前查看原始程式碼,可在 GitHub 上取得。
Errata 和 Notes
- 在 Visual Studio 中,「Just My Code」必須在 [工具->選項->偵錯] 下取消核取 (取消核) 取,才能在程式代碼中叫用斷點。
第 1 章 - Unity 設定
目標
- 最佳化 Unity 以用於 HoloLens 開發。
- 匯入資產並設定場景。
- 在 HoloLens 中檢視太空人。
指示
- 啟動 Unity。
- 選取 [新增專案]。
- 將專案命名為 ModelExplorer。
- 輸入位置作為您先前未封存的 Gaze 資料夾。
- 確定專案已設定為 3D。
- 按一下 [建立專案]。
HoloLens 的 Unity 設定
我們需要讓 Unity 知道我們嘗試導出的應用程式應該建立 沉浸式檢視 ,而不是 2D 檢視。 我們藉由將 HoloLens 新增為虛擬實境裝置來執行此動作。
- 移至 [編輯 > 專案設定 > 播放機]。
- 在 [播放機設定 的偵測器面板 ] 中,選取 [Windows 市集 ] 圖示。
- 展開 [XR 設定] 群組。
- 在 [轉譯] 區段中核取 [支援虛擬實境] 核取方塊,以新增 [虛擬實境 SDK] 清單。
- 確認 Windows Mixed Reality 出現在清單中。 如果沒有,請選取+清單底部的按鈕,然後選擇 [Windows 全像攝影]。
接下來,我們需要將腳本後端設定為 .NET。
- 移至 [編輯 > 項目設定 > 播放機 ] (您可能仍會從上一個步驟) 。
- 在 [播放機設定 的偵測器面板 ] 中,選取 [Windows 市集 ] 圖示。
- 在 [ 其他設定 組態] 區段中,確定 腳本後端 已設定為 .NET
最後,我們將更新質量設定,以在 HoloLens 上達到快速效能。
- 移至 [編輯 > 項目設定 > 品質]。
- 按兩下 [Windows 市集] 圖示下 [預設] 資料列中的向下指向箭號。
- 針對 Windows 市集應用程式選取 [非常低]。
匯入項目資產
- 以滑鼠右鍵按兩下 [專案] 面板中的 [資產] 資料夾。
- 按兩下 [匯入封裝自定義套件>]。
- 流覽至您下載的項目檔,然後按兩下 [ModelExplorer.unitypackage]。
- 按一下 [開啟] 。
- 封裝載入之後,按兩下 [ 匯 入] 按鈕。
設定場景
- 在階層中,刪除 主要相機。
- 在 HoloToolkit 資料夾中,開啟 [輸入 ] 資料夾,然後開啟 Prefabs 資料夾。
- 將 MixedRealityCameraParent 預 製專案從 Prefabs 資料夾拖放到 [階層]。
- 以滑鼠右鍵按兩下階層中的 方向光線 ,然後選取 [ 刪除]。
- 在 Holograms 資料夾中,將下列資產拖放到 階層的根目錄中:
- AstroMan
- 光線
- SpaceAudioSource
- SpaceBackground
- 啟動 播放模式 ▶以檢視太空人。
- 再次按兩下 [播放模式 ▶] 以 停止。
- 在 Holograms 資料夾中,尋找 Fitbox 資產,並將其拖曳至 階層的根目錄。
- 在 [階層] 面板中選取 [Fitbox]。
- 將 AstroMan 集合從 [階層] 拖曳到 [檢查] 面板中 [Fitbox] 的全像投影集合屬性。
儲存專案
- 儲存新的場景: 檔案 > 儲存場景為 。
- 按兩下 [新增資料夾 ],並將資料夾命名為 Scenes。
- 將檔案命名為 「ModelExplorer」 ,並將它儲存在 Scenes 資料夾中。
建置專案
- 在 Unity 中,選取 [ 檔案 > 建置設定]。
- 按兩下 [新增開啟場景 ] 以新增場景。
- 在 [平臺] 列表中選取 [通用 Windows 平台],然後按兩下 [切換平臺]。
- 如果您特別針對 HoloLens 進行開發,請將 目標裝置 設定為 HoloLens。 否則,請將它保留在任何 裝置上。
- 確定 [組建類型 ] 設定為 D3D ,且 SDK 已設定為 [最新安裝 ] (,這應該是 SDK 16299 或更新版本) 。
- 按一下 [建置]。
- 建立名為 「App」 的新資料夾 。
- 按兩下 [ 應用程式 ] 資料夾。
- 按 [選取資料夾]。
當 Unity 完成時,會出現 檔案總管 視窗。
- 開啟 [應用程式 ] 資料夾。
- 開啟 ModelExplorer Visual Studio 方案。
如果部署至 HoloLens:
- 使用 Visual Studio 中的頂端工具列,將目標從 [偵錯] 變更為 [發行 ],並將目標從 ARM 變更為 x86。
- 按兩下 [本機計算機] 按鈕旁邊的下拉式箭號,然後選取 [ 遠端計算機]。
- 輸入您的 HoloLens 裝置 IP 位址 ,並將 [驗證模式] 設定為 [通用] ([未加密通訊協定]) 。 按一下 [選取]。 如果您不知道裝置 IP 位址,請查看 [設定 > 網络] & [因特網 > 進階選項]。
- 在頂端功能表欄中,按一下 [偵錯 - 啟動但不>偵錯],或按 Ctrl + F5。 如果這是第一次部署到您的裝置,您必須 將它與 Visual Studio 配對。
- 部署應用程式時,請使用選取手勢關閉 Fitbox。
如果部署至沉浸式頭戴裝置:
- 使用 Visual Studio 中的頂端工具列,將目標從 [偵錯] 變更為 [發行 ],並將目標從 ARM 變更為 x64。
- 請確定部署目標已設定為 本機計算機。
- 在頂端功能表欄中,按一下 [偵錯 - 啟動但不>偵錯],或按 Ctrl + F5。
- 當應用程式已部署時,藉由提取動作控制器上的觸發程式來關閉 Fitbox 。
第 2 章 - 資料指標和目標意見反應
目標
- 數據指標可視化設計和行為。
- 注視型數據指標意見反應。
- 以注視為基礎的全像投影意見反應。
我們將以一些數據指標設計原則為基礎,也就是:
- 數據指標一律存在。
- 不要讓游標太小或大。
- 避免妨礙內容。
指示
- 在 HoloToolkit\Input\Prefabs 資料夾中,尋找 InputManager 資產。
- 將 InputManager 拖放至 階層。
- 在 HoloToolkit\Input\Prefabs 資料夾中,尋找 Cursor 資產。
- 將 游標 拖放至 階層。
- 選取 Hierarchy 中的 InputManager 物件。
- 將 Cursor 物件從 Hierarchy 拖曳到 Inspector 底部的 InputManager 的 SimpleSinglePointerSelector 的 Cursor字段。
建置和部署
- 從 [檔案 > 建置設定] 重建應用程式。
- 開啟 [應用程式] 資料夾。
- 開啟 ModelExplorer Visual Studio 方案。
- 按兩下 [偵錯 -> 啟動但不偵錯 ],或按 Ctrl + F5。
- 觀察游標的繪製方式,以及在觸控全像投影時如何變更外觀。
指示
- 在 [階層] 面板中,展開 AstroMan-GEO_G-Back_Center>> 物件。
- 按兩下 [Interactible.cs ] 以在Visual Studio 中開啟它。
- 在 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 指導方針,以透過腳本存取數據。 在此情況下,我們已在 [資源] 資料夾中包含三種醒目提示 材質的變體 , (尋找名稱) 中具有醒目提示的三個材質。
建置和部署
- 如前所述,建置專案並部署至 HoloLens。
- 觀察注視的目標是物件,而不是物件時會發生什麼事。
第 3 章 - 目標技術
目標
- 更輕鬆地以全像投影為目標。
- 穩定自然頭部移動。
指示
- 在 [ 階層] 面板中,選取 InputManager 物件。
- 在 [偵測器 ] 面板中,尋找 注視穩定器 腳本。 如果您想要查看,請按兩下它以在Visual Studio中開啟。
- 此腳本會逐一查看 Raycast 數據的樣本,並協助穩定使用者的注視以有效位數為目標。
- 在 Inspector 中,您可以編輯 [預存穩定性範例 ] 值。 這個值代表穩定器逐一查看以計算穩定值的樣本數目。
第 4 章 - 方向指示器
目標
- 在游標上新增方向指示器,以協助尋找全像投影。
指示
我們將使用 DirectionIndicator.cs 檔案,這會:
- 如果使用者不在全像投影上,則顯示方向指示器。
- 如果使用者在全像投影上出現,請隱藏方向指示器。
- 更新方向指示器以指向全像投影。
現在就開始吧。
- 按兩下 [階層] 面板中的 AstroMan 物件,然後按兩下箭號展開它。
- 在 [階層] 面板中,選取 AstroMan 底下的 DirectionalIndicator 物件。
- 在 [偵測器] 面板中,按兩下 [ 新增元件 ] 按鈕。
- 在功能表中,於搜尋方塊中輸入 方向指示器。 選取搜尋結果。
- 在 [階層] 面板中,將 Cursor 物件拖放到 Inspector 中的 Cursor 屬性。
- 在 [專案] 面板中的 [全像投影] 資料夾中,將 DirectionalIndicator 資產拖放到 Inspector 中的 [方向指示器] 屬性。
- 建置及部署應用程式。
- 觀看方向指示器物件如何協助您尋找太空人。
第 5 章 - 計費
目標
- 使用帳單板讓全像投影一律會面向您。
我們將使用 Billboard.cs 檔案來保留 GameObject 導向,使其隨時面向使用者。
- 在 [ 階層] 面板中,選取 AstroMan 物件。
- 在 [偵測器] 面板中,按兩下 [ 新增元件 ] 按鈕。
- 在功能表中,輸入搜尋方塊 Billboard。 選取搜尋結果。
- 在 偵測器 中,將 樞紐座標軸 設定為 Y。
- 試試看! 如先前一樣建置和部署應用程式。
- 不論您如何變更觀點,都瞭解 Billboard 物件如何面對您。
- 立即從 AstroMan 刪除文稿。
第 6 章 - Tag-Along
目標
- 使用 Tag-Along 讓全像投影在房間周圍追蹤我們。
當我們處理此問題時,我們將遵循下列設計條件約束:
- 內容一律應該一目了然。
- 內容不應以這種方式運作。
- 頭部鎖定內容很不方便。
這裡所使用的解決方案是使用「標記一起」方法。
標記沿著對象永遠不會完全離開用戶的檢視。 您可以將標籤視為由橡皮帶附加至使用者頭部的物件。 當用戶移動時,內容會透過滑動至檢視邊緣而不完全離開而保持簡單概覽。 當使用者注視標籤沿著物件時,會更完整地檢視它。
我們將使用 SimpleTagalong.cs 檔案,這會:
- 判斷 Tag-Along 物件是否在相機界限內。
- 如果不在檢視 frustum 中,請將 Tag-Along 放在檢視 frustum 中。
- 否則,請將 Tag-Along 放置在用戶的默認距離。
若要這樣做,我們必須先變更 Interactible.cs 腳本以呼叫 TagalongAction。
- 完成撰寫程式代碼練習 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);
}
}
- 試試看! 建置和部署應用程式。
- 觀看內容如何遵循注視點的中心,但不持續且不封鎖它。