天天看點

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

伴随着數月的期待,終于拿到了預訂的HoloLens開發者版本套件。随着VR/AR/MR技術的熱潮,國内外均對它們的應用與盈利前景持有積極的預期,這也直接導緻了國内外目前投資VR/AR/MR技術的熱潮。無論是融資數十億美元的Magic Leap,還是Facebook、微軟等科技巨頭布局VR/AR市場,這股熱潮不僅出現在風險投資領域,還席卷了消費者市場和智能硬體市場,這無疑引領了下一波網際網路産業的爆發,而我們作為技術核心的開發者更不能落下。正如喬幫主所說:“Stay foolish,Stay Hungry”,今天我們就來了解下AR/MR技術的開發特性,本文以微軟出品的HoloLens為目标裝置。

AR/MR是什麼?

VR大家都已經很清楚了,VR即是虛拟現實技術,這意味着沉浸式全虛拟的使用體驗。全虛拟沉浸式的體驗帶了獨特的視覺效果,但是由于遮蓋現實内容,仍導緻了頭暈、運動不友好等難以解決的問題。與之相對的則是AR/MR技術,這意味虛拟世界與真實世界交織的視覺體驗。從使用者使用體驗來看,AR/MR無疑是更符合人類自然互動模式,代表了未來更偉大的發展方向。同時在筆者看來,由Magic Leap提出的MR(Mixed Reality)技術其本質與AR(Augmented Reality)技術并無差別,微軟目前也在HoloLens文檔中大量使用MR技術的說法,故此本文将AR/MR技術視為一體。

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

AR核心特性

正如上面所說,AR具備與VR截然不同的視覺體驗,是以其開發體驗也與VR差別較大,下面我們來一起探讨HoloLens的部分核心開發特性。本文使用的開發環境為Unity HoloLens preview beta 14以及Unity Universal Windows Platform Runtime元件,具體的配置細節可看:http://www.cnblogs.com/mantgh/p/5352703.html;

錄影機 Camera

根據沉浸式全虛拟的VR體驗要求,是以我們見到VR獨特的錄影機視角,包括兩個一模一樣内容的視口。

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

VR錄影機視圖

然而,AR追求的是自然的使用者體驗,是以不會遮擋任何真實世界的内容。是以我們并不需要創造兩個同樣視圖内容的攝像頭,仍然和傳統的桌面、移動端沒有太大差別。主要需要适配的内容是背景和視角範圍。對于HoloLens,将主錄影機渲染背景設為純色,顔色設為RGBA(0,0,0,0)。因為任何純黑的顔色将會被HoloLens渲染為透明,以達到不遮擋現實世界的目的。此外,HoloLens建議錄影機視角近距離為0.85,這個距離最符合真實人眼的體驗。同時主錄影機位置必須重置為世界零點,即xyz(0,0,0),任何全息圖像将會以此為原點在周邊世界中繪制出來。

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

主錄影機推薦設定

Gaze凝視射線

與VR頭戴裝置一樣,HoloLens同樣依賴于裝置發出的凝視射線來選中目标。Gaze凝視的作用和PC上的光标一樣,配合語音和手勢能夠實作對全息對象的操縱。作為一個全息應用開發者,你可以使用凝視做到很多事情:

  • 應用可以通過判斷凝視射線與全息物體的交叉來判斷使用者目前在關注什麼。
  • 應用可以借助基于凝視射線的手勢來實作選中、激活、拖拽或其他對全息物體的互動。
  • 通過凝視射線與空間比對網格的交叉,應用可以讓使用者放置全息物體到真實世界的表面。
  • 應用可以知道何時使用者沒有注視在重要物體的方向,這使得你可以通過圖形或者聲音提醒将使用者帶回到正确的方向上。

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代表了射線集中地全息對象

       }

}      

對于凝視射線,筆者建議使用單例來進行管理,這樣可以避免功能混亂。同時為凝視設定可視化的指針,可以提高使用者的互動體驗和效率。

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

手勢識别Gesture

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

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

開始菜單

同時我們可以為應用自定義手勢,通過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來對真實世界做互動。

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

全息處理單元

我們可以利用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,他們無疑會是未來市場的引領者,而目前也是我們學習的黃金階段,能夠迎頭趕上這波浪潮,對于相關從業者具有重要的意義。

繼續閱讀