WebVR 概念

注意: WebVR API 已被 WebXR API 取代。WebVR 從未被批准為標準,在少數瀏覽器中預設實現和啟用,並支援少量裝置。

本文討論了虛擬現實 (VR) 背後的一些概念和理論。如果您是該領域的新手,在開始深入程式碼之前,瞭解這些主題是值得的。

VR 的歷史

虛擬現實並不是什麼新鮮事物——這個概念比 2012 年的 Oculus Rift Kickstarter 眾籌活動要早得多。人們已經進行了數十年的實驗。

1939 年,View-Master 裝置被創造出來,讓人們能夠看到 3D 圖片。該裝置顯示儲存在硬紙板盤上的影像,其中包含小型彩色照片的立體 3D 對。經過多年的發展,軍方對使用這種技術產生了興趣,1961 年,Project Headsight 誕生了——這涉及一個頭盔,其中包含一個帶有頭部追蹤系統的影片螢幕。

在接下來的幾十年裡,進行了各種實驗,但它不再侷限於科學實驗室和戰場。最終,流行文化接管了它,電影導演展示了他們對虛擬現實的願景。諸如《創戰紀》(1982) 和《駭客帝國》(1999) 等電影被創作出來,人們可以將自己轉移到一個全新的網路世界,或者被困在一個世界中卻毫不知情,將其視為真實世界。

最早的 VR 遊戲嘗試規模龐大且價格昂貴——1991 年,Virtuality Group 創造了一臺配備護目鏡的 VR 街機,並將《吃豆人》等流行遊戲移植到虛擬現實中。世嘉在 1993 年的消費電子展上推出了他們的 VR 眼鏡。公司正在進行實驗,但市場和消費者並不買賬——我們不得不等到 2012 年才看到一個成功的 VR 專案的真實案例。

近期的 VR

那麼有什麼新鮮事呢?虛擬現實硬體需要提供高精度、低延遲的資料以提供可接受的使用者體驗;執行 VR 應用程式的計算機需要足夠強大才能處理所有這些資訊。直到最近,這種精度和功能才以可承受的成本提供,如果能提供的話。早期的 VR 原型成本數萬美元,而最近的頭戴式裝置,如 HTC VIVEMeta Quest,僅售數百美元,並且還有更便宜的解決方案——例如基於移動裝置的解決方案,如 Google Cardboard

在軟體方面,Valve 已經建立了 SteamVR 軟體,該軟體與 VIVE 和其他解決方案相容,並用於提供對軟體的訪問,例如可用的 VR UI。

這項技術本身已經存在,更昂貴的頭戴式裝置只會隨著時間的推移而變得更便宜,這樣將來會有更多的人能夠親身體驗虛擬現實。

輸入裝置

處理虛擬現實應用程式的輸入是一個有趣的話題——這是一種全新的體驗,需要為此設計專門的使用者介面。目前有各種方法,從經典的鍵盤和滑鼠,到 Leap Motion 和 VIVE 控制器等新方法。這需要反覆試驗,才能瞭解在特定情況下什麼有效,以及哪種輸入最適合您的遊戲型別。

VR 硬體設定

有兩種主要的設定型別,移動裝置或計算機連線。它們的最低硬體設定如下:

  • 移動裝置:使用智慧手機建立頭戴式顯示器(HMD),智慧手機充當 VR 顯示器,安裝在 VR 支架(如 Google Cardboard)中,該支架包含所需的鏡頭,可提供移動螢幕上投影內容的立體視覺。Mobile based VR setup
  • 計算機連線:VR 設定連線到您的計算機——這包括一個頭戴式顯示器(HMD),其中包含一個高解析度橫向螢幕,用於顯示左右眼的視覺效果,該顯示器還包括每個眼睛的鏡頭,以促進左右眼場景的分離(立體視覺)。該設定還包括一個單獨的位置感測器,用於計算頭部的位置/方向/速度/加速度,並不斷將該資訊傳遞給計算機。Computer based VR Setup

注意:連線電腦的系統有時不包括位置感測器,但通常會包括。

補充 VR 體驗的其他硬體包括:

  • 手部識別感測器:一種跟蹤手部位置和運動的感測器,使其成為一個有趣的控制器,併成為 VR 遊戲世界中的一個物體。迄今為止最先進的是 Leap Motion,它可與計算機(連線到 Oculus Rift)配合使用,也可以連線到移動裝置(後者處於實驗階段)。
  • 遊戲手柄:我們可以配置 Xbox 控制器或類似的裝置,使其在瀏覽器中充當鍵盤——這為與 VR 網頁的互動提供了更多可能性。有些遊戲手柄可與移動裝置設定配合使用,但它們透過藍牙連線,因此無法與 WebVR 配合使用。
  • 眼動追蹤感測器(實驗性):FOVE 專案是第一款能夠讀取細微眼部運動的頭戴式裝置。
  • 面部表情追蹤器(實驗性):南加州大學和 Facebook 的 Oculus 部門的研究人員一直在測試追蹤面部表情並將其傳輸到虛擬角色的新方法。
  • 更復雜的定位感測器系統:例如,HTC VIVE 配備了兩個定位感測器,位於空間的兩端對角,繪製出整個空間,並允許在最大 5 米 x 5 米的空間中享受 VR 體驗。

位置和方向、速度和加速度

如上所述,位置感測器檢測 HMD 的相關資訊並不斷輸出,使您能夠根據頭部運動、旋轉等持續更新場景。但這些資訊究竟是什麼?

Position and Orientation VR setup

輸出資訊分為四類:

  1. 位置 — HMD 在 3D 座標空間中沿三個軸的位置。x 表示左右,y 表示上下,z 表示朝向和遠離位置感測器。在 WebVR 中,x、y 和 z 座標由 VRPose.position 中包含的陣列表示。

  2. 方向 — HMD 在 3D 座標空間中繞三個軸的旋轉。俯仰角是繞 x 軸的旋轉,偏航角是繞 y 軸的旋轉,滾轉角是繞 z 軸的旋轉。在 WebVR 中,俯仰角、偏航角和滾轉角由 VRPose.orientation 中包含的陣列的前三個元素表示。

  3. 速度 — 在 VR 中需要考慮兩種型別的速度:

    • 線性 — HMD 沿任何一個軸移動的速度。此資訊可以使用 VRPose.linearVelocity 訪問。
    • 角速度 — HMD 繞任何一個軸旋轉的速度。此資訊可以使用 VRPose.angularVelocity 訪問。
  4. 加速度 — 在 VR 中需要考慮兩種型別的加速度:

視野

視野 (FOV) 是使用者每隻眼睛可以合理期望看到的區域。它大致呈金字塔形,側臥,頂點在使用者頭部內部,金字塔的其餘部分從使用者眼睛發出。每隻眼睛都有自己的 FOV,一個略微重疊另一個。

FOV related properties

FOV 由以下值定義:

這些屬性的預設值會因 VR 硬體而略有不同,但它們通常都在上下約 53°,左右約 47° 左右,zNear 和 zFar 分別約為 0.1 米和 10000 米。

注意:使用者有可能看到周圍的一切,這對於應用程式和遊戲來說是一個全新的概念。嘗試給人們一個環顧四周並檢視他們身後事物的理由——讓他們伸出手去尋找一開始不可見的事物。描述他們身後有什麼。

VR 應用程式的概念

本節討論了在開發 VR 應用程式時需要注意的概念,這些概念在開發常規移動或桌面應用程式時可能從未考慮過。

立體視覺

立體視覺是人類和(大多數)動物正常的視覺——將兩個略有不同的影像(每隻眼睛一個)感知為單個影像。這會產生深度感知,幫助我們以絢麗的 3D 方式看世界。要在 VR 應用程式中重現這一點,您需要並排渲染兩個非常略有不同的檢視,當用戶使用 HMD 時,左右眼將接收這些檢視。

How to create stereoscopic 3D images

頭部追蹤

由於 HMD 中包含的陀螺儀、加速度計和磁力計(指南針),使您感覺身臨其境的 360 度場景中的主要技術。它具有主要相關性,因為它使我們的眼睛相信我們正對著一個球形螢幕,從而使使用者在應用程式畫布內獲得逼真的沉浸感。

眼疲勞

一個在 VR 中常用的術語,因為它使用 HMD 的一個主要障礙——我們不斷地用我們在應用程式畫布中顯示的內容欺騙眼睛,這導致眼睛比平時做更多的工作,因此長時間使用 VR 應用程式會導致眼疲勞。

為了儘量減少這種不良影響,我們需要:

  • 避免聚焦於不同深度(例如,避免使用大量具有不同深度的粒子)。
  • 避免眼睛會聚(例如,如果有一個物體向相機移動,您的眼睛會跟隨並會聚到它身上)。
  • 儘可能使用較暗背景和較柔和的顏色;明亮的螢幕會使眼睛更容易疲勞。
  • 避免亮度快速變化。
  • 避免向用戶呈現大量文字閱讀。您還應該注意眼睛/相機與要閱讀的文字之間的距離。0.5 米不舒服,而超過 2 米立體效果開始減弱,因此建議介於兩者之間。
  • 通常要注意物體與相機之間的距離。Oculus 建議最小聚焦距離為 0.75 米。
  • 如果使用者需要與場景中的物體進行互動,請使用指標——這將幫助他們以較少的精力正確指向物體。

一般來說,最省力的視覺路徑將為使用者帶來更輕鬆的體驗。

暈動病

如果開發者不格外小心,VR 應用程式實際上可能會導致使用者感到噁心。這種效應發生在眼睛接收到的刺激與身體預期接收的刺激不符時。

為了避免讓我們的使用者產生暈動症(或至少最大限度地減少影響),我們需要:

  • 始終保持頭部追蹤(這是最重要的,尤其是在體驗過程中發生)。
  • 使用恆定速度;避免加速或減速相機運動(使用線性加速度,如果可以的話避免緩動)。
  • 保持幀率(低於 30fps 會不舒服)。
  • 避免急劇和/或意外的相機旋轉。
  • 為固定物體新增固定的參照點(否則使用者會認為它們正在移動)。
  • 不要使用景深或運動模糊後期處理,因為您不知道眼睛將聚焦在哪裡。
  • 避免亮度變化(使用低頻紋理或霧效果來建立平滑的照明過渡)。

總的來說,您的眼睛不應向大腦傳送導致身體其他部位產生反射動作的訊號。

延遲

延遲是指物理頭部運動與 HMD 螢幕更新後視覺顯示到達使用者眼睛之間的時間。這是提供逼真體驗最重要的因素之一。人類可以檢測到非常小的延遲——如果它們要不被人察覺,我們需要將延遲保持在 20 毫秒以下(例如,60Hz 顯示器有 16 毫秒的響應時間)。

Oculus Rift 頭戴式裝置的延遲為 20 毫秒或更短,但基於移動裝置的設定將嚴重依賴智慧手機 CPU 功率和其他功能。

幀率 (每秒幀數 / FPS)

根據維基百科的定義,幀率是成像裝置產生獨特連續影像(稱為幀)的頻率。60fps 的幀率是平滑使用者體驗的可接受幀率,但根據執行應用程式的機器效能或您要顯示的內容的複雜性,它可能會急劇下降。低於 30fps 通常被認為是卡頓的,並會給使用者帶來煩惱。

最困難的任務之一是保持恆定且高的幀率值,因此我們必須最佳化程式碼,使其儘可能高效。最好有一個不會持續或突然變化的體面幀率;為此,您需要儘可能少地讓必要的物件進入場景,並(在 WebGL 的情況下)嘗試減少繪製呼叫。

瞳距 (IPD)

根據維基百科的定義,瞳距是兩隻眼睛瞳孔中心之間的距離。瞳距對於雙目觀察系統的設計至關重要,其中兩隻眼睛的瞳孔都需要定位在觀察系統的出瞳孔內。

在 WebVR 中,瞳距 (IPD) 可以使用 VREyeParameters.offset 計算,它等於 IPD 的一半。

此值由 HMD 返回,其值可能在 60 到 70 毫米之間;對於某些 HMD(如 Oculus Rift),您可以設定自己的 IPD。通常我們不更改此值,但您可以調整它以更改整個場景的比例。例如,如果您的 IPD 設定為 6000 毫米,使用者將像巨人俯瞰小人國一樣觀看場景。

自由度 (DoF)

DoF 指剛體在空間中的運動。為此術語建立縮寫沒有統一性——我們可以在僅檢測旋轉頭部跟蹤的感測器上下文中找到 3DoF 的引用,當輸入允許我們同時控制位置和方向時,可以找到 6DoF。我們甚至有時會發現 9DoF 的引用,當硬體包含陀螺儀、加速度計和磁力計等三個感測器時,但 3 x 3DoF 值的結果實際上將返回 6 自由度跟蹤。

DoF 與使用者頭部運動的跟蹤直接相關。

聚焦錐體

儘管我們的視野要大得多(大約 180 度),但我們需要注意,只有在該視野的一小部分中才能感知符號(中心 60 度)或閱讀文字(中心 10 度)。如果您沒有眼動追蹤感測器,我們假設螢幕中心是使用者眼睛聚焦的地方。

在決定將視覺效果放置在應用程式畫布上的位置時,此限制很重要——如果離聚焦錐體的邊緣太遠,可能會更快導致眼睛疲勞。

3D 定位音訊

3D 定位音訊是指一組操作音訊以模擬其在三維空間中聽起來的效果。

這與 Web 音訊 API 直接相關,該 API 允許我們將在畫布中的物件上放置聲音,或根據使用者正在前往或正在檢視的場景部分啟動音訊。