HoloLens的成像視野中如何做到真實物體遮擋住虛擬物體?


技術方面

舉個 Holodesk 的例子。

圖中藍綠色的全息小球被實體的碗遮住一半,這種『遮擋』在CV中叫 occlusion

被遮擋住是什麼感覺呢?我們回憶一下自己學PS的時候,如果想P一張照片去騙別人,比如和某人的合影,去某地的旅遊,往往需要你學會PS的『蒙版』功能。而這裡正是用到了 DepthWriteMask ,就像用蒙版擋住了後面的圖層一樣~

而擋住全息小球的,正是 spatial surface !在圖中就是碗的 spatial surface 擋住了全息小球的一部分

這裡用到了深度緩存(depth buffer),就是將小球的深度算出來,但是被遮擋的部分不渲染,於是有了『遮擋』的效果。

而它的目的就是讓用戶覺得:啊,原來即使我把它擋住了,全息的小球依然在那裡~從而產生 presence。

然後還有個好處就是讓用戶知道那個東西在那裡,從而很好地定位它的位置。

根據物體離攝像頭的距離算出深度信息,而不同深度的物體,就像不同圖層的畫面,相互遮擋。攝像頭離物體的距離就叫 depth buffer 。

越靠近你的深度攝像頭的物體,越優先顯示。

—————————————————————————————————————

應用方面

如果問你『你最熟悉的環境和空間是哪裡?』你肯定回答說是你經常居住的地方,正如Magic leap 那句『世界是你的新桌面。』現實中你最熟悉的交互空間就是你住的地方,你最熟悉的交互就是使用你住處的物品。而 hololens 最重要的一個功能就是將全息影像呈現在你所在的空間上,正所謂『自然人機界面。』

將虛擬的物體放在現實空間上,營造出一種它們確實在那裡的感覺。

全息影像遮擋住了在現實中物體的表面,反過來,如果讓它消失,可以讓它藏在牆或柜子的後面。

學過三維的同學都知道有個詞叫做『剛體碰撞』,因為有了 mesh ,所以虛擬物體和現實物體發生接觸時,我們希望看到它們之間『碰撞』而不是一下就『穿過去』了。不過因為技術的限制,我們現在看到的更多是現實物體對虛擬物體的影響,而很少有虛擬物體對現實物體的影響。

(圖片來自《Young Conker》)

但是,因為人不是四維動物,所以在三維中的遮擋,比如全息影像被現實物體所遮住的時候,而用戶又想與它交互的時候,他就會感覺不爽。所以,一般『藏』在真實物體後面的全息影像,我們用降低全息影像透明度的方法告訴用戶『它藏在那個物體後面』,用戶想和它交互的時候隨時可以過去找它。


可以看到的是,對手指這種移動中的物體,虛擬畫面還是會遮擋住手指的。

所以實際上很簡單,hololens在啟動的時候會對房間進行一個即時的掃描建模,在這個時候hololens理解了房間的空間結構,傢具等物體的擺放位置。所以虛擬畫面就會通過計算被某些應該會擋住它的東西擋住。這並沒有什麼根本性的技術難度。

難的是對活動物體的遮擋關係的計算和即時的渲染。

而實際上微軟在這一塊也做的差不多了,Kinect的holodesk

視頻封面微軟研發 kinect 新技術——全息桌面(holodesk)視頻

這是五六年前的效果,現在相比會更進一步。

通過紅外定位,進行深度(距離)的定位,然後幾個攝像頭即時的捕捉畫面內的移動物體,進行即時的渲染,對虛擬畫面的遮擋陰影關係進行調整,這都是可以實現的。

至於為什麼現在我們看到的hololens展示視頻並沒有很好的做到這一點,那很有可能是受限於機能,以及畫面不可避免會產生的部分延遲,性價比不高所致吧?

以後隨著CPU,GPU,HPU的性能提升,演算法的優化,遲早會做到非常真實的效果的。


這個很簡單啊 你首先要清楚3D空間在你眼前的呈現形式,是經過剪切和坐標變換渲染到2D空間的,而在虛擬的空間里,這種互相遮擋的關係,是通過深度值(比如opengl的深度測試)來實現的。

對於虛實融合和交互來說,在每一幀畫面里,不管是眼睛還是渲染桌面,最終呈現到眼鏡的方式都必須是2D。所以Hololens之所以可以知道桌子等對於虛擬物體的遮擋,就在於它掃描並定義了實際的空間深度映射(由實際到虛擬的過程)。也就是說它是知道桌子的深度值的。這樣,渲染輸出呈現到眼睛的時候,自然可以不渲染深度值小於桌子的內容。自然你就看不到被桌子遮擋的物體了。

再引用增強現實系統中的遮擋處理技術-虛擬現實(VR)模擬模擬行業資訊 第三維度-打造最專業的虛擬現實行業門戶

中的話簡單說下現有的處理虛實遮擋的技術:

1、遮擋處理技術介紹

遮擋處理(Occlusion Handling)指的是如何使虛擬模型同真實環境中的物體產生正確的遮擋關係的處理過程。早期的增強現實技術中,所有計算機生成的虛擬模型都是直接疊加到真實場景的圖片上,也就是說無論這些虛擬模型代表的空間位置距離攝像機是遠還是近,其模型都是簡單顯示在真實場景的前方,真實場景中的物體僅僅是作為背景,虛擬模型可以遮擋住真實物體,而真實物體卻不能遮擋虛擬模型。由於這種簡單的遮擋關係使得早期的增強現實技術在真實感上存在嚴重不足,導致用戶對空間方位的認知產生混亂。遮擋處理就是為了解決這個問題而產生的。遮擋處理的方法大致可以分為兩種(Breen eta1.1995):基於模型的方法(Model-based Method)和基於深度值的方法(Depth—based Method)。

1.1 基於模型的遮擋處理方法

基於模型的遮擋處理方法預先對工作空間中的真實物體建立對應的三維虛擬模型,並將這些模型與真實物體位置對齊,用這些模型代表真實物體。在遮擋處理中,這些代表真實物體的模型同其他虛擬模型進行遮擋計算,獲取遮擋關係,最後顯示的時候只輸出虛擬模型遮擋後的圖形,而不輸出代表真實物體韻模型,將輸出圖形同背景圖片疊加後就得到有正確遮擋關係的場景圖片。

Fuhrmann et a1.(1998)利用這個方法提出了一個快速構件人體虛擬模型的方法,用虛擬的人體模型代表真實人體,進而進行遮擋處理得到較好的處理結果。

這種遮擋處理方法由於採用虛擬模型代表真實物體,因而遮擋計算實際是在虛擬模型之間進行了,由圖形渲染管線(graphics pipe l ine)自動計算深度值,寫入Z緩衝區(Z-buffer),進行深度比較,完成遮擋處理,因而這種方法運算速度非常高,能夠充分滿足實時性的要求,遮擋效果依賴於代表真實物體的虛擬模型的準確性和方位的對齊程度。然而基於模型的遮擋處理方法只適用於場景複雜良低.且能夠預先或者快速建立精確代表真實物體的虛擬模型的情況,而不適用於室外複雜動態場景中。由於這種處理方法的局限性,越來越多的學者提出根據場景圖片深度信息的遮擋處理方法。

1.2 基於深度值的遮擋處理方法

基於深度值的遮擋處理方法首先需要獲得真實場景圖片的深度圖(depthmap),Zenati et a1.(2007)提出了一個根據立體匹配(stereo matching)原理由成對圖片計算深度圖的動態程序結構,根據真實場景深度圖同虛擬模型深度信息比較獲得精確的遮擋處理結果。基於深度值的遮擋處理由於只需要成對的場景圖片就可以完成,因此不受場景大JJ,$D複雜度的限制,不需要大量的預先準備工作,適用範圍更加廣泛。同時由於採用立體匹配原理計算深度圖,遮擋效果取決於深度圖計算精度。然而深度圖的計算和比較往往花費較多的計算時間,使得整個處理過程很難達到實時性的要求。Lu and Smith(2009)提出了一個利用GPU加速計算深度處理的方法,使得計算速度大幅度提高(約20倍)。


要做的話倒也簡單,在 z buffer 和「外景」的 depth buffer 比較下切掉被擋住的像素就行了

難點在於實時獲取 depth buffer 的性能,移動設備跟不上。@叛逆者 曾說「我倒是想讓那玩意裡面的物體用各種高大上的渲染技術,但是 intel 的顯卡實在是……所以最後用 flat shading 了,還能幫你分辨哪裡是真的哪裡是虛的。」


推薦閱讀:

HoloLens 是以怎樣的順序對場景進行建模&渲染的?
設計HoloLens應用該怎樣設定用戶模型?
如何評價Magic Leap被曝光的原型產品?

TAG:Kinect | 增強現實AR | 虛擬現實VR | HoloLens | 介導現實MR |