微軟 HoloLens 技術解謎(下):SDK 會是這樣?

作者 | 發布日期 2015 年 02 月 01 日 12:00 | 分類 Microsoft , 穿戴式裝置
HoloLens_36Kr013001

在前一篇文章《微軟 HoloLens 技術解謎(上):如何還原三維場景》 中我介紹了自己對於 HoloLens 背後的建模技術的看法,雖然之前在微軟的 Xbox 部門工作過,但是和大家一樣也是上週才知道 HoloLens 這個好玩的設備。當前微軟官方對於 HoloLens 透露出來的訊息非常有限,最核心的兩個組件深度傳感器以及全息螢幕的原理依然充滿著謎題。文章發表後,在微軟 HoloLens 技術解謎(上):如何還原三維場景的留言中讀者提出了一些問題。



讀者提問之「HoloLens 的深度感應器有沒有可能是基於 TOF?」

先介紹一下背景知識,市面上常見的有三種類型的深度感應器:

  • 結構光,這個技術的代表產品是 Kinect 一代,它的感應器晶片用的是 PrimeSense 家的。說句題外話,PrimeSense 現在是蘋果旗下的公司,這個領域未來一定會很精彩。
  • TOF,time-of-flight,代表產品是 Kinect 二代,由於微軟對於 One 這個單字的熱愛,它的官方名字是 Kinect One,有點混亂是吧?
  • 雙眼攝影鏡頭,代表產品是 Google Tango 以及 Leap Motion,前者配有四個攝影鏡頭,後者有兩個。

我認為 HoloLens 沒有使用 TOF 技術的原因是因為如果這四個鏡頭的位置放的是 TOF 感應器,那麼還缺少一個朝前的 RGB 鏡頭用於視訊聊天類 App。讀者提到的中間部分我認為是微型的投影機,HoloLens 使用微投在「擋風玻璃」上顯示全像的畫面。

至於這個問題的標準答案,還得等微軟發布新的訊息。

 

讀者提問之「HoloLens 能不能當 VR 用?

這個問題很好,的確可以這麼玩,NASA 與微軟的的火星合作計畫基本上是一個虛擬實境的應用,它無視了真實的環境。如果 HoloLens 可以提供調節「擋風玻璃」透光度的 API,那麼調成完全不透光時就好比戴著 Oculus Rift 的頭盔,是另一種體驗 VR 的途徑。可是朋友們,這是在浪費 HoloLens 的機能啊!

那麼,作為未來的應用開發者,應該怎樣充分榨乾它的機能呢?這是本篇文章的重點。

 

正文部分

首先讓我腦洞開一會,為大家「介紹」下 Holo SDK。按照微軟的偏好,SDK 標配的語言肯定有 C++ 和 C#,因此要進行開發,這兩種語言你至少得會一個。

然後,這個 SDK 裡有哪些功能呢?根據官方 demo 中的場景,我覺得基本功能至少有:

  • 相機鏡頭看到的圖像,即當前場景的 color buffer。
  • 當前場景的深度圖,depth map 或 z buffer。
  • SLAM 合成後的三維場景,這個場景所在的空間下文我們暫且稱為 Holo Space,它可能是以樂高方塊的形式表示,也可能是用三角形來表示。
  • HoloLens 設備在 Holo Space 中的坐標 (x, y, z)、朝向(tx, ty, tz)。
  • 手勢識別的結果,類似 HRESULT OnGestureDetected(DWORD dwHandId, DWORD dwEventId, LPVOID lpUserInfo)的樣子。
  • 語音識別的結果,類似 HRESULT OnVoiceRecognized(std::string& strSentence, FLOAT confidence)的樣子。同樣的,根據官方 demo,我將 HoloLens 應用分為三種:

1.偽全像的傳統應用

HoloLens_36Kr013002

2.針對 HoloLens 特別最佳化過的應用

HoloLens_36Kr0130033.沉浸式的真全像遊戲

HoloLens_36Kr013004

這一篇只講「偽全像的傳統應用」

這種類型的應用對於傳統開發者而言最容易上手,幾乎不需要修改程式碼,自然也不需要擁有 3D 圖形學的知識。大部分人會從這種應用入手開始 Holo 開發。

如果不需要 3D 知識就能實現 3D 的界面,那麼 3D 的效果是哪來的呢?那就是 Windows 10 引入的全像窗口管理器 —— explorer3d.exe。我們平時啟動 Windows 看到的「桌面」是窗口管理器(explorer.exe)的一部分,把「桌面」想像成三維的就行了,很簡單是吧?

一點都不簡單!

以影片播放器為例,播放器並不會直接將影片畫面顯示到桌面上,而是畫到一個暫存區域,經過一系列我不知道的步驟後,explorer.exe 再將畫面以「2D 的方式拷貝」到能被我們看到的地方。而 explorer3d.exe 用的是「3D 的方式」。

所謂「3D 的方式」就是使用 Direct3D 做一些「會的人嫌我講得囉嗦,不會的人看了還是不會」的事……

HoloLens_36Kr013005

也就是在初始化應用的時候:

  • 創建一個 3D 的矩形來表示 3D 的窗口,保存在頂點暫存 vertex bufer(可以認為是放在顯卡上的數組)
  • 創建一個貼圖 texture(可以認為是放在顯卡上的圖片)
  • 創建表示窗口平移、旋轉、拉伸值的 local_matrix(這裡的 matrix 是數學中的矩陣概念,不是電影名稱)

在應用軟體執行時:

  • 如果需要在 Holo Space 中移動窗口,那麼修改 local_matrix 中的平移值,功能與 explorer.exe 中的移動窗口類似,只是除了上下(y 軸方向)左右(x 軸方向)移動外還可以前後(z 軸方向)移動。
  • 如果需要在 Holo Space 中旋轉窗口,那麼修改 local_matrix 中的旋轉值。explorer.exe 中沒有類似的功能。
  • 如果需要在 Holo Space 中放縮,那麼修改 local_matrix 中的放縮值,功能與 explorer.exe 中按住窗口邊緣拖拉改變大小一致。
  • 如果影片內容需要更新,那麼更新 texture 為最新的內容,只有這麼做我們才能看到會動的影片。

在應用軟體退出時:

  • 釋放 Direct3D 的資源

不用擔心,這些都是 explorer3d.exe 會負責的。

細心的讀者會發現我們沒有用到一個很重要的功能:

(d)HoloLens 設備在 Holo Space 中的坐標 (x, y, z)、朝向 (tx, ty, tz)。

要解釋它我必須講解 world、view、projection 三個矩陣,還要講解矩陣的乘法以及 dot product 的公式等等,這些完全是圖形學的知識了,一時半刻講不完,我會再專門為它們寫一個系列。我打算用一句話解釋一下,explorer3d.exe 會維護一個全局的 global_matrix,它等於 world * view * projection,view 的值由功能(d)中的訊息可以得到。global_matrix 的作用就好比第一人稱射擊遊戲中的滑鼠,寫到這裡我發現把 explorer3d.exe 視為一個 3D 遊戲會簡單很多,3D 遊戲場景裡的電視機也能播放影像,其實是一樣的道理。

HoloLens_36Kr013006

總結一下,這個類型的應用軟體工程師幾乎不需要修改程式碼,由 explorer3d.exe 負責調用 Direct3D 將傳統應用的內容轉換成 3D 的貼圖。

(本文由 36Kr 授權轉載) 

關鍵字: , , , , ,

發表迴響