寫給VR手游開發小白的教程:(六)Cardboard如何實現沉浸式VR體驗之構造雙眼

原文地址:http://blog.csdn.net/mao_xiao_feng/article/details/52454560
沉浸體驗是VR的核心也是一直以來的技術難點,虛擬現實的發展一直專注于怎樣讓用戶獲得更好的沉浸式體驗,這涉及到多個領域的多項技術,上至渲染優化,性能優化,下至人眼的構造,肢體的運動與感知。Cardboard也為沉浸式體驗提供了一種方案,本篇主要介紹Cardboard是用哪些技術實現VR體驗的。
之前有人和我說,用Unity實現VR效果,很簡單,新建兩個Camera,相隔一定長度,然后把兩個攝像機的viewport,分屏輸出,就實現了VR,乍一聽還挺有道理的,但是仔細一想,這種實現方式,漏洞百出,更夸張的說,它可能根本算不上VR
首先我們要明白沉浸式的虛擬現實系統是怎樣的系統?
以下摘自百度百科:沉浸式虛擬現實其明顯的特點是:利用頭盔顯示器把用戶的視覺、聽覺封閉起來,產生虛擬視覺,同時,它利用數據手套把用戶的手感通道封閉起來,產生虛擬觸動感。系統采用語音識別器讓參與者對系統主機下達操作命令,與此同時,頭、手、眼均有相應的頭部跟蹤器、手部跟蹤器、眼睛視向跟蹤器的追蹤,使系統達到盡可能的實時性。臨境系統是真實環境替代的理想模型,它具有最新交互手段的虛擬環境。那么我們從第一個特征開始:虛擬視覺虛擬視覺是一個很抽象的概念,要去理解他,必須要進行具體化,而我們手上正好有Unity這樣的工具可以幫助我們實際去感受,什么是虛擬視覺。


這是Cardboard的主物體,我們把它全部展開,發現CardboardMain下面有三個層級,Head是CardboardMain的子物體,GazePointer和Main Camera分別又作為Head的子物體,而Main Camera下又附帶著兩個Camera,,可能有人不明白為什么這樣設置,別擔心,等我們介紹完你就明白了。



縱觀整一個CardboardMain,發現帶有Camera組件的只有Main Camera和他所屬的兩個子物體,如上圖所示,三個Camera的近裁面大小并不一樣,我們截圖進行一下對比




Main Camera Left和Main Camera Right的近裁面分別是相比Main Camera的近裁面等高但是寬度減小的兩個矩形,而且兩個矩形不重疊,它們相差了一定間隔。
這個間隔看似不起眼,實際就很有講究了,要闡明其原理,首先要從3D電影的原理講起:

/***********************************************************************************************************************************/

不知道大家有沒有在脫掉3D眼鏡的情況下,觀察3D電影的屏幕,會發現其實屏幕上的畫面,很模糊,看起來像是兩幅畫面的疊加。但是戴上眼鏡以后瞬間清晰了,而且更加逼真震撼。
3D電影的原理其實很簡單,它確實是利用兩臺并列安置的電影攝影機,同步拍攝出兩條略帶水平視差的電影畫面(要注意的是,這樣的兩幅畫面,并不是時間上的先后關系,而是在拍攝時,攝影機攝像位置的空間上的間距),所以,一部只用一個攝像機拍攝的電影,無論用什么方法也成為不了3D電影,3D的基礎,就是兩幅在不同點觀察的畫面。
為什么要這樣做?
做一個小實驗吧,先閉上左眼,同時睜開右眼。
然后迅速睜開左眼,同時閉上右眼
再回到第一步,不停的循環。比對一下,左眼中的世界,和右眼中的世界,是一樣的嗎?

這就是我們視覺的運行方式,兩眼在不同的空間位置去觀察這個世界,接受不同的反射光線,然后被大腦所接受,形成一個條件反射,我們在看“現實”的世界,所有物體都是實際存在的,都是有空間大小的。這就是我們感覺的“3D”

問一個很玄乎的問題。在看一幅畫的時候,為什么我們知道是在看一幅畫,而不是畫中的世界?

也許我們的雙眼在看這幅畫的時候,大腦就已經確定了這是一幅畫,里面的物體都是處于“畫”這個平面上的,我們永遠不可能進入到畫中去看畫中的世界。

然而科學的進步告訴我們,真的可以進入畫中的世界,只要在畫中給我們的眼睛建模,形成“畫中的視覺“。

如何建模呢?
很簡單的一種方式,像3D電影拍攝一樣,用攝像機替代我們的雙眼,但是攝像機獲得的畫面并不能直接投射到我們的視網膜上被大腦感知,我們還需要一樣東西,3D眼鏡。

3D眼鏡將匹配的偏振光接受,拒絕不匹配的光線,這樣的設計導致了,我們的左右眼可以獲取到對應的畫面,而兩個畫面互不影響。
于是,兩幅用攝像機模擬眼睛拍攝的畫面,就在我們的左右視網膜上分別投影出來了。

這就是虛擬視覺。

用一句話概括就是,把自己的雙眼“放”到虛擬世界中去,“感知”這個世界的光線,讓你覺得這個世界像是實際存在的,于是“虛擬”就變成了“現實”。

/***********************************************************************************************************************************/

現在我們來看Cardboard是怎么實現虛擬視覺的,Main Camera Left和Main Camera Right上都有一個腳本,叫Cardboard Eye.cs



這是關于此腳本的介紹:
Controls one camera of a stereo pair. Each frame, it mirrors the settings of the parent mono Camera, and then sets up side-by-side stereo with an appropriate projection based on the head-tracking data from the Cardboard.SDK object.To enable a stereo camera pair, enable the parent mono camera and set Cardboard.SDK.vrModeEnabled = true.
控制一對立體攝像機中的其中一個,每一幀都復制其父物體上的單攝像機的設置,然后根據從Cardboard.SDK對象得到的頭部追蹤數據同合適的投影來建立立體像對。
要啟用立體攝像機對,先啟用父物體的單攝像機并置Cardboard.SDK.vrModeEnabled = true

顯然Cardboard是用這對攝像機來產生立體圖像的,這個攝像機Cardboard給了個定義叫stereo camera,介紹里還涉及到一個攝像機,叫mono Camera,這個mono Camera就是Main Camera物體上camera組件


為什么要叫mono Camera或者說這個mono Camera有什么用呢?上面介紹過了mono Camera的近裁面是一個大的矩形,而兩個stereo Camera的近裁面只是包含于mono Camera的近裁面中的矩形,這說明stereo Camera獲得的投影來自于mono Camera投影的一部分。Cardboard把mono Camera的投影作為世界的投影,而stereo Camera的投影作為輸入眼部的投影,為了與現實保持一致,stereo Camera使用函數public void CopyCameraAndMakeSideBySide(StereoController controller, float parx = 0, float pary = 0)保證相機的所有settings是與mono Camera保持一致的。這樣做的目的,就是希望我們看到的,是和世界一致的,這是想當然的問題,我們肯定不會希望我們眼睛看到的與世界表現的不相同,即使在虛擬世界中。

細心的同學會發現一個問題,在工程運行的時候,Main Camera Left和Main Camera Right上的camera組件是關閉的,但是我們依然能看到圖像,這是怎么回事呢?
Alternate means of rendering stereo, when you don't plan to switch in and out of VR mode:In the editor, disable the MainCamera's camera component. Enable the two stereo eye camera components.
Cardboard給了兩種渲染stereo的方式,一種是啟用mono Camera,關閉兩個stereo Camera(默認方式),還有一種是關閉mono Camera,啟用兩個stereo Camera。
這是在UnityEditor里的功能,所以Android運行時應該用不到

當然實現視覺的虛擬不僅僅是以上這么簡單,我們獲得了兩個不同視點觀察的經過投影變換后的圖像(準確的來講,這個圖像應該叫做RenderTexture),現在我們需要將攝像機輸出的視口(viewport)擺放到屏幕的準確位置,這一步很重要,因為我們不希望在用VR眼鏡觀察的時候因為輸出的viewport位置不對,導致看不全viewport或者看到了viewport外圍黑色背景的現象,我們希望,我們的視野(視野這個詞,后面都簡寫為FOV,field of view,這個視野可能是眼睛的視野,也有可能是眼睛透過VR透鏡觀看的視野),正好覆蓋輸出的viewport,一分一毫也不能偏差,差一點點可能就會毀了我們的沉浸式體驗過程。
這個過程,我自己定義了一個名字,叫做外部的FOV適配。(不同于內部的FOV適配,后面會講)。

完成了外部的FOV適配,至少我們已經將我們的眼睛“放”到了游戲場景中,但是這僅僅是一個開始,我們還需要解決很多問題。

例如,VR透鏡的使用造成的最典型的一個問題,圖像畸變。

下一章我們會從扭曲矯正開始繼續介紹。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容