伴隨着數月的期待,終於拿到了預訂的HoloLens開發者版本套件。隨着VR/AR/MR技術的熱潮,國內外均對它們的應用與盈利前景持有積極的預期,這也直接致使了國內外當前投資VR/AR/MR技術的熱潮。不管是融資數十億美圓的Magic Leap,仍是Facebook、微軟等科技巨頭佈局VR/AR市場,這股熱潮不只出如今風險投資領域,還席捲了消費者市場和智能硬件市場,這無疑引領了下一波互聯網產業的爆發,而咱們做爲技術核心的開發者更不能落下。正如喬幫主所說:「Stay foolish,Stay Hungry」,今天咱們就來了解下AR/MR技術的開發特性,本文以微軟出品的HoloLens爲目標設備。html
VR你們都已經很清楚了,VR便是虛擬現實技術,這意味着沉浸式全虛擬的使用體驗。全虛擬沉浸式的體驗帶了獨特的視覺效果,可是因爲遮蓋現實內容,仍致使了頭暈、運動不友好等難以解決的問題。與之相對的則是AR/MR技術,這意味虛擬世界與真實世界交織的視覺體驗。從用戶使用體驗來看,AR/MR無疑是更符合人類天然交互模式,表明了將來更偉大的發展方向。同時在筆者看來,由Magic Leap提出的MR(Mixed Reality)技術其本質與AR(Augmented Reality)技術並沒有區別,微軟目前也在HoloLens文檔中大量使用MR技術的說法,故此本文將AR/MR技術視爲一體。數組
正如上面所說,AR具有與VR大相徑庭的視覺體驗,因此其開發體驗也與VR區別較大,下面咱們來一塊兒探討HoloLens的部分核心開發特性。本文使用的開發環境爲Unity HoloLens preview beta 14以及Unity Universal Windows Platform Runtime組件,具體的配置細節可看:http://www.cnblogs.com/mantgh/p/5352703.html;app
根據沉浸式全虛擬的VR體驗要求,因此咱們見到VR獨特的攝像機視角,包括兩個如出一轍內容的視口。ide
VR攝像機視圖oop
然而,AR追求的是天然的用戶體驗,因此不會遮擋任何真實世界的內容。因此咱們並不須要創造兩個一樣視圖內容的攝像頭,仍然和傳統的桌面、移動端沒有太大區別。主要須要適配的內容是背景和視角範圍。對於HoloLens,將主攝像機渲染背景設爲純色,顏色設爲RGBA(0,0,0,0)。由於任何純黑的顏色將會被HoloLens渲染爲透明,以達到不遮擋現實世界的目的。此外,HoloLens建議攝像機視角近距離爲0.85,這個距離最符合真實人眼的體驗。同時主攝像機位置必須重置爲世界零點,即xyz(0,0,0),任何全息圖像將會以此爲原點在周邊世界中繪製出來。佈局
主攝像機推薦設置學習
與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
手勢是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();
語音識別一樣是HoloLens重要組成部分,包括咱們很熟悉的Cortana,一樣可以爲咱們帶來更天然高效的輸入體驗。
HoloLens的語音識別分爲三個部分:
三個組件中語音命令特性最爲經常使用,配合凝視可以完成絕大部分場景的需求。爲了使用語音命令,首先要啓用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(); } }
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,他們無疑會是將來市場的引領者,而目前也是咱們學習的黃金階段,可以迎頭遇上這波浪潮,對於相關從業者具備重要的意義。