VR 中有哪些方法隱喻深度線索(depth cue)?
《如何充分利用視覺系統對深度的感知從而營造更強的立體感與深度感?》
相信各位CV大神比我這個不懂技術的PM懂得多得多,但是沒人來答,故舔著臉來了。首先標準術語應該叫做深度知覺(Depth perception)。
按照《三體3》的說法,人類是三維動物,所以對二維事物或空間具有絕對控制,也就是當人面對二維事物時,能夠一覽無餘地看到上面所有的信息,就像手機或電腦的屏幕,就像我們長達千年的在紙面上寫字畫畫,我把這些叫做X、Y軸。
X、Y軸上的二維的移動,二維的位置……這些都無法逃過我們的眼睛。
而當面對三維事物,到了VR,Z軸就來了,簡單的理解,這個Z軸就是感知你距離物體的遠近。
而Z軸,正是人類感知深度(或者距離),它通過很多信息組合在一起,視覺系統經過計算後才能判斷大致的深度。
我認同大劉的說法,人類所感知到的三維圖像,其實是很多二維圖像的組合。
所以,一個雙目視覺加上一個頭的六自由度移動轉動,就已經讓你感到很強的立體感了。
而,深度信息越多,大腦越能準確判斷物體的Z軸。
當然,這也是信息發展的趨勢,即用戶們說自己感受到了立體感(stereoscopic effect),覺得VR中看起來真實、看起來爽,其實是因為VR還原了三個維度的信息,而傳統手機和電腦只還原了兩個維度的信息。
—————————————————————————————————————
人類感知深度的方式分為靜態的雙眼感知深度、單眼感知深度,以及動態的轉動頭部產生運動視差感知深度線索(depth cue)。
值得補充的是,在VR中我們常聽說的accommodation和convergence,正是人眼感知距離的絕對距離信息(absolute distance information),accommodation是人眼告訴視覺系統它聚焦在多遠的地方,而convergence則是雙眼視線所形成的角度,這些都有絕對的距離,視覺系統可以算出它離你多遠。
而其它的所有深度信息都是相對距離信息(relative distance information),視覺系統通過判斷兩個物體之間的深度信息,然後做比較:哪個離你近?哪個離你遠?
—————————————————————————————————————
一、雙眼深度暗示
在講雙目視覺之前,我想先講講幾種生物。
第一種是以斑馬為代表的開放式平原食草生物(open-plains herbivores)。
偶蹄類食草動物(hoofed grazers)
它們的雙眼是開放式的,FOV接近360°,所以當它們在吃草時,能夠從任何方向發現進攻它們的捕食者。
而發展處雙目視覺的,只有捕食者(predators)
當它們發現獵物時,它們通過雙目視覺來判斷和獵物之間的距離。一個猛撲或者俯衝之下將獵物撲倒在地。
所以……全景視覺是防守性策略,而雙目視覺是攻擊性的。
所以,雙目視覺的進化優勢,就在於它可以判斷距離。
1、立體感(Stereopsis)→雙眼視差(binocular disparity) 又稱 binocular parallax。
所謂視差(parallax),無論是雙目視差(binocular parallax)還是運動視差(motion parallax)從本質上來說,是雙眼因為相隔一個瞳距,處於不同位置,有不同的視角(viewpoints),當看同一個物體時左右眼看到該物體的不同角度,然後這兩張看到的畫面被大腦所融合(fuse)。
左右眼通過不同的圖像判定兩個物體的距離。
左眼看到的
右眼看到的
比如雙眼看到的圖像差別越大,視差越大,大腦則告訴我們物體離我們很近,反之,當雙眼看到的圖像差別越小,視差越小,大腦則告訴我們物體離我們很遠,所以在VR中離我們很遠的物體我們可以直接放在一張三自由度的全景圖上……這也是我們說的雙眼的三角定位,先以被用在雙目攝像頭上。
雙眼同時看到兩張不同的二維圖像,轉動頭部、移動頭部看到的不同的連續的圖像,每一次你都能看見不同角度和不同位置的圖像,而這些圖像被大腦整合成、還原成『大腦以為的樣子』。
雙眼看到不同的圖像:
大腦融合圖像
三維顯示(3D Display)的技術也因此而來:
比如現在的VR就是給左右眼兩個相隔一個瞳距的VR中的鏡頭看到的圖像:在VR出現以前,我們一般採用過濾的方法(filtering methods),就是濾出兩個不同的層讓雙眼看到。比如最早的紅藍立體眼鏡:
vergence——兩隻眼睛朝內或朝外轉動,雙眼的視線相交於一個深度的點上。
而這種vergence受瞳距(inter-pupillary distance )影響,瞳距越大,兩隻眼睛看到的圖像差別越大,深度感也就越強,當瞳距大於用戶的瞳距時,則會產生超立體(hyperstereo)的效果。
而VR中的瞳距小於現實中的瞳距則會產生次立體(hypostereo)的效果,圖像看起來偏扁平。
物體在不同的距離會有不同的視差量(Parallax Amount),可以用雙眼視線所形成的角度來表示,一般來說,眼睛看的東西越遠,雙眼視線所匯聚的角度越小,晶狀體壓得越扁,反之,眼睛看的東西越近,雙眼視線所匯聚的角度越大,眼睛晶狀體拉得越長。
但是如果視線所成角為0,即雙眼視線平行,則要求物體距離視線無窮遠,其實是不可能的。
目前用HMD成像的VR,將離你眼睛距離很近的屏幕通過菲涅爾透鏡成一個2-3米的虛像,而如果這個物體的剛好在成像距離上,則為0 parallax,你的眼睛聚焦過去還很舒適,但是它固定在離你眼睛2-3米的固定距離上,不能動。
如圖,一個物體+ parallx可以成像在屏幕之後,但是因為HMD只能成像在屏幕上,所以眼睛輻輳衝突不舒服;同理,一個物體-parallx,成像在屏幕之前,則不僅會因為輻輳而不舒服,還有可能讓視線難以聚焦。
下面這幅圖中,鉛筆線為accommodation,墨蘭水筆線為convergence,我們可以看到。
當且僅當物體剛好落在虛像上(即屏幕上的像素透過菲涅爾透鏡在2-3米處產生的虛像)時,accommodation和convergence才重合,此時用戶是舒適的。換句話說,parallax越接近0,用戶觀看越舒適。
這給我們的VR內容提了一個要求,即需要用戶聚焦的內容,最好出現在2-3米內,但是其實是做不到的,因為需要用戶伸手去抓,用手柄去交互的部分大部分在半米內,所以無法真正避免,只有等待光場投影。
而超過屏幕虛像的成像距離,雖然也會引起輻輳,但是一般用戶不會沒事去看那些距離自己很遠的物體,這不符合現代人的用眼習慣。
- 但是VR中有些移動的物體,從離你10米的距離移動到離你半米的距離,這時晶狀體由convergence神經調節帶動引起變化,輻輳就會相當劇烈。
- 另一種就是兩個物體一個離用戶遠一個離用戶近,當用戶在這兩個物體之間移動視覺『焦點』時,也會引發強烈的輻輳。
或者說,convergence看屏幕的視線和accommodation真正聚焦的視線差別越大輻輳也就越強烈。比如+ parallax時,眼睛看遠處,convergence讓眼睛轉動,雙眼視線的交點處於該物體上,但是實際卻交在了屏幕上,convergence因神經調節帶動accommodation壓扁晶狀體,卻無法聚焦上,於是你的眼睛不斷顫抖,眼壓很大。
我們通常所說的視差都是水平視差(horizontal parallax),因為人習慣左右水平轉動頭部,更因為人的雙眼水平地分布在左右兩側,所以看到的是左右兩張圖像,它們是水平的。
但還有一種是垂直視差(Vertical Parallax)常被我們忽略,而產生垂直視差的方法則是扭動你的脖子。
你可以看那些jump或surround拍出來的360立體視頻,然後用垂直視差(傾斜頭部)的方法試驗,然後視覺系統會發現它們只是兩個球面。
在下面的鏡頭看到的:
在上面的鏡頭看到的:
上下鏡頭融合後看到的圖像:
當然,真實的情境中我們應該是水平視差和垂直視差結合的,頭部自由轉動、眼球自由轉動……的一種複雜的場景。
立體陰影(Shadow Stereopsis)
—————————————————————————————————————
VR和真正的雙目視覺差距的另一個問題就在於視場角過小,導致視覺範圍內顯示的東西少,比如一個物體因為雙目視差,只有一隻眼睛看到了它,而出了另一隻眼睛的FOV,此時就只能用單目來判定深度信息了。
我們說VR中判定深度主要的方法是雙目視差,而到了單目,某些用戶很可能很難判定深度,從而出現一個物體在那裡,你卻無法感知它的深度的感覺。
下面我們來講講單目是如何判定深度的——
—————————————————————————————————————
二、單眼深度暗示
1、accommodation→調整焦距
動眼神經暗示(oculomotor cue)
如圖,你看見近處一物體,有些模糊,所以睫狀肌拉動晶狀體調整焦距將眼睛聚焦上去,而改變晶狀體的過程就叫accommodation。
睫狀肌拉動晶狀體引發形狀變化,以改變焦距:
- 看遠處時壓扁;
- 看近處時拉長。
當你看近處的時候,眼部肌肉處於緊張狀態,convergence朝內,accommodation為了聚焦上去而把晶狀體拉長;而當你看遠處時,眼部肌肉處於放鬆狀態,vergence朝外,accommodation壓扁,而如果你眼睛accommodation調整焦距聚焦在一塊固定的屏幕上,而vergence仍朝內或朝外的話,就會因神經調節導致牽拉肌肉引發眼壓(eyestrain)。
最簡單的感覺就是,你的眼球由『向內的狀態』朝著外面轉動,但是它始終聚焦在眼前的透過透鏡顯示的屏幕上,所以晶狀體想被壓扁,卻壓不下來的感覺。
但是現階段可以用景深(depth-of-field)來模擬accommodation的效果。(比如我在《除了光場,還有什麼方式能解決VR顯示的accommodation-vergence conflict?》中提到的)而每個深度場可以代表光場中的一個角度的畫面。
因為accommodation恰好是眼睛單眼引發的景深,如果我們提前將景深顯現出來,可以一定程度上欺騙大腦和眼睛。
恰好攝像機上的景深也給了我們不少啟發:
- 人眼到底是定焦還是變焦?
- 如何通過電影畫面來判斷鏡頭的焦距?
- 大光圈產生的淺景深和長焦距產生的淺景深有區別嗎?二者在作用機制上有什麼不同?
- 為什麼 35mm 焦距的鏡頭叫做人文鏡頭?
- 50mm 定焦的焦距和人眼的一樣,為什麼視野卻這麼小?
- 婚紗攝影外景拍攝中經常使用長焦鏡頭,請問這個有什麼好處?
- 長焦虛化與大光圈虛化 僅從焦外來說 有什麼區別?
而所謂的單眼視覺產生深度的方法,就和我們學習傳統繪畫產生立體感的方法一樣,相當於在平面上產生立體感。
景深(Depth of field)
失焦模糊(Defocus blur )和對焦清晰
焦點的可選擇性(Selective),在電影中就常用到聚焦和失焦兩種手法,來引導觀眾看導演想讓他們看的地方或層級。
—————————————————————————————————————
遮擋(occlusion interposition)層次關係
遮擋就是——前面的物體擋住後面的物體。
先說平面的遮擋,前面的東西優先順序高,後面的優先順序低,這種原理被用在移動端的交互設計上就是新的應用、新的頁面會出現在舊的頁面之上。
但是在3D中,遮擋就不只是簡單的重疊(Overlapping),它需要和雙目視覺共同作用。
在VR中,物體的遮擋是和雙目視覺一起被處理的,被稱為立體遮擋(Stereo Occlusion),比如下圖:
右眼看到稜錐和立方體放在一起,左眼就看到原來是立方體遮擋了稜錐,於是視覺系統就告訴你:『立方體在稜錐的前面』。
我根據上圖畫出——
在所以深度線索中,遮擋是最顯而易見的,因為簡單,所以視覺系統的計算量小,所以它提前被處理,它的優先順序就高於其他深度線索。
所以在VR中,如果一個大的物體被小的物體遮擋,則會引發人眼感知深度的錯亂,所以在VR中你很少見到視錯覺。
—————————————————————————————————————
空氣透視(aerial perspective)
在CG領域被稱作 distance fog,而在自然界是因為受天光(skylight)就是受光的散射。在可見光譜中,藍紫光就是波長最短的光。
我們把可見光譜搬到繪畫上就會發現它剛好可以作為顏色的Z軸,即:
紅色在最前面,紫色在最後面,這也是為什麼遠山總是偏藍紫色的原因,因為大氣折射短波長的藍紫光。
所以,在塞尚的畫中他使用了暖色顏料(黃、橙、紅)產生向前進的效果,而冷色顏料(藍、青、紫)產生後退的效果。
因為視力(visual acuity)的限制,
前景:近處的東西,處於我們的近視焦距下,所以我們能看到很多細節,很高的光照對比度,很高的飽和度。而人的對比敏感度(Contrast sensitivity)隨距離而衰退。
背景:而對於遠處的物體,我們可以把千米之外的地平線上的東西是做sphere上的,它們和環境融為一體:
- 因為天光中包含短波段,在藍天下,遠處的物體便隱沒在一片湛藍中;
- 落日將整個天空浸染成粉紅色。夕陽下,近處的物體光與影強烈的對比,而遠處的物體沉沒在粉紅的餘暉中。
從我下面的示意圖可以看出,空間透視區分前後物體的特點是:
- 細節;
- 對比度;
- 飽和度。
離你眼睛越近的物體,對比度越高,細節越多,而越遠的物體越暗淡。(畫過色彩風景寫生的朋友應該都很熟悉吧~)
空氣透視的原理是越遠的物體被空氣折射得越厲害,但是在中國還是受霧霾的影響(層次感更強)
中國畫里的層次感,就是靠著一座山接著一座山,遠處的山隱沒在皚皚的山霧之中。
—————————————————————————————————————
紋理坡度(texture gradients)
如下圖,我們可以觀察下面的磚塊變化,可以發現:
近處稀疏,遠處密集;
近處
—————————————————————————————————————
光照和陰影(lightingshadow)
陰影投射到地面上,你再通過地面的透視獲得有關地面上物體的深度信息。
此外,投影投射所在的表面你能察覺到它表面的形狀。
光和影結合產生的深度
下面是Google VR團隊分享的一個案例:
如果這三個方塊沒有陰影,那顯然無法分清哪個在前哪個在後。
而如果加上了陰影,你就知道那些層離你近,那些層離你遠。
同理,陰影可以推斷出物體距離表面的遠近。
第一張,只有遮擋,你知道花杯在高腳杯後面;
第二張,根據遮擋,花杯在前面,根據放置位置的相對高度透視,花杯在後面,那麼它到底是在前面還是在後面?這時你的視覺便矛盾了。
於是第三張,加了陰影之後,就一目了然了,原來花杯確實在高腳杯前面,只是它是浮空的啊~
—————————————————————————————————————
運動視差(motion parallax)
最簡單的就是你移動頭部,你發現場景中的物體也在做運動,離你越近的物體移動得越快。
我們大腦中的IMU感知我們的加速度,而視覺周邊感知移動速度,於是視覺系統知道你的頭部的移動方向和移動速度,從而和我們看到的物體的移動速度和移動方向做對比,於是算出了哪些物體離我們近,哪些物體離我們遠。
當然,這些優勢要六自由度的主機VR才能做到,對位置追蹤的精度也有很高的要求。
運動視差和雙目視差一樣,視覺系統都是為了採集圖像,然後算每張圖像之間有什麼差別。
打個比方,一台inside out的全景光場相機可以記錄場景中所有物體和圖像信息,但是如果只有一個鏡頭的普通相機就得依靠舵機和滾輪在場景里走來走去、轉動身軀了。
傳統的繪畫中運用了大量的『單眼拉深度的方法』——讓繪畫具有深度感。
而VR中,能產生立體感最強的效果也是——因頭動產生的運動視差。當你的頭左右移動時
離你越近的物體移動的越快
離你越遠的物體移動得越慢
所以你大腦中分析出了這些場景的景深,你大腦中感受到的景深大概為——
前景
中景
坐火車汽車時同理,離他越遠的物體移動得越慢,離他越近的物體移動得越快。
而在VR中的運動視差,是用戶感知到的最強的深度感知。
從運動中感知深度(Depth from motion),又叫從光學膨脹中感知深度(depth from optical expansion)。
你感覺物體在朝你靠近,感覺它在你視網膜上成的像越來越大了,而你的視覺系統就在感知它變大的速度。
我覺得,這就非常有張力,在畫面上也非常有戲劇性。
當你在打棒球時,你感知棒球的運動速度,它在你視線中越來越大。
當你開車是,你會注意前方的虛線在靠近你時加速從車身下滑過。
運動深度效果(Kinetic depth effect)
最著名的是這個旋轉的舞女,明明是一張平面的圖像,但是我們的視覺經驗作祟,將它腦補成了一個旋轉的舞女的立體的、運動的影像。
https://www.youtube.com/watch?v=xIj4lvNFME0
https://www.youtube.com/watch?v=LqY_gUF-1X8
在下面的視頻中,你光看視頻中的點,不知道是什麼東西,但是當這些點運動起來時,你便知道是在走動的人——https://www.youtube.com/watch?v=TQB4T6mTXAY
—————————————————————————————————————
2、線性透視(linear perspective )
相對高度暗示(relative height cues)
在畫面中,越高的地方,則離我們越遠。
如下圖,前面的線段佔據了我們大部分視野,而後面的片段只佔我們小部分視野,越遠處,所包含的空間越大也越凝練,所以細節也越少。
學過美術的同學都知道繪畫有很多年歷史。
但是我們學的繪畫,都是學最近四百年里的。
為什麼呢?
因為之前的繪畫都是平面的。
根本原因是因為四百年前,
透視法被發明並且運用在繪畫中。
滅點
透視受到鏡頭焦距的影響,一般來說,FOV越大,畸變越厲害即『廣角』——透視越強,視野範圍越廣。反之,FOV越小,枕形畸變越厲害即『長焦』——透視越小,視野範圍越窄。
- 為什麼廣角近大遠小現象強而長焦弱?
- 在一個成像系統中,視角和焦距的關係是什麼?視角和空間解析度的關係是什麼?
- 同焦距APS-C畫幅鏡頭所產生的「畸變」 與全幅鏡頭「畸變」一樣嗎?
離你眼睛越近,則透視越大,視覺衝擊力也就越強。
—————————————————————————————————————
地平線仰角(elevation)
比透視更加明顯的是地平線仰角的距離判斷方法,如圖:
越靠近地平線的物體,顯然離我們越遠。
同理,如果一個物體在地平線上快速移動,那麼……它一定移動得很快&<( ̄▽ ̄)&>
—————————————————————————————————————
曲線透視(curvilinear perspective)
只有在極端情況下你才會看見曲線透視,它的透視平行線(parallel lines)被扭曲了,就像透過魚眼鏡頭的照片一樣。
—————————————————————————————————————
當然,所以的深度信息都是被整合到一起的,如下圖的研究結果。
- 我們已經說過accommodation和convergence是絕對距離的感知了,不過這種感知只在0-2米的短距離內有效;
- 而透視和仰角,在0-2米內無法判定;
- 而空氣透視只在超過30米的位置才有效。
—————————————————————————————————————
四、單眼光學幻覺(optical illusion)
而光學幻覺(optical illusion)則會影響我們的單眼深度感知,所以在VR中會非常不好。
空心面具幻覺(hollow mask illusion)
參考:
Shibata, T., Kim, J., Hoffman, D.M., Banks, M.S. (2011). The zone of comfort: Predicting visual discomfort with stereo displays. Journal of Vision, 11(8), 1-29.
https://www.youtube.com/watch?v=w95kwXy_MOY
這個問題在玩leap的時候就感覺到了,單憑畫面的指示很難從交互層面提醒用戶是進行了有效操作。那麼所謂的有效、高效、可預知、可快速修改就是沒法實現的。所以我認為需要從界面顯示和交互設備兩方面出發,結合功能設計來共同實現。
1,確立界面設計方向
把界面功能分解成鏡頭上的HUD,和功能具體的界面。
2,增加功能接觸的視覺反饋
例如接觸功能(代表功能的各種模型)是,通過增加物體邊框閃爍等視覺效果來證明兩者接觸,實現功能選擇。用後續動作來操作功能。
實際上從kinect的方案來說,交互是一件費力的事情,因為kinect將動作投射到兩位空間,有保留了深度操作。所以似識別精度不適用於交互,只使用與識別。但是vive的操作感受就非常好,抓取和深度都非常靈敏,如果交互上進行簡單的升級,那麼可以非常好的提升整體的操作感受。
隨著htc的vive的在圈子裡的流行,google的新VR設備指標的發布。無論高端VR設備還是基於手機的VR設備,手持式VR控制器估計會成為下半年的主流話題。目前來說要有效的在VR環境下進項操作,要操作範圍和佩戴方式進行調整,並且增加反饋。
首先要變更手持設備的佩戴方式,現在的方式都是「持有」,手部需要抓持設備進行操作。對於通過按鍵進行操作的vive來說需要一個簡單的學習就可以滿足操作,對於google的新交互設備來說來能就是個問題。所以我建議將這類設備掛在手掌上(如果可以掛在手背上會更好),通過「抓握」來激活選擇。
其次增加震動。當選擇到功能的時候通過震動來通知使用者發生了選擇(碰撞),這樣我們就可以在虛擬世界恢復一小部分肢體的感知效果了。甚至可以再不同的物體發生碰撞的時候,通過不同頻次、不同強度的震動來提醒用戶。
這樣就實現了一部分給予肢體在虛擬空間對功能的選擇和交互了。這樣我們也算實現了一點在虛擬空間對深度的操作。
你是說如何提示怪物所在的遠近程度么?
主要有以下幾種線索可以隱喻深度信息
- 透視投影的變形效應。由於透視,平行線變得不平行了,這種幾何效應能夠非常好的暗示深度
2. 熟悉物體的大小,人的高度。對於熟悉的物體,我們知道它的尺寸大小,那麼在視野中有熟悉物體出現時,我們可以判斷該物體與我們的距離。比如有位長者,身高174,那麼當畫面中能夠看到祂全身畫面時,我們也能夠推算出距離大概有多遠。
3.運動視差。當我們從車窗往外看時,近處的物體運動速度快,而遠處的物體運動速度慢,這就是運動視差。同樣在VR中,如果我們自己動起來,那麼不同物體的運動速度能夠隱喻其所在位置與我們的距離。
4.物體的遮擋關係,顯然沒被遮擋的物體離我們近,被遮擋的物體離我們遠,即使下面這樣純平面圖像,我們也知道裡面物體的相對深度。
5. 雙目圖像視差,對於比較近的物體,既然是VR,那左右眼看到的圖像是不同的,大腦自動判斷深度,當然這就不算是隱喻了,而是直接的深度信息了。
推薦閱讀: