2016 年 11 月

第 31 卷,第 11 期

本文章是由機器翻譯。

HoloLens - HoloLens 簡介

Adam Tuliper | 2016 年 11 月

這是新創新的裝置是令人興奮的年份。它具有稱為虛擬實境 (VR) 的年份,增強現實 (AR),以及一些非常值得注意和企盼裝置已經開始傳送,包括 HoloLens、 HTC 和 Oculus Rift CV1。John Riccitiello,CEO 的 Unity 技術,稱為 AR/VR 的︰ 「 就是令人讚嘆它真的變更任何項目,因此一次在-a-代技術 」 和我話更加深信不疑。HoloLens,從 Microsoft 取得,令人雀躍的新裝置都可以混合組成實數及虛擬世界。

什麼是 HoloLens?

HoloLens 是輕鬆停留在頭 untethered、 完全獨立的 Windows 10 電腦。這就是所謂的混合式的實際裝置,嘗試 blend 實數及數位世界的裝置。您會看到置於世界的物件看起來和 — 累積到 — 作用如同它們在真實世界。相反地,VR immerses 您的環境中,您通常沒有看到任何項目周圍您,但該虛擬世界。您通常不以視覺化方式曉得真實世界的 head 掛接顯示器 (HMD) 之外。  這種經驗花費時您坐在辦公室椅子飛行外部空間中。和 AR 嘗試增強世界您額外的資料,例如標記或 heads-up 可能與您的部署位置相關的資訊。某些 AR 耳機只會擲回文字和影像重疊任何您想在螢幕上。

使用 HoloLens,即可將應用程式和物件到您了解您環境的世界。如果您想要釘選到牆或中間空中數位螢幕,例如應用程式中所示 [圖 1, ,沒問題。這類應用程式鎖定,即使您保留您的空間,然後再回來隔天的日期。我要經常離開虛擬 windows 開啟在其他房間,要我天後回來它們仍然存在時就會很訝異。但不止於此,假設您想在您可以帶著檢查客廳站您面前 (包括上升在標頭的頂端尋找沙發上) 的基本架構。同樣地,沒問題。卸除虛擬 3D 物件,例如球,稱為 「 全像 — 到您的世界,它會落和叫用您真正的資料表,並停止。移動資料表,而且將會落球,並叫用您實際的最低限度。HoloLens 了解您的世界,大部分都是絕對訝異他們試試 (雖然我還在等能夠下載到我的大腦是一隻 Fu) 的第一次。

牆上的應用程式
[圖 1 牆上的應用程式

在本文中我要探討 HoloLens 開發環境和輸入三個要件 — 視線、 筆勢和語音,代表與 HoloLens 互動的主要方式。更多的 HoloLens 功能,例如空間的對應、 空間音訊和座標系統將在下一篇文章中討論。

工具和 SDK

沒有個別的 SDK for HoloLens — 它是直接的 Windows 10 SDK 的一部分。您只需要 Visual Studio 2015 update 3 + 安裝,並確定您在安裝期間核對 」 工具與 Windows 10 SDK]。您可以返回並執行 Visual Studio 安裝程式,以選取這些選項,當然,只要執行一次更新 3 (或更高版本,如果適用) 安裝程式。

HoloLens 通用 Windows 平台 (UWP) 是 Windows 10 裝置,因為執行 UWP 應用程式。沒錯,桌面、 電話及 Xbox 不僅 HoloLens 上,可能會執行任何 Windows 10 應用程式。您可以找到上取得 Windows Phone 和 Windows 市集非 UWP 應用程式並將它們在轉換的發行的指引 bit.ly/2c3Hkit。為了確保 UWP 應用程式會出現在 Windows 市集,請確定您已有 Windows 開發人員中心的 HoloLens 裝置系列發行您的應用程式時,所示 [圖 2。在此情況下,與任何平台上的任何應用程式,您必須確定您的應用程式看起來很好您的目標,在特定裝置上為不同的裝置有不同的解析度與記憶體功能。

確保 Windows 開發人員中心提交支援 HoloLens
[圖 2 確保 Windows 開發人員中心提交支援 HoloLens

開發全像攝影版的應用程式的兩個選項,可以充分 HoloLens 功能的設定,為 DirectX 和 Unity。您也可以建立一般的 UWP 應用程式使用 C# 和 XAML,它會執行為 2D 應用程式上 HoloLens 但不會卸除空間中的所有大約粗製濫造的能力。專案範本中有 Visual Studio,可顯示粗製濫造,全像攝影版應用程式中所示 [圖 3。請確定符合先前的需求,或可能不會看到可用的範本。Unity (HoloLens 我偏好的開發環境) 中的 HoloLens 技術預覽 (HTP) 建置在其網站上提供現成的有支援 bit.ly/2bBZsNn

HoloLens DirectX 範本
[圖 3 HoloLens DirectX 範本

不過,有些時候,您必須接觸 Visual Studio 中,即使您使用 Unity,不過開發經驗都與使用純 DirectX 相當不同。部署至 HoloLens 透過 Visual Studio,可透過本機 USB 連線,遠端連線或模擬器中所示 [圖 4

不同的方式,將部署至 HoloLens
[圖 4 將部署到 HoloLens 的不同方式

文件呢? MSDN 長久以來一直為開發人員,但年新增項目變得更加困難,若要尋找您所需的支柱。現在文件是完全重做使用在 docs.microsoft.com。HoloLens 小組想要絕佳及其文件,您應該能夠找到大部分的情況下,在同一個地方在 bit.ly/1rb7i5C。如果您發現有所遺漏,可讓 HoloLens 小組知道。我們是在新紀元讓許多事情好在 Microsoft,並 HoloLens 小組正協助造成良好且深入的文件的方式。

硬體 HoloLens 顯示 60 FPS,所以一定要確保您的經驗執行在此畫面播放速率。您也要確保您保持在裝置的記憶體需求 (如撰寫本文中,這會表示 900 MB 的 RAM 可用應用程式)。如果您是新手開發圖形化的體驗,很容易抓取任何圖案資產,並將它放在場景中。您可能會認為,「 我可以抓取我縣 (市) 的 3D 模型和拖放到我的場景,瀏覽其內容 ! 」 但是,這可能會在任何平台上造成問題。請記住大多數的遊戲實作許多技巧來減少繪製呼叫、 occlude 幾何,顯示較低解析度模型進一步處理掉 (呼叫層級的詳細資料或 LOD) 及其他資源,而 HoloLens 也不例外。效能建議會列在 bit.ly/2besJxQ。最佳化的一些範例可以在 「 最佳化您的遊戲 」 模組中看到 bit.ly/2dBqMxw

模擬器 HoloLens 模擬器可以讓您在開發過程中很遠。技術上來說,您不需要進行開發經驗,HoloLens 就像您不需要開發電話的電話。在某個時間點,不過,將會很明顯地想要在裝置上測試。模擬器可以模擬筆勢、 前端的位置和語音,但它有限制。第一,當您在模擬器中,看到真實世界各地您粗製濫造為 [圖 5 所示,雖然您可以將著色器指派給您空間網狀結構,將在下一篇文章中討論。

使用 HoloLens 模擬器
[圖 5 使用 HoloLens 模擬器

有四個預先定義的空間模型,您可以在模擬器中選取。因為在頭上沒有 HoloLens,模擬器必須知道聊天室,看起來像是 3D 的立場。我要跳躍繼續進行下一個發行項一點,但 HoloLens 了解您周圍的空間,並持續更新空間,了解所示 [圖 6。「 幕後 」 檢視 HoloLens 的看到是載入預設在模擬器中,就會顯示在 Windows 裝置入口網站,您可以存取在模擬器或實際的 HoloLens 裝置的空間。您可以將儲存空間模型,您已使用 HoloLens 掃描並載入到模擬器中,這表示您也可以開發使用 HoloLens 或多個執行個體的模擬器,模擬器的多使用者體驗,並可載入在可以開始測試您自己自訂的房間。

顯示在模擬器中載入預設的空間模型
[圖 6 顯示在模擬器中載入預設的空間模型

全像攝影版的 Windows

Windows 10 包含 Windows 全像攝影版的平台 Api 跨桌上型電腦、 行動和 Xbox。它是透過這些 Api,您可以與之互動 HoloLens 不僅其他未來的裝置,也包括其他供應商,例如 Intel 的新專案合金 untethered 的耳機、 HTC、 Qualcomm,以及許多其他的計劃。某些 Api 的 Windows 全像攝影版可以找到下列新的命名空間 (建議您查看這些元件,以了解一些基礎類別和結構) 中︰

有三個要件的輸入上 HoloLens — 視線、 筆勢和語音和這些是什麼我將著重在現在。如果讀過我先前的發行項上開發遊戲或觀賞我的線上影片的任何 Microsoft Virtual Academy 的之後,您知道我是很喜歡遊戲引擎 Unity,使程式碼範例,請遵循 Unity C# 為基礎。

視線本質上是 HoloLens 其中是,雖然它是最簡單的方式在頭上時,請將它。若要了解哪些視線表示,我們來看 Windows.Perception.People 命名空間內 HeadPose 類別,其中包含三種 Vector3 類型 (Vector3 結構包含只 x、 y、 z 單一值)︰

  • ForwardDirection: 取得 HoloLens 的向前方向。
  • 位置︰ 取得 HoloLens 的位置。
  • UpDirection: 取得註冊 HoloLens 的方向。

這項資訊可讓您判斷使用者,以及他們所需要的方向。當應用程式啟動 HoloLens 上時,開始位置是位於 0,0,0。從該位置就可以輕鬆地判斷使用者位置及哪個方向移動。讓我們來看看如何偵測到的物件看起來的使用者第一次。這個需求是此物件具有它偵測到,collider 元件,在 Unity 中只是一般新增至任何物件。在 Unity 中,而不是 HeadPose,您只要使用 Camera.main 資訊,這 (幕後) 會對應到 HeadPose。如果您經常在 Unity 中使用相機,執行任何動作就會不同。利用此資訊,您可以限定看不見的箭號,並找出它叫用 (3D 程式設計中稱為光跡轉型中常用的技巧)。只要遊戲的物件,例如 cube 中包含 Interactible 指令碼 ([圖 7) 它和另一個個別空遊戲物件 InteractibleManager ([圖 8) 上。

[圖 7 Interactible 類別

public class Interactible : MonoBehaviour
{
  // The materials we’ll set to highlight.
  private Material[] defaultMaterials;
  void Awake()
  {
    // Get the materials from our renderer.
    // A material contains a shader which lights/colors object.
    defaultMaterials = GetComponent<Renderer>().materials;
  }
  void GazeEntered()
  {
    for (int i = 0; i < defaultMaterials.Length; i++)
    {
      // This assumed we're using a shader that has a Highlight
      // property, as does the Custom/SpecularHighlight one
      // from Holograms 210. This adds lighting color to it
      // to "highlight" it.
      defaultMaterials[i].SetFloat("_Highlight", .25f);
    }
  }
  void GazeExited()
  {
    for (int i = 0; i < defaultMaterials.Length; i++)
    {
      defaultMaterials[i].SetFloat("_Highlight", 0f);
    }
  }
}

[圖 8 InteractibleManager 類別

public class InteractibleManager : MonoBehaviour
{
  private GameObject lastHit;
  // Every frame see if we are looking at a HoloGram (i.e. a game object).
  void Update()
  {
    RaycastHit hitInfo;
    if (Physics.Raycast(
      Camera.main.transform.position,
      Camera.main.transform.forward,
      out hitInfo,
      10.0f,
      Physics.DefaultRaycastLayers))
    {   
      // The game object we've hit.
      var tempGO = hitInfo.collider.gameObject;
      // See if this object contains our Interactible class.
      if(tempGO.GetComponent<Interactible>() != null)
      {
        lastHit = tempGO;
        // Loosely coupled way to call a method in Unity on our g.o.
        lastHit.SendMessage("GazeEntered");
      }
  }
  else
  {
    // No object detected in Gaze, lets deselect the last one.
    if(lastHit!=null)
    {
      lastHit.SendMessage("GazeExited");
      lastHit = null;
    }
  }
  }
}

我要呈現只是此處的主要概念的概觀。您會發現更多詳細資料中粗製濫造 210,視線 Holographic Academy 課程概念,包括穩定前端的位置,以選取物件時,避免不穩定的移動 (bit.ly/2b9TWlR)。簡單地說,Camera.main 是 HoloLens 位置。您進行疑難排解您看不見的光跡從此位置來尋找您所遇到的第一個 collider Camera.main.forward 方向。如果您發現項目,只需要是反白顯示該設定將會使用著色器變數。例如在 [圖 7, ,我使用從粗製濫造 210 著色器,只會 _Highlight 值設定為.25 時選取。也可以使用標準 Unity 著色器,並設定發出色彩的亮度,就像這樣︰

defaultMaterials[i].SetFloat("_EmissionColor", Color(0,0,0,.2f);

您必須要注意的著色器 HoloLens 的效能造成影響。此裝置,而令人驚訝,受限於其大小,而且通常與硬體的情況。幾乎所有經驗和遊戲進行今天都有配置最佳化,時間,HoloLens 並無不同。開發時使用 Unity HoloLens,您會想要執行第一件事是交換出最佳化的變異位於在 HoloToolkit 著色器 bit.ly/2bO6cH2。 

HoloToolkit 包含許多協助程式函式和物件,可大幅協助 HoloLens 開發,包含資料指標、 gaze stabilizers、 軌跡和交給經理、 平面偵測器,遵循-我的指令碼,在多個 HoloLens,以及其他等等之間共用的範例。大部分的這項功能是在 HoloToolkit unity bit.ly/2bO8XrT, ,因此請確定您查看在正確的儲存機制和不只是在基本的 HoloToolkit bit.ly/2bPCbas, ,它會不過,在它自己的權限時很有用,其中包含各種獨立範例專案和 HoloToolkit Unity 會利用其他程式庫程式碼。

 當您必須不在可檢視區域中的物件時,可將它遊戲畫面、 VR 艾利斯或混合的現實,最好提供小型的標記,來告訴使用者他們可以尋找物件便會開始看起來了,如所示,如果哪些方向 [圖 9。這是很常見的技巧,在許多視訊遊戲中,而且很混合的現實世界中非常有用。

顯示方向性指標
[圖 9 顯示方向性指標

中的程式碼 圖 10 可用來判斷特定的全像圖是否為可見。

[圖 10 決定如果全為可見

[Tooltip("Allowable percentage (to 30%) inside the holographic frame to continue to show a directional indicator.")]
[Range(-0.3f, 0.3f)]
public float TitleSafeFactor = 0.1f;
// Determine if sgame object is visible within a certain percentage.
// The Viewport is 0,0 to 1,1 (bottom left of screen to top right).
private bool IsTargetVisible()
{
  // This will return true if the target's mesh is within the Main
  // Camera's view frustums.
  Vector3 targetViewportPosition =
    Camera.main.WorldToViewportPoint(gameObject.transform.position);
      return (targetViewportPosition.x > TitleSafeFactor &&
      targetViewportPosition.x < 1 - TitleSafeFactor &&
      targetViewportPosition.y > TitleSafeFactor &&
      targetViewportPosition.y < 1 - TitleSafeFactor &&
      targetViewportPosition.z > 0);
}

一旦您知道如果物件不會顯示 (或僅能勉強可見),您可以找出顯示方向性指標的方向。由於您擁有存取鏡頭位置和遊戲物件的任何位置,很容易以找出即將與全像圖比較使用者正在尋找的位置。若要取得方向向量,代表特定的遊戲物件從相機箭號會減去另一個位置,並正規化,使它以一 (它是最簡單的多個計算中使用正規化的向量),就像這樣︰

Vector3 camToObjectDirection =
  gameObject.transform.position - Camera.main.transform.position; 
  camToObjectDirection.Normalize();

顯示方向指示需要幾件事必須設定,但這 gist 的功能。一旦您知道要全像圖的方向從 HoloLens (也就是數位相機),您可以在螢幕上顯示的指標。您可以看看這項功能,更深入 bit.ly/2bh0Hz7

筆勢是下一步的方式來處理輸入 HoloLens。手動、 控制站或語音命令來執行筆勢。透過其中一個內所謂的筆勢框架中,延伸檢視區域全像,讓您將手更接近您的本文,而不是把它的所有邊緣對齊廣闊的前方相機掃描的手勢每次解決辦法。您通常不點選粗製濫造,但改為點選並判斷哪些使用者正在看著透過視線。

HoloLens 支援兩種筆勢。第一個包含離散的筆勢,例如單一的快速動作,如所示的空中點選 [圖 11, ,按一下包含藍芽 clicker,說出命令 「 Select 」 或甚至連點兩。第二種類型包括連續筆勢,這發生在一段時間,並且通常會觸發時您按住,然後將您手裡。連續的筆勢支援巡覽及管理。瀏覽筆勢可讓您 0,0,0 的開始位置 — 即啟動筆勢的任一處,然後都受限於虛擬 cube 空間,可讓您將從-1 1 該 cube 內的任何軸上提供 (還有其他使用案例) 中,平滑繞一或多個軸或平滑捲動。處理筆勢,而不是虛擬 cube,以限制允許 1:1 之間移動雙手及粗製濫造 — 考慮幾乎繪製或放置粗製濫造周圍環境; 不錯流暢的動作您世界相對位置中取得資訊 x、 y、 z。

空中點選
[圖 11 空中點選

身為開發人員,您可以當然,攔截到筆勢,像空氣點選維持,瀏覽和管理。目前不支援自訂的軌跡,但您需要透過上述的筆勢的詳細資料的存取權。您也可以追蹤手動 (當處於就緒狀態或已按下的狀態) 置於 x、 y、 z 和了解手中時,或離開筆勢框架,可以提供有用的回饋給使用者時感到即將離開筆勢框架。

圖 12 GestureManager 類別

public class GestureManager : MonoBehaviour
{
  private GestureRecognizer gestureRecognizer;
  void Start()
  {
    gestureRecognizer = new GestureRecognizer();
    // We can register here for more than just tap (ex Navigation).
    gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap);
    gestureRecognizer.TappedEvent += (source, tapCount, ray) =>
    {
      // A tap has been detected.
      // Raycast using the provided ray and get the hit game
      // object and perform some action on it as was done previously.
    };
    gestureRecognizer.StartCapturingGestures();
  }
  void OnDestroy()
  {
    gestureRecognizer.StopCapturingGestures();
  }
}

您可以將類似的 GestureManager 類別 圖 12 登錄點選事件,可讓您知道,比方說,當使用者執行透過選取語音命令、 控制器或手的形狀 (不論他們的點選其中) 下的手勢。然後,您需要判斷哪些查看當使用者點選,就像先前執行方法。請務必注意,在 TappedEvent 圖 12 傳入代表標頭的事件發生所在的光線。如果是快速磁頭移動,您會想要確保您 raycast 從視線,是當使用者點選時,不會在事件抵達時,這可能會稍微從原始位置。

HoloLens 上的語音命令 Cortana,透過在系統層級支援,但也共用其他 UWP 應用程式時,相同的語音引擎,因此需要 [麥克風裝置功能,在專案的 package.appxmanifest 檔案。音訊處理是硬體加速,並提供以 48khz 16 khz 24 位元的使用者的語音和環境的環境的音訊資料流。內建 Cortana 命令包括 「 選取 」 的 「 嘿,Cortana < 命令 > 」,而且應用程式內的命令包含 「 選取 」 (而不是空中點選) 和 「 放置 」。

自訂語音命令的回應是可能明瞭。只要加入關鍵字,並委派來執行,並開始接聽,程式碼中所示 圖 13

[圖 13 加入關鍵字和委派程式碼

public class SpeechManager : MonoBehaviour
{
  KeywordRecognizer keywordRecognizer;
  Dictionary<string, System.Action> keywords =
    new Dictionary<string, System.Action>();
  void Start()
  {
    keywords.Add("Reset level", () =>
    {
      // Call the OnReset method on every descendant object to reset their state.
      this.BroadcastMessage("OnReset");
      // We could also do a full-level reload via
      // SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    });
    // Tell the KeywordRecognizer about our keywords.
    keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
    // Register a callback for the KeywordRecognizer and start recognizing!
    keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
    keywordRecognizer.Start();
  }
  private void KeywordRecognizer_
    OnPhraseRecognized(PhraseRecognizedEventArgs args)
  {
    System.Action keywordAction;
    if (keywords.TryGetValue(args.text, out keywordAction))
    {
      keywordAction.Invoke();
    }
  }
}

所要做語音轉文字聽寫還是可以使用,也使用 DictationManager 類別來取得 DictationHypothesis、 DictationResult、 DictationComplete 和 DictationError 事件。請注意這需要 WiFi 連線。我同事 Jared Bienz 已新增文字轉換語音,另外,您可以在 for Unity HoloToolkit 中找到一些不錯的支援。

總結

在您如何感受您混用虛擬世界和現實世界的新紀元 HoloLens 隨即開啟。開始使用 HoloLens.com 同時也要那里的注意宣告。但請密切注意下一篇文章中會討論我最愛 HoloLens 功能空間的對應。


Adam Tuliper 是住在陽光普照 SoCal Microsoft 的資深技術推廣人員。 他是 Web 開發人員/遊戲開發人員 Pluralsight.com 作者與全能的技術。找到他的 Twitter: @AdamTuliperchannel9.msdn.com/Blogs/AdamsGarage

感謝下列 Microsoft 技術專家來檢閱這份文件︰ Jackson 欄位
Jackson 欄位是 Microsoft 的軟體工程師