一、Hololens概述
Hololens有以下特性
1、空間映射
借助微軟特殊定制的全息處理單元(HPU),HoloLens 實現了對周邊環境的快速掃描和空間匹配。這保證了 HoloLens能夠准確地在真實世界表面放置或展現全息圖形內容,確保了核心的AR體驗。
2、場景匹配
HoloLens 設備能存儲並識別環境信息,恢復和保持不同場景中的全息圖像對象。當你離開當前房間再回來時,會發現原有放置的全息圖像均會在正確的位置出現。
3、自然交互
HoloLens 主要交互方式為凝視(Gaze)、語音(Voice Command)和手勢(Gesture),這構成了 HoloLens的基本輸入要素。同時傳統的鍵盤鼠標等設備也被支持,自然的交互方式更貼近人類習慣,提高了交互效率。
4、 通用應用
HoloLens 平台的操作系統為 Windows Holograpic,同樣基於 Windows 10 定制。所以Windows 10 UWP 通用應用程序可以順利地在 HoloLens 上運行。這不僅降低了研發和遷移成本,也讓開發效率能夠大幅提升。當然,說了很多 HoloLens 獨特的特性和優點后,HoloLens 開發者版本也存在一些亟待解決的問題,包括視野較窄、凝視體驗不佳、抗光線干擾弱和重量續航等問題。 但瑕不掩瑜,HoloLens 帶來了真正的混合現實體驗,擁有着強烈的沖擊感,未來將大有作為。
二、開發環境搭建
開發Hololens之前需要准備以下環境(以下為我准備的環境)
2、HoloLens Emulator (build 10.0.14393.0)(有真機可以不用模擬器)
3、Unity HoloLens Technical Preview
4、Windows 10 SDK (10.0.14393.33) VS中進行安裝
更加詳細的環境配置可參考
https://developer.microsoft.com/en-us/windows/holographic/install_the_tools
三、集成HoloToolkit-Unity項目
在創建了標准 Unity 項目之后,我們需要集成微軟官方提供的 HoloToolkit-Unity 項目。HoloToolkit-Unity 項目是微軟官方的開源項目,用於幫助開發者快速開發 HoloLens 應用,能夠快速為項目集成基本輸入、空間映射和場景匹配等特性。
關於該項目的詳細介紹,可以參考微軟的開源項目https://github.com/Microsoft/HoloToolkit-Unity
集成步驟
1、下載HoloToolkit-Unity代碼 https://github.com/Microsoft/HoloToolkit-Unity.git
2、使用unity打開HoloToolkit工程,右擊Assets,導出Package
3、在自己的工程中使用HoloToolkit-Unity package
新建自己的Unity工程,Assets -> Import Package -> Custom Package 選擇剛才導出的HoloToolket-Unity package, 導入成功后,可以看到HoloToolkit菜單
以下是此項目的結構和內容
Input 目錄
GazeManager.cs 用於快速集成凝視射線特性;
GestureManager.cs 用於快速集成手勢識別特性;
KeywordManager.cs 用於快速集成語音命令特性;
CursorManager.cs 用於快速集成可視化凝視組件。
Sharing 目錄
Sharing Prefab 組件用於快速集成場景共享特性。
SpatialMapping 目錄
SurfacePlane Prefab 組件用於描述和渲染真實世界表面;
SpatialMapping Prefab 組件用於快速集成空間映射特性;
RemoteMapping Prefab 組件用於快速集成遠程空間映射信息導入特性;
SpatialSound 目錄
UAudioManager.cs 用於快速集成空間聲音特性。
Utilities 目錄
Billboard.cs 用於實現跟隨用戶視線特性;
Tagalong.cs 用於實現跟隨用戶移動特性;
Main Camera Prefab組件用於快速集成 HoloLens 標准主攝像機。
四、構建場景
1、新建空白場景后,我們需要刪除原有的 Main Camera 對象,同時從 HoloToolkit/Utilities/Prefabs 目錄中拖拽一個 Main Camera Prefab 組件到場景中,這樣就集成了滿足 HoloLens 需求的基本。主攝像機。對於 HoloLens,將主攝像機渲染背景設為純色,顏色設為 RGBA(0,0,0,0)。因為任何純黑的顏色將會被 HoloLens 渲染為透明,以達到不遮擋現實世界的目的。此外,HoloLens 建議攝像機視角近距離為 0.85,這個距離最符合真實人眼的體驗。同時主攝像機位置必須重置為世界零點,即 xyz(0,0,0),任何全息圖像將會以此為原點在周邊世界中繪制出來。
2、點擊“ Create Empty” 創建一個空游戲對象,並將其命名為 Input,為 Input 對象添加核心腳本組件,分別為 GazeManager.cs、 GestureManager.cs、 HandsManager.cs 和KeywordManager.cs。這樣就集成了凝視、手勢和語音命令三大核心特性。對於凝視射線、手勢識別和語音命令功能,均建議使用單例來進行管理,這樣可以避免功能混亂,方便管理。同時為凝視設置可視化的指針,可以提高用戶的交互體驗和效率。
3、從 HoloToolkit/Input/Prefabs/ 目錄下拖拽 CursorWithFeedback Prefab 組件到場景中。這樣當凝視在全息對象時,其表面會出現可視化凝視組件。 當用戶手勢被識別到時,會出現一個藍色的手掌圖像,能夠貼心的告訴用戶可以操作了。
4、創建一個Cube對象並創建一個新的C#腳本,命名為 HoloTest.cs。
using UnityEngine; using System.Collections; public class HoloTest : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } public void OnSelect() { //隨機變換物體顏色 gameObject.GetComponent<MeshRenderer>().material.color = new Color(Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f); } }
5、HoloTest.cs 腳本的功能為隨機更換對象的材質顏色,遵循 GestureManager.cs 中預設的OnSelect消息名稱
進入 Input 組件檢視選項卡,為 KeywordManager.cs 組件配置語音命令。語音命令觸發時將會執行相應的組件行為。 本例中,當我說出“ test”時,觸發Cube的 OnSelect 方法,來隨機改變 Cube 顏色。
五、編譯項目
1、為了滿足HoloLens的需求,我們需要在 Player Settings 里面開啟Virtual Reality Support,並在下拉列表中選中Windows Holographic,只有這樣 HoloLens 才會將此應用渲染為3D應用,這一點十分關鍵。
2、同時從工具欄 Edit->Project Settings->Quality 選項卡中,將 UWP 平台默認畫質設為Fastest。這是為了降低性能開銷,官方推薦幀率為 60fps。
3、Build Settings 視圖中選擇目標平台為 Windows Store,SDK 為 Universal 10,其他設置為如圖所示,把Unity C# Projects勾上方便調試,點擊 Build 按鈕開始編譯 UWP 項目。
六、部署調試應用
使用 Visual Studio 打開編譯后的 UWP 項目,在 Debug (方便調試)選項上設置為x86(Hololens的系統類型,非計算機的)。
連接 HoloLens 到 PC,完成 Build 和 Deploy 后,我們在 HoloLens 中打開此應用。實際效果如圖 所示。當我使用手勢點擊 Cube 時,它會隨機變化顏色;而當我說出語音命令"test"時,Cube 仍會正常的變換顏色。
七、開發總結
使用 Unity 引擎開發 HoloLens 應用是非常容易的事情,大部分流程與開發 UWP 項目並無不同。但仍有不少需要注意的雷區和特殊要求,以下就是部分要注意的部分:
1. Main Camera 一定要按照官方要求配置,背景純色且 RGBA 值為(0,0,0,0),這樣才能避免遮擋現實內容;
2. Gaze 凝視特性需要我們使用 Raycast 來實現,注意處理射線未命中目標情形,默認凝視最遠距離為 15 米,若是未擊中物體,使用時可能會出現空引用異常;
3. 手勢識別、拍照和語音命令等均需使用 Windows 特有 API,空間映射和場景匹配需要使用 HoloLens 特有 API;
4. 其他很多細節上的體驗,例如可視化凝視組件、目標區域可視化指引組件,使用他們來給用戶提示,可以幫助用戶理解應用操作方法,提高使用體驗。