Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 寫給VR手游開發小白的教程:(六)Cardboard如何實現沉浸式VR體驗之構造雙眼

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

編輯:關於Android編程

沉浸體驗是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 ofthe parent mono Camera, and then sets up side-by-side stereo with an appropriateprojection based on the head-tracking data from the Cardboard.SDK object.To enable a stereo camera pair, enable the parent mono camera and setCardboard.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透鏡的使用造成的最典型的一個問題,圖像畸變。

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved