讀大三時學過一門課程《游戲編程》,當時遇到一個有趣的問題,沒想到現在搞AR又遇到了,就是遮擋的情況。
什么是遮擋?
就是前面的東西擋住后面的。尤其是在二維環境下,因為本來就是一個平面,一定要有前后關系或者分層來解決遮擋問題。
舉個例子,我們以前玩小霸王游戲的時候,游戲人物走到一個建筑物旁邊,他要從建筑物的前面繞到建筑物的后面,請問怎么處理才能讓你不那么假。
沒感覺,那先看一張動態圖。
是不是這樣才會感覺到飛機真的在繞著人飛行。真實的世界里,兩個物體之間的遮擋關系是自然而然的,因為我們從小就開始適應這種情況,所以并不會特別察覺,但如果讓你自己建造一個虛擬的世界,這個難題就必須要解決了。
在AR中有無遮擋,很重要嗎?
看一個AR繪畫程序的兩種情況對比。
當我們在真實場景中畫上虛擬的筆跡,然后我們轉一下角度,問題就出現了。正常情況下,我們會知道畫在黑色物體背后的畫筆應該被擋住看不到才對,但是這個虛擬的畫筆一直在我們面前飄著,這就太假了。
然后,如果我們使用了遮擋來處理。
掉落在地上的球,當球滾動到物體下面的時候,就從圖像上消失了,這才符合真實的情況。
所以在AR當中,無論是手機AR還是AR眼鏡,真實環境和虛擬的增強信息并不是簡單疊加。為了欺騙人的雙眼和大腦,是需要滿足一些真實世界的基本原則,比如重力、燈光、陰影、當它滿足一些基本原則的時候,比如燈光、陰影等,不然總會感覺“看起來不太對”。
AR中實現遮擋的三種方法
第一種是比較簡單粗暴的處理方式,就是突出重點。
比如我們在AR中觀看,真實場景我們很熟悉,我們希望能突出虛擬圖像的更重要地位,那就把虛擬的物體渲染得非常亮,遠遠超過周圍環境。帶來的后果就是整個場景很扎眼,不舒服。
第二種我們選擇用更精細些的手法,但是原理和第一種類似,只是反過來操作。
當我們想看到前面的虛擬圖像時,這個虛擬圖像實際上應該是在前面的,現實場景是在背景位置,這時候我們不像第一種方式對虛擬物體加亮,而是反其道而行之,把現實部分變暗。
如果人眼能看到一部分現實背景,那就采用光照往沒被遮擋住露出來的真實部分打上光,這樣就還原了真實的情況。
第三種是針對于光學透視的顯示器,你可以簡單理解為采用光學透視的AR眼鏡就是這一種。
這種方案從理論上講,就是在整個儀器的前方增加一塊用于過濾的電子屏,用來過濾一些不需要的像素。
總結
在以前學習做2D游戲的時候,遮罩的算法是用來解決遮擋問題的,3D游戲里,可以直接用深度來表達物體的前后關系,利用深度軸處理遮擋,就不算是一個需要著重解決的問題。
但AR掃描的現實世界非常復雜,很難短時間重建真實環境中的所有對象,也就沒法做出透明遮罩來解決遮擋問題。