Android VR應用該怎麼開發?

目前我知道的Android需要開發VR應用需要用到速度感測器,重力感測器啊,可是對於VR應用的開發還是不知道怎麼起手。還包括分屏之後改怎麼保持兩個畫面的一致,但又避免代碼冗餘,心底最希望看到一個Android VR應用代碼,有一個案例,即使只是說屏幕在移動時只是看到一個點一直處於中央移動。

希望有知乎大神給點幫助!


恰好這兩天在搜集 VR 開發的相關資料。整理如下,一方面自己看,一方面也許對希望進入 VR 應用開發的初學者有個指引與規劃的作用。

一、技術概覽

VR 核心技術體現在以下幾個方面:

全立體顯示(3D 顯示):包括反畸變演算法、多圖像處理

運動追蹤:利用陀螺儀 GyroscopeSensor 加速度計 G-Sensor 等來感應我們身體移動和頭部轉動

輸入設備:觸摸板、手柄、無線體感設備、手勢識別

利用手柄的典型方案比如 HTC 的 Vive、Sony 的 PS VR

無線體感設備比如 雷射的 Hydra、Sixense 的 STEM

手勢識別感應設備比如 Leap Motion 和 Nimble VR

具體哪種方式會成為未來 VR 的 「滑鼠」 暫時還不明朗。

開發工具:OpenGL 提供的 API、Unity3D 引擎 等

二、三種解決方案

VR 設備代表性的目前有 Oculus Rift、GearVR、谷歌盒子

他們分別採用了三種解決方案:

  1. 分體機(Oculus Rift )

  2. 一體機(Gear VR)

  3. VR 盒子(Cardboard)

Oculus Rift

Oculus Rift 是 Oculus 開發的一款頭顯。要使用它,我們還需要擁有一款強大的主機。

GearVR

有的人會說 GearVR 是插入手機的 VR 盒子呢~ 但是實際上 GearVR 是屬於一體機的。

從技術上來說,因為 GearVR 的產生實際是 Oculus 提供的一種攜帶型解決方案。它結合了 Oculus 的光學技術、頭部追蹤技術以及三星的 OLED 高解析度屏等。運用了頭盔中內置陀螺儀感測器而不是採用的手機中的感測器,這實際上是所有一體機的設計模式。

從市場上來說,我們一般也是將 GearVR 與一體機來進行比較的,而且 GearVR + 三星手機 比市場上大多數 3000元以下的一體機的體驗都要好。

Cardboard

谷歌紙盒 實際上是 Google 開放的一種規格

我們只需要下載安裝 Google 紙盒支持的應用程序,然後將手機放在紙盒中運行就可以了。

現在市面上很多的 VR 盒子都是參考 Cardboard 的規格來設計的。

實際上還有 Google 的 Daydream

「Cardboard上的應用主要是有趣的短視頻體驗, 幾乎沒有任何交互。

但是 Daydream 則相反, 主要是提供沉浸式高度交互性的內容。」

但是 Daydream 暫時還未正式發布,暫時不表。

三、VR 應用的分類

在不同類型的應用中我們所用到的開發技術也有所區別。

瀏覽器

現在瀏覽器已經開始慢慢支持 VR。我們可以運用 HTML5、WebGL、JavaScript 這些技術快速開發 VR 應用。並且這些應用的跨平台性還很不錯。

視頻

視頻和遊戲完全不同。我們知道 遊戲中的圖像大都是合成的,但是 VR 視頻的內容是拍攝的現實世界的內容。

這方面涉及的知識屬於 「3D 錄像」(facebook 有開源一個 利用17個攝像頭實現全景錄像的項目,surround360,大家可以去 Github 上面自己瞅~)。

遊戲、VR OS、普通應用

本文主要討論的,同時也是行業內一般所稱的 VR 應用指的是 VR 中的普通應用(比如設置菜單、圖庫、播放器),主題,以及 VR 遊戲等。

採用的開發工具多為 Unity3D

但是根據不同的平台(一體機、分體機、VR 盒子),也會有一些差異,在後面將會具體的描述。

四、三種方案中對應的開發工具

前文有說現在 VR 產品的表現形式大致有三種:

  1. 分體機(Oculus Rift )

  2. 一體機(Gear VR)

  3. VR 盒子(Cardboard)

後面逐一列一下他們分別用到的具體開發工具。

一)分體機

以 Oculus Rift 為例,我們需要

  1. VR 硬體設備(DK2)

  2. 下載 運行庫

  3. 下載 Oculus 的 SDK。這個需要你去 Oculus 官網上註冊帳號,然後填寫你使用的平台的相關信息。

我們要開發 Oculus Rift 的桌面端 VR 應用可以參考這兩篇文章

Oculus 開發環境配置(基於 Unity)

Oculus Unity 開發指南

二)一體機

以 GearVR 為例。

硬體上我們需要一部 S6 或者 Note4 以上的三星手機,

軟體上我們需要

  1. 下載 Oculus 的移動端 SDK(後面簡稱 移動端SDK)

註冊一個賬戶,然後

1)在頂部導航欄選擇Downloads頁面。

2)在SDK下拉選項中選擇SDK:MOBILE。

3)點擊最新移動端SDK鏈接。

4)同意使用許可協議。

5)下載SDK的壓縮包。

  1. 下載 Android 的 SDK

    我是在 Android Studio 中下載的 SDK,你也可以在Android 官網 SDK 下載界面 下載。

  2. 生成 Oculus 簽名文件

    我們需要簽名文件才可以讓應用在你的手機上運行,因為通過移動端 SDK 構建的 VR 應用需要一個唯一的簽名才可以調用更底層的API。

    在 Oculus開發者官網 上可以進行簽名文件的生成。

    有 Android 設備調試經驗的應該了解 adb,我們將 adb devices 獲取到的 id 複製到上面的網站相應區域,然後可以獲取簽名文件。

  3. 採用 Unity 開發 GearVR 應用。

    可以參考這一篇文章。

三)VR 盒子

以 Google Cardboard 為例,

Google 為 Cardboard 提供了兩套 SDK,一套用作 Android 原生開發,一套用作 Unity3D 引擎開發。

這裡是一個基於 Cardboard SDK 利用 Unity3D 開發的小例子

這裡是一個開發 Google VR 的簡要教程 ,這個博客後面兩篇文章還介紹了兩個 Google 開源的項目(VR 全景圖播放器、VR 視頻播放器)

四、其他

因為我並非專業 VR 應用開發者,在搜集資料的時候也碰到一些概念不大了解。所以歸納總結如下,如果有誤還請指出,謝謝~

OpenGL 與 Unity3D

OpenGL 是一個相對底層的框架。會提供一系列函數框架作為 API 提供給開發者使用。

Unity3D 是一個跨平台的遊戲引擎。解決的是遊戲製作人通過什麼東西來做遊戲的問題。本身包含很多遊戲相關的功能,比如繪圖,播動畫,放音樂,聯網等等。

Unity會用到OpenGL來繪製它要繪製的2D、3D圖形。這兩者的關係,好比汽車與它的引擎,汽車一定需要引擎,但是引擎可不知道它被用在哪個汽車上(via 周華)。

Unity3D

Unity3D 是一個很強大的遊戲引擎,並且它是我們製作 VR 應用的首選方案(via MichaelLiew)。

Unity結合Oculus的SDK提供了一整套的VR開發解決方案,其中還包括示例場景和入門教程。

Unity3D 的學習資料 這裡 的一套比較好。

原文見 [VR] 應用開發入門基本知識(Oculus/GearVR/Cardboard)

歡迎轉載,轉載請著名出處 Younix凌亂的草稿本

謝謝~


提供幾個關鍵字,從易到難排列。

Google Cardboard SDK

Oculus mobile SDK

Unity VR

Unreal VR

都多少自帶一些Sample項目,是很好的入手點。

友情提示:國內仿製者、資料翻譯還未見到高質量的文檔,目前的唯一方案就是Google和以上英文官方文檔。


如果只是做一個固定視角的VR應用,如題主所說,可以使用左右兩個相同的布局。然而這種實現方法的缺點有以下幾點:

1. 代碼冗餘

2. 如果是播放視頻的應用,由於兩側都有SurfaceView,而每個MediaPlayer只能設置一個SurfaceView,採用上面的辦法很難實現。(Camera也有類似問題)

3. 為了增加真實感,左右兩個部分的內容是不一樣的!左邊鏡頭顯示的內容是偏左邊看物體的,右邊鏡頭顯示的是從偏右邊看物體。相同布局無法做到這一點。

如果不使用第三方SDK,需要使用OpenGL ES來進行開發。(OpenGL ES開發需要多參考一些教程和Sample,之前沒有了解過可能上手會有點困難)。所以請之前多了解一些OpenGL。

VR應用採用OpenGL進行渲染,顯示的模型完全相同,只是看物體的角度不同

可以在渲染左邊鏡頭內容之前,

調用GLES20.glViewport(0, 0, width/2, height);通知OpenGL繪製在左邊屏幕

同時調用Matrix.setLookAtM(mVMatrix, 0, 0, -1, 0, 0, 0, 5, 0, 1, 0);這個方法是設置視口,其中0,-1,0表示左眼的空間坐標是x=0 y=-1 z=0,0,0,5表示看向的目標點是x=0,y=0,z=5。然後再進行三角形的繪製。

相應的,渲染右邊鏡頭內容,調用GLES20.glViewport(width/2, 0, width/2, height);通知OpenGL繪製在右邊屏幕。Matrix.setLookAtM(mVMatrix, 0, 0, 1, 0, 0, 0, 5, 0, 1, 0);設置右眼為0,1,0,然後再進行三角形繪製。

左右眼的繪製代碼,除了剛才說到的兩個點不同,其他完全相同,也就是說繪製的代碼可以完全復用。

用OpenGL ES,前面提到的播放器,Camera應用需要使用OpenGL的Texture來顯示。


可以看我寫的幾篇文章,互相學習,歡迎指點。

VR學習 - 光光的博客


google不知道什麼時候能開發完善的sdk出來,目前實現了android手機全景圖的展示和視頻展示,兩但是個屏幕是完全一樣的體驗不好,需要一些演算法支持,cardboard也是一樣,會有眩暈和噁心感!還有就是怎麼和vr設備結合,添加控制操作,看來要補一下opengl的東西了!求大神指導啊


有人能解析一下,嗎


我也想了解一下這方面的技術


這都是商業機密啊少年們 老老實實自己搞研究去吧 誰敢回答這個問題不被自己投資人砍死才怪。。。恩 我就看看誰敢回答 VC圈子也就這麼大


這傢伙確實是難搞,現有誰有方向了啊?求教,我只是知道git有一個開源庫而已,也看不懂


推薦閱讀:

臉萌突然就火了,但是後續該如何?是否又是一個現象級的應用?
移动互联科技正在怎样改变我们用车生活?
代充寶這個軟體是真的假啊?
「足記」為什麼最近這麼熱門?

TAG:Android開發 | 應用程序Application | 虛擬現實VR |