HoloLens開發手記 - 入門學習階段總結

伴隨着數月的期待,終於拿到了預訂的HoloLens開發者版本套件。隨着VR/AR/MR技術的熱潮,國內外均對它們的應用與盈利前景持有積極的預期,這也直接致使了國內外當前投資VR/AR/MR技術的熱潮。不管是融資數十億美圓的Magic Leap,仍是Facebook、微軟等科技巨頭佈局VR/AR市場,這股熱潮不只出如今風險投資領域,還席捲了消費者市場和智能硬件市場,這無疑引領了下一波互聯網產業的爆發,而咱們做爲技術核心的開發者更不能落下。正如喬幫主所說:「Stay foolish,Stay Hungry」,今天咱們就來了解下AR/MR技術的開發特性,本文以微軟出品的HoloLens爲目標設備。html

 

AR/MR是什麼?


 

 

VR你們都已經很清楚了,VR便是虛擬現實技術,這意味着沉浸式全虛擬的使用體驗。全虛擬沉浸式的體驗帶了獨特的視覺效果,可是因爲遮蓋現實內容,仍致使了頭暈、運動不友好等難以解決的問題。與之相對的則是AR/MR技術,這意味虛擬世界與真實世界交織的視覺體驗。從用戶使用體驗來看,AR/MR無疑是更符合人類天然交互模式,表明了將來更偉大的發展方向。同時在筆者看來,由Magic Leap提出的MR(Mixed Reality)技術其本質與AR(Augmented Reality)技術並沒有區別,微軟目前也在HoloLens文檔中大量使用MR技術的說法,故此本文將AR/MR技術視爲一體。數組

 

 

 

AR核心特性


 

 

正如上面所說,AR具有與VR大相徑庭的視覺體驗,因此其開發體驗也與VR區別較大,下面咱們來一塊兒探討HoloLens的部分核心開發特性。本文使用的開發環境爲Unity HoloLens preview beta 14以及Unity Universal Windows Platform Runtime組件,具體的配置細節可看:http://www.cnblogs.com/mantgh/p/5352703.html;app

 

攝像機 Camera

 

根據沉浸式全虛擬的VR體驗要求,因此咱們見到VR獨特的攝像機視角,包括兩個如出一轍內容的視口。ide

 

 

VR攝像機視圖oop

 

然而,AR追求的是天然的用戶體驗,因此不會遮擋任何真實世界的內容。因此咱們並不須要創造兩個一樣視圖內容的攝像頭,仍然和傳統的桌面、移動端沒有太大區別。主要須要適配的內容是背景和視角範圍。對於HoloLens,將主攝像機渲染背景設爲純色,顏色設爲RGBA(0,0,0,0)。由於任何純黑的顏色將會被HoloLens渲染爲透明,以達到不遮擋現實世界的目的。此外,HoloLens建議攝像機視角近距離爲0.85,這個距離最符合真實人眼的體驗。同時主攝像機位置必須重置爲世界零點,即xyz(0,0,0),任何全息圖像將會以此爲原點在周邊世界中繪製出來。佈局

 

 

主攝像機推薦設置學習

 

Gaze凝視射線

 

與VR頭戴設備同樣,HoloLens一樣依賴於設備發出的凝視射線來選中目標。Gaze凝視的做用和PC上的光標同樣,配合語音和手勢可以實現對全息對象的操縱。做爲一個全息應用開發者,你可使用凝視作到不少事情:spa

  • 應用能夠經過判斷凝視射線與全息物體的交叉來判斷用戶當前在關注什麼。
  • 應用能夠藉助基於凝視射線的手勢來實現選中、激活、拖拽或其餘對全息物體的交互。
  • 經過凝視射線與空間匹配網格的交叉,應用可讓用戶放置全息物體到真實世界的表面。
  • 應用能夠知道什麼時候用戶沒有注視在重要物體的方向,這使得你能夠經過圖形或者聲音提醒將用戶帶回到正確的方向上。

Unity自帶了對射線的支持,可以很好的集成爲凝視射線,只須要簡單的代碼便可:指針

 

void Update()

{

       RaycastHit hitInfo;

       if (Physics.Raycast(

               Camera.main.transform.position,

               Camera.main.transform.forward,

               out hitInfo,

               20.0f,

               Physics.DefaultRaycastLayers))

       {

           // 若是射線成功擊中一個全息對象

           // hitInfo的point屬性表明了射線擊中的位置

           // hitInfo.collider.GameObject表明了射線集中地全息對象

       }

}

 

對於凝視射線,筆者建議使用單例來進行管理,這樣能夠避免功能混亂。同時爲凝視設置可視化的指針,能夠提升用戶的交互體驗和效率。code

 

 

 

手勢識別Gesture

 

手勢是HoloLens三大基本輸入方式之一,其他是語音和凝視。Windows Holographic支持的基本手勢爲Air-Tap(點擊),Hold(長按)和Bloom(綻放)。Air-Tap手勢用於選中物體,而Hold手勢用於喚出二級菜單,Bloom手勢用於喚出開始菜單。

 

 

開始菜單

 

同時咱們能夠爲應用自定義手勢,經過GestureRecognizer來識別。下面是基本的手勢識別用法:

 

//初始化手勢識別器

GestureRecognizer recognizer = new GestureRecognizer();

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

recognizer.TappedEvent += MyTapEventHandler;

recognizer.HoldEvent += MyHoldEventHandler;

//開始識別

recognizer.StartCapturingGestures();

 

 

語音識別Voice Command

 

語音識別一樣是HoloLens重要組成部分,包括咱們很熟悉的Cortana,一樣可以爲咱們帶來更天然高效的輸入體驗。

HoloLens的語音識別分爲三個部分:

 

  • 語音命令 KeywordRecognizer:經過關鍵詞來執行動做
  • 語法識別GrammarRecognizer:經過預設的語法來模糊匹配動做
  • 聽寫 Diction:即語音轉文字,用於輸入

 

三個組件中語音命令特性最爲經常使用,配合凝視可以完成絕大部分場景的需求。爲了使用語音命令,首先要啓用KeywordRecognizer實例,同時要預設好<keyword,action>來源。

 

KeywordRecognizer keywordRecognizer;

Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

 

 

經過<keyword,action>數組來初始化關鍵詞識別器:

 

keywords.Add("activate", () =>

{

    // 關鍵詞動做

});

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

//開始識別

keywordRecognizer.Start();

 

在響應事件中作處理,調用識別到的關鍵詞事件。

 

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)

{

    System.Action keywordAction;

//若是關鍵詞在預設列表中,即執行其2動做

if (keywords.TryGetValue(args.text, out keywordAction))

    {

        keywordAction.Invoke();

    }

}

 

 

空間映射 Spatial Mapping

 

AR技術能實現的關鍵就是可以識別映射周邊世界,這是全息對象與真實表面交互的基礎,是AR技術的核心組件。HoloLens藉助於微軟特殊研發的全息處理單元(HPU 1.0)才能實現空間映射特性,幸運的是咱們可使用空間映射API來對真實世界作交互。

 

 

全息處理單元

 

咱們能夠利用SurfaceObserver組件來獲取控件表面映射信息,下面是基本的操做:

 

SurfaceObserver surfaceObserver;



 void Start () {

//初始化

     surfaceObserver = new SurfaceObserver();

StartCoroutine(UpdateLoop());

 }



IEnumerator UpdateLoop()

    {

        var wait = new WaitForSeconds(2.5f);

        while(true)

        {

            surfaceObserver.Update(OnSurfaceChanged);

            yield return wait;

        }

    }

 

 

每個空間表面都須要註冊其Handle事件,用於實時調整空間映射信息和交互。

 

private void OnSurfaceChanged(SurfaceId surfaceId, SurfaceChange changeType, Bounds bounds, System.DateTime updateTime)

 {

    //處理空間表面變化

 }

 

 

結語


 

 

AR/MR技術獨特的交互體驗與開發特性,表明了將來天然交互的發展方向,相較於目前成熟的VR技術,它們具備更光明的發展前景和更廣闊的用途。不管是微軟仍是Magic Leap,他們無疑會是將來市場的引領者,而目前也是咱們學習的黃金階段,可以迎頭遇上這波浪潮,對於相關從業者具備重要的意義。

相關文章
相關標籤/搜索