2017 年 2 月

第 32 卷,第 2 期

本文章是由機器翻譯。

HoloLens - 從虛擬實境移至混合實境

Tim Kulp

虛擬實境 (VR) 是所有的消息,以及開發人員會競爭以建立內容。好時機,混合的現實 (MR) 正在開始 spark 開發人員的想像力,讓我們重新思考如何進行數位世界互動與真實世界。MR 提升從此以後,您將需要將 VR 應用程式帶到新的平台。在本文中我將探討如何更新上 HoloLens MR VR 應用程式 — 而不用重寫整個圖表。

在 9 月期的 MSDN Magazine,我建置了稱為 Contoso 旅行 VR 應用程式 (msdn.com/magazine/mt763231)。若要查看其中使用 VR 對應世界各地出差員工 Contoso 旅行部門允許此應用程式。應用程式的概念是針對使用者有不只一大堆 pin 地圖上的介面提供沉浸式體驗。在應用程式,每個旅行者會以顯示該人員的旅行目的地和時間的顯示圖片。我知道使用者探討 avatar,則允許使用者選取以顯示旅行者的詳細資料] 對話方塊視窗顯示圖片時使用視線偵測。

開始之前

本文假設您已完成部分讀取 HoloLens 開發,例如 Adam Tuliper 年 11 月 MSDN 雜誌文章 < (msdn.com/magazine/mt788624) 或在 HoloLens 學院教學課程 (bit.ly/2gzYYr6)。具體來說,這篇文章將著重在使用視線、 筆勢和語音,因此您可以檢閱這些發行項,因為我不會進入該內容中提供的詳細資料。本文也假設您已閱讀我年 9 月的文章,因為它是我將此處介紹的起始點。

若要開始,從 GitHub 下載 vr_travel 的程式碼 (bit.ly/2fXiqy2)。這是我在本文中從啟動的程式碼基底。

虛擬實際上與。混合的事實

在建置適用於任何平台應用程式時,務必了解該平台的特點,並採用特定平台提供的值。例如,如果沒有任何 Web 應用程式和行動應用程式之間的差異,為什麼會您曾經優先選擇? 索引鍵是要提供每種平台不同的功能為基礎的值。索引鍵強度 VR,是,使用者只經歷耳機中可以看見。其他國家淡出為傳送給使用者的內容是專用於真實世界。這可讓建立令人讚嘆的世界不存在於現實世界中,或防止注意力從任何應用程式的內容。VR 讓使用者在其他地方。使用它來找出您的經驗中的使用者。商務應用程式的觀點而言,這可能是其中的所有使用者完成的活動已都限制為中心的作業平台話務中心案例。

因為它會結合整體使用經驗的真實世界虛擬世界先生,相較之下,是世界在內。成功 MR 擴充現實世界裡,使用虛擬的內容。當您要讓使用者能夠同時仍能體驗他們使用您的世界中,請使用 MR。例如,在辦公室,MR 可以用來顯示一律會存在,例如服務中心行事曆連線至 Outlook 或代表全像攝影版的連絡人卡片連絡人現代近來的內容。撰寫軟體等項目的實際監視器上的使用者工作時,這些粗製濫造能同時存在。工程師可以使用粗製濫造來查看 [全像攝影版的表示法,他們所設計的模型在其電腦上時處理的模型。辦公室的員工無法擴大他們工作區,而不想堆使用的實體的項目。

Contoso 旅行的我想讓使用者能夠看見其旅行者所在位置,在任何時間的內容。這使用者可以執行其他工作 (例如預約旅遊行程),在監視器上的側邊的快速瀏覽時,會顯示在任何時間的人的桌上的全是理想。旅遊預約系統很複雜,而且不是像您會想要重建 VR,但加強現有系統的旅行者 MR 對應是完美的解決方案,而不需要佔用使用者的實體工作區中啟用一眼的更新。

準備混合現實

HoloLens 開發通常牽涉到許多相同的工作,例如偵測視線、 筆勢和語音,不論您要建置的應用程式類型。所幸,Microsoft 已建置可協助您直接跳到 HoloLens 開發的程式庫。HoloToolkit (bit.ly/2bO8XrT) 提供的絕佳起點。下載 HoloToolkit,並將它轉換成 Unity 套件,您可以匯入 HoloLens 專案的 GitHub 上依照指示 (bit.ly/2ftiOrY)。

準備就緒,Unity 封裝開啟 vr_travel 程式碼基底,並匯入 HoloToolkit HoloToolkit 與封裝使用資產 |匯入套件 |自訂套件。瀏覽至您儲存 HoloToolkit 封裝並選取匯入。Unity 會顯示 [匯入封裝] 對話方塊,顯示所有封裝的不同元素。本文我匯入的範例專案以外的所有內容。如果您想要包括在您的專案,可自由,因為它們可提供範例程式碼,可能會很有幫助。按一下 [匯入 HoloToolkit 套件提取至 vr_travel 專案準備好時。匯入完成之後,您會注意到您的專案檢視名 HoloToolkit,以及新的 HoloToolkit 項目在功能表列可讓您存取某些有用的 HoloLens 特定功能的 Unity,例如自動套用至場景或 HoloLens 上執行應用程式的專案設定新的資料夾 (請參閱**[圖 1**)。

HoloToolkit 功能表
[圖 1 HoloToolkit 功能表

即使您正在更新應用程式以 HoloLens 的應用程式,您可能想要保留您的世界 VR 版本。為了維護 VR 世界,將主畫面儲存為新場景,使用 [檔案 |儲存場景,並呼叫新的場景 main_mr。  如此一來,您就可以維護工作完成 VR 世界時建立新的 MR 世界。此外,元件,例如旅行範本或差旅管理員中變更程式碼時,以及新 MR 應用程式將會更新 VR 應用程式。

現在,設定您的專案,請前往 HoloToolkit 是 HoloLens 專案 |設定 |適用於 HoloLens 專案設定。這會更新您的組建和其他專案設定,使應用程式準備好進行 HoloLens。藉由設定應用程式設為 HoloLens 專案,相機會自動設定為在 HoloLens 上運作。唯一的變更,您可能要從這裡是設為黑色的背景,而不是使用天空盒紋理天空盒。HoloLens,在任何純黑色無法轉譯為虛擬物件。例如,您可以使用黑色背景讓背景變成透明,允許透過顯示真實世界。

移除天空盒和專案設定,是從與介面會浮動在 void 旅行者。位置的位置,您可以在其中檢視世界各地,但請記住,在應用程式中 HoloLens 相機攝影機代表位置的裝置。規劃相機根據您想要的使用者體驗到啟動,而且考慮觀景窗移動到整個環境的方式。VR 應用程式,請在播放程式是受限於控制器可讓它們執行。HoloLens 應用程式中,您必須仔細思考的方式 HoloLens 可以移動整個世界並適當地規劃為使用者提供最佳的體驗。

就地相機,您即可在 HoloLens 中測試。移至 [檔案 |建置設定,以便為您主要的場景 main_mr 場景。按一下 [新增 main_mr,加入開啟場景,然後取消選取要移除清單中的內建的場景主要的場景。這可讓您建置適用於 HoloLens 的場景。您可以從這裡建置,但相反地,我們要使用 HoloToolkit 建置視窗。開啟 HoloToolkit |建置視窗 (請參閱**[圖 2**),可讓您自訂 HoloLens 應用程式的建置和部署。

HoloToolkit 建置視窗
[圖 2 HoloToolkit 建置視窗

使用預設設定,然後按一下 [建置 Visual Studio SLN。這會建立您在 Visual Studio 中開啟,並部署到 HoloLens 裝置的解決方案。當您完成部署到 HoloLens 模擬器或裝置時,您會發現您所見的平台和大型負載旅行者] 按鈕,但您無法實際會執行任何動作。讓我們進行一些變更,以允許使用者載入旅行者。如果您需要協助您建置專案時,請參閱 HoloAcademy 上的 「 粗製濫造 100 」 (bit.ly/2bxVOoe) 或 「 粗製濫造 101",以便部署至裝置 (bit.ly/2bhqsiV)。

新增的視線和筆勢

在前一篇文章中建立的虛擬實境世界有某些互動性,現在讓我們來重現的。第一個 interactable 加入 VR 專案時載入旅行者] 按鈕。HoloLens 使用者,讓該工作。若要開始,建立新的空白遊戲物件管理員呼叫。(附註: 我將合併所有我 「 主管 」 為單一物件,需要新增元件,例如 Gaze 管理員,筆勢 Manager 等等的中央位置。這種集中化方便尋找經理場景十分複雜,而且它簡化了管理員元件之間的存取。)

選取的管理員,按一下 [新增元件,並搜尋 Gaze 管理員。這可讓攝影機提供視線資訊至應用程式,以便您可以偵測使用者的檢視互相衝突的物件。在 MR 視線運作方式很類似設定 VR 視線程式碼。相機專案 raycast 和偵測到該 raycast 是否與 interactable 的物件。Gaze 管理員元件是預先建置 HoloToolkit 中,並且可以新增為元件由右至管理員物件。

虛擬和混合現實開發的關鍵 UI 項目是要提供有關哪些使用者目前正在查看的視覺化回饋。若要這樣做,您需要建立資料指標,和 HoloToolkit 有一個可供使用。在專案資料夾中,移至 HoloToolkit |輸入 |Prefabs |資料指標。將此 prefab 拖曳至階層架構。這將會加入使用者尋找的位置,幫助使用者無法取得遺失看著場景,它們會追蹤在場景的資料指標。

您可以做出回應按下按鈕之前,您需要知道使用者是否看一下。按鈕是因為它沒有 collider raycast 不會回應的 Unity 畫布按鈕。加入 btnLoad 物件的方塊 collider btnLoad 階層,然後加入元件上即可。選取物理 |方塊 Collider,然後按一下 [編輯 Collider。這可讓您調整按鈕的 collider。設定按鈕的寬度等於 X 座標和 Y 小數位數等於按鈕的高度。本文我將會保存 UI 非常簡單,但有很的多,您可以為 HoloLens 建立豐富的 UI。簽出 Surya Buchwald 文章中,「 以 HoloLens 的調整 UI 」 (bit.ly/2gpfGue),說明如何建立可調整的 UI 設計團隊可以控制而不需要開發設定。

現在準備好要回應的視線] 按鈕。這需要加入 OnGazeEnterEvent 和 OnGazeLeaveEvent,告訴應用程式在使用者查看按鈕時,以及當使用者離開查詢時,該怎麼辦。若要這樣做,請按一下 btnLoad 一次在此階層,然後加入元件。搜尋 OnGazeEnterEvent,並將它加入。然後執行同樣的 OnGazeLeaveEvent。一旦這些加入 btnLoad 時,您可以加入事件。在偵測器中,按一下加號,將事件加入 OnGazeEnterEvent。將 EventSystem 物件階層拖曳到物件欄位。這會載入 EventSystem 函式。在 [函數] 清單中選取 [EventSystem |SetSelectedGameObject。此控制哪種遊戲物件擁有焦點世界裡。將 btnLoad 拖曳至引數物件。此程式碼區塊是說,當使用者的視線進入 btnLoad,觸發程序事件系統,將 btnLoad 設為選取的遊戲物件,這會將按鈕的視覺狀態變更的反白顯示的色彩。

在 OnGazeLeave 事件中,新增的事件,就像使用所有相同的參數,但不使用 SetSelectedGameObject,引數在階層中建立新的 GameObject btnLoad OnGazeEnter 事件名為 [未選取,並設定,是引數。這會讓使用者的視線離開按鈕時,未選取的物件選取事件系統中。未選取的是預留位置物件,並不會執行任何動作,不過當使用者查詢遠離物件時,接收焦點。使用此遊戲的物件,您可以設定的遊戲物件選取或取消選取 [使用 Unity Editor,而不需要撰寫程式碼。[圖 3會顯示最後的設定,如 btnLoad 視線事件會呈現。

設定 btnLoad
[圖 3 設定 btnLoad

應用程式現在可以追蹤使用者正在尋找,並提供意見反應給使用者。現在讓我們連接空中點選以選取按鈕的能力。按一下主攝影機中階層。同樣地,按一下 [新增元件中的偵測器和筆勢 Manager 搜尋。筆勢管理員新增至主攝影機。筆勢管理員可讓應用程式知道使用者的手存在、 辨識正在使用哪種筆勢及據以採取動作的筆勢。

若要回應筆勢遊戲物件,您可以新增 OnSelectEvent 元件遊戲的物件。按一下 btnLoad,然後再加入元件,搜尋上選取事件,並將元件加入至按鈕。點選時,偵測到筆勢管理員或操作動作就會發生,並使用 GameObject.SendMessage("OnSelect") 觸發選取時事件元件。與這個問題是 UnityEngine.UI.Button 物件已經有選取時事件 (用來啟用按鈕的反白顯示),因此 GestureManager 傳送選取時訊息給按鈕,當現有的按鈕選取時事件就會觸發。若要避免有兩個選取時事件的衝突,重新命名為 OnTapEvent 的 HoloToolkit OnSelectEvent。OnSelectEvent.cs 檔案中 (下 HoloToolkit |輸入 |指令碼),更新 OnTap 選取時方法,並將類別重新命名為 OnTapEvent。

存在的另一個挑戰按鈕是 OnClick 事件不是透過編輯器] 中存取的事件。若要觸發 click 事件,您必須呼叫 Invoke Click 事件。若要這樣做,請建立新的指令碼專案中 |指令碼資料夾中名為 ButtonInteractable,,如下所示︰

public class ButtonInteractable : MonoBehavior {
  public void Click()
  {
    var btn = GetComponent<UnityEngine.UI.Button>();
    btn.onClick.Invoke();
  }
}

按一下階層中的 btnLoad 物件,並新增 ButtonInteractable 元件。OnTapEvent 元件,將 btnLoad 拖曳物件,然後選取 [函式,底下的 [ButtonInteractable |按一下 []。這會設定 OnTap 事件來觸發 OnClick 事件。在此專案中按鈕未做許多事的 click 事件,但在較複雜專案中按鈕的 click 事件可能會觸發許多動作。使用 ButtonInteractable 中,您可以維護按一下而未更新 OnTap 事件的行為。

現在已連線的負載旅行者按鈕,以建置 HoloLens 應用程式並立即試用。當您在負載旅行者按鈕 gaze 它會變成綠色。離開] 按鈕會將它傳回其狀態為 normal。使用空中點選,會載入旅行者,並讓使用者無法重新載入旅行者停用按鈕。現在讓我們更新才能使用視線和筆勢旅行者。

更新旅行者

旅行範本物件是用來產生應用程式中的新旅行者 prefab。在範本上的兩個指令碼元件 — 旅行者互動和 VR 互動式項目。VR 互動式項目接收到的事件觸發程序狀態,例如 (當使用者查看互動式項目),透過 Out (當使用者離開看起來) 與按一下 (當使用者按下 VR 裝置引發按鈕)。這些直接對應到輸入 Gaze、 Gaze 保留和上點選。一些快速元件的加入和旅行者就可以使用。

Prefab 旅行範本上,新增下列元件︰ OnGazeEnterEvent、 OnGazeLeaveEvent 和 OnTapEvent。中所示**[圖 4**,OnGazeEnterEvent,將函式的 select VRInteractiveItem TravelerTemplate 物件 |移轉。除了選取 VRInteractiveItem OnGazeLeaveEvent] 執行相同 |函式外。這可讓 「 移轉 」 和 「 向外事件 VR 互動式項目。最後,在點選事件,將 TravelerTemplate prefab 入物件。對於函式中,選取 [VRInteractiveItem |按一下 []。這個快速的設定會將您 VRInteractiveItem HoloLens 視線和筆勢功能。

旅行者範本中加入元件和函式
[圖 4 旅行者範本中加入元件和函式

此時,Contoso 旅行 HoloLens 應用程式具有相等的虛擬實境應用程式的功能。現在您可以利用 HoloLens,可讓您從 VR 裝置不同的功能。若要開始,我將實作語音,因此我可以載入旅行者,而按下按鈕。

做為另一個輸入機制語音

在傳統 VR 應用程式中輸入限於視線、 方向鍵及引發按鈕 (適用於 Samsung 齒輪 VR 類似的裝置)。使用 HoloLens 有多個其他輸入的類型,例如語音,可以建立很自然的使用者介面。語音是絕佳的工具,可提供動作的使用者捷徑。而不是透過空氣點選觸發] 功能表上,使用者只需說要執行什麼動作。您可以語音命令使用中選取特定的遊戲物件時才或進行一律尋找系統的通用命令。

若要開始使用語音,我接聽使用者說出 「 負載旅行 」,以避免需要按一下 [載入旅行者] 按鈕。好的開始了解的語音的互動是 Adam Tuliper HoloLens 文章 (稍早所述),他會在其中提供簡介實作語音命令。此應用程式中,我會將新元件加入至管理員物件套用語音命令。在階層中,按一下 [管理員 |新增元件,然後搜尋 KeywordManager。一旦加入關鍵字管理員,展開它,設定辨識器啟動 = 自動啟動,所以與該應用程式啟動的辨識器。然後展開關鍵字與回應區段,並將大小設定為 1,將關鍵字。輸入 「 負載旅行者 」 為關鍵字,然後進行連線 btnLoad 和 ButtonInteractable.Click 事件函式。這會模擬按下按鈕時使用者講的是 「 負載旅行者 」。

您可以在旅行者,以及連接關鍵字。TravelerTemplate prefab 上按一下 [啟動和停用上點選事件。將功能加入 Gaze 輸入事件啟動上點選事件,然後將函式新增至 Gaze 保留事件,以停用上點選事件。這項設定可讓您只顯示旅行者詳細資料的視線與 TravelerTemplate。接下來,更新的大小為兩個關鍵字管理員,並將新的項目 」 是誰。 」 然後拖曳 TravelerTemplate 物件,並選取要 VRInteractiveItem 函式 |按一下 []。這會開啟 [旅行者資訊] 對話方塊。

在 Unity 中這些次要的組態變更,可讓您啟用混合的實現應用程式中的語音。當您思考辦公室位置人員可以使用鍵盤或滑鼠,語音就變成功能強大的輸入的裝置的使用者使用其完整的手。

從這裡的位置

HoloLens 和 MR 提供許多應用程式的可能性。在這裡,我擴充語音我 VR 應用程式,但我甚至更多空間音效與對應。想像一下繫結至辦公桌的差旅應用程式,或有旅行者的使用者與使用者旅行計畫變更時。請考慮如何混合輸入的系統,例如筆勢、 視線,並提供豐富、 有趣的介面,結合空間音效和對應時的語音。

如您所見,VR 應用程式可以移轉至 MR 應用程式,而不需要太多程式碼,因為 Unity 組態性質。這樣可以節省開發人員時間和金錢將他們的應用程式從行動 VR 平台轉換成與 HoloLens MR 時。需要什麼了這裡開始,進一步探索 HoloLens 學院,要套用至應用程式的下一步 MR HoloLens 的更多的功能。

更新的 JSON 物件程式庫

根據您使用的 JSON 物件程式庫版本,您可能需要更新 JSONTemplate.cs 檔案。在您的專案資料夾中移至 JSON/JSONTemplate.cs 並更新第 19 行所示︰

FieldInfo[] fieldinfo = obj.GetType().GetFields() 
  as System.Reflection.FieldInfo[];

這項更新可讓您編譯專案,以在 HoloLens 上執行。


Tim Kulp是 bwell 巴爾的摩,好在主體工程師 他是 Web、 行動和通用 Windows 平台應用程式開發人員,以及作者、 複製、 dad 和 「 wannabe Mad 科學家 Maker。 」 找到他的 Twitter: @seccode或透過 LinkedIn: linkedin.com/in/timkulp

感謝下列 Microsoft 技術專家來檢閱這份文件︰ Adam Tuliper