從零開始學習開發虛擬現實 Android 應用程序

已發表: 2015-11-16

本文將指導您如何從頭開始開發虛擬現實 Android 應用程序,假設您已經了解 Android 應用程序開發的基礎知識。

要求

在 Truelancer 上僱用自由職業者
  • Android Studio 1.0 或更高版本
  • Android SDK 第 19 版
  • 運行 Android 16(Jelly Bean) 或更高版本的物理 Android 設備

清單文件

<清單...

<uses-permission android:name="android.permission.NFC" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

<uses-permission android:name="android.permission.VIBRATE" />

...

<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19"/>

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

<應用程序

...

<活動

android:name=".MainActivity"

安卓:screenOrientation="風景">

...

 

<意圖過濾器>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

<category android:name="com.google.intent.category.CARDBOARD" />

</intent-filter>

</活動>

</應用>

</清單>

解釋權限:

  • <uses-sdk android:minSdkVersion=”16″/>表示設備必須運行 API Level 16 (Jellybean) 或更高版本。
  • <uses-sdk android:targetSdkVersion=”19″/>表示我們的應用程序的目標是 API 級別 19 (KitKat)。
  • <uses-feature android:glEsVersion=”0x00020000″ android:required=”true” />表示應用使用圖形,因此必須支持OpenGL ES 2.0。
  • android:screenOrientation=”landscape”表示activity需要的屏幕方向是“landscape”。 這是您必須為 VR 應用程序設置的方向。 Cardboard SDK 使用的視圖 CardboardView 僅在全屏和橫向(landscape、reverseLandscape、sensorLandscape)模式下呈現。
  • 還建議設置 android:configChanges=”orientation|keyboardHidden” ,但不是強制性的。
  • Cardboard SDK 需要android.permission.NFC權限才能訪問 Cardboard 的 NFC 標籤。
  • android.permission.READ_EXTERNAL_STORAGEandroid.permission.WRITE_EXTERNAL_STORAGE 。 Cardboard SDK 需要這些權限才能將用戶的手機與其 VR 查看器配對。
  • 我們的演示應用需要android.permission.VIBRATE權限,以使手機振動以通知用戶發生了什麼事。
  • 意圖過濾器,特別是com.google.intent.category.CARDBOARD聲明此活動與類似 Cardboard 的查看器兼容。 Cardboard 應用程序使用此類別列出安裝在用戶手機上的兼容應用程序。

擴展紙板活動:

CardboardActivity 是編寫紙板應用程序的起點。 CardboardActivity 是提供與 Cardboard 設備輕鬆集成的基礎活動。 它公開事件以與 Cardboards 交互,並處理創建 VR 渲染活動時通常需要的許多細節。

必須閱讀自由職業者的成功:認識來自班加羅爾的 Aditya Web 和 Android 開發人員

注意 CardboardActivity 使用的是粘性沉浸模式,在這種模式下系統 UI 是隱藏的,內容佔據了整個屏幕。 這是 VR 應用程序的要求,因為 CardboardView 只會在 Activity 處於全屏模式時呈現。

Android 4.4(API 級別 19)為 setSystemUiVisibility() 引入了一個新的 SYSTEM_UI_FLAG_IMMERSIVE 標誌,讓您的應用真正“全屏”運行。 此標誌與 SYSTEM_UI_FLAG_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_FULLSCREEN 標誌結合使用時,會隱藏導航欄和狀態欄,並讓您的應用程序捕獲屏幕上的所有觸摸事件。

定義一個 CardBoardView:

Android 應用程序中的所有用戶界面元素都是使用視圖構建的。 適用於 Android 的 Cardboard SDK 提供了自己的視圖 CardboardView,它是 GLSurfaceView 的便捷擴展,可用於 VR 渲染。 CardboardView 以立體方式呈現內容。 您可以通過以下方式查看演示應用程序如何在其活動佈局 xml 文件中定義 aCardboardView:

 <com.google.vrtoolkit.cardboard.CardboardView    
機器人:fill_parent”    
android:layout_height="fill_parent" />

然後在主活動類中,它在 onCreate() 方法中初始化 CardboardView:

 **
* 將視圖設置為我們的 CardboardView 並初始化我們將使用的轉換矩陣
* 渲染我們的場景。 
* @param 已保存實例狀態 
*/
@覆蓋
公共無效 onCreate(Bundle savedInstanceState) {    
super.onCreate(savedInstanceState);    
setContentView(R.layout.common_ui);    
CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view);    
// 將 CardboardView.StereoRenderer 與 cardboardView 關聯。    
cardboardView.setRenderer(this);    
// 將 cardboardView 與此活動相關聯。    
設置紙板視圖(紙板視圖);     
// 這裡初始化其他對象
……
}

渲染視圖

獲得 CardboardView 後,將其與渲染器相關聯,然後將 CardboardView 與活動相關聯。 Cardboard 支持兩種渲染器,但最快的入門方法是使用演示應用程序使用的 CardboardView.StereoRenderer。

CardboardView.StereoRenderer 包括以下關鍵方法:

  • onNewFrame(),每次應用呈現時調用。
  • onDrawEye(),為每隻眼睛調用不同的眼睛參數。
必須閱讀如何聘請 WordPress 開發人員並準備好您的網站

實現這些類似於您通常為 OpenGL 應用程序所做的。 這些方法將在以下部分中更詳細地討論。

實現 onNewFrame

在渲染單個眼睛之前,使用 onNewFrame() 方法對渲染邏輯進行編碼。 任何不特定於單個視圖的每幀操作都應該在這裡發生。 這是更新模型的好地方。 在此代碼段中,變量 mHeadView 包含頭部的位置。 需要保存這個值以供以後使用,以判斷用戶是否在看寶藏:

 /**

* 在我們繪製幀之前準備好 OpenGL ES。

* @param headTransform 新幀中的頭部變換。

*/

@覆蓋

公共無效onNewFrame(HeadTransform headTransform){

...

headTransform.getHeadView(mHeadView, 0);

...

}

實現 onDrawEye

實現 onDrawEye() 來執行每隻眼睛的配置。

這是渲染代碼的核心,與構建常規 OpenGL ES2 應用程序非常相似。 以下片段顯示瞭如何獲取視圖變換矩陣以及透視變換矩陣。 您需要確保以低延遲進行渲染。 Eye 對象包含眼睛的變換和投影矩陣。 這是事件的順序:

  • 寶物進入眼界。
  • 我們應用投影矩陣。 這提供了為指定眼睛渲染的場景。
  • Cardboard SDK 會自動應用失真來渲染最終場景。
 /**

*為眼睛畫一個框架。

*

* @param eye 要渲染的眼睛。 包括所有必需的轉換。

*/

@覆蓋

公共無效onDrawEye(眼睛){

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

...

// 將眼睛變換應用於相機。

Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0);

 

// 設置燈光的位置

Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIG​​HT_POS_IN_WORLD_SPACE, 0);

 

// 構建 ModelView 和 ModelViewProjection 矩陣

// 用於計算立方體位置和光照。

浮動[] 透視 = eye.getPerspective(Z_NEAR, Z_FAR);

Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0);

Matrix.multiplyMM(mModelViewProjection, 0, perspective, 0, mModelView, 0);

繪製立方體();

 

// 繪製場景的其餘部分。

...

}

處理輸入

Cardboard 查看器包括一個使用磁鐵的按鈕。 當您推動磁鐵時,磁場會發生變化並被手機的磁力計檢測到。 Cardboard SDK 會為您檢測到這些磁鐵事件。

雇主必讀的 Truelancer 工作流程教程

要在用戶拉動磁鐵時提供自定義行為,請在應用的 Activity 中覆蓋CardboardActivity.onCardboardTrigger()。 在尋寶應用中,如果你找到了寶藏並拉動磁鐵,你就可以保留寶藏:

 /**

* 增加分數,隱藏對象,如果用戶在拉動磁鐵時給出反饋

* 看著物體。 否則,提醒用戶做什麼。

*/

@覆蓋

公共無效 onCardboardTrigger() {

如果(isLookingAtObject()){

分數++;

mOverlayView.show3DToast("找到了!四處尋找下一個。\nScore = " + mScore);

...

} 別的 {

mOverlayView.show3DToast("四處尋找對象!");

}

// 總是給用戶反饋

mVibrator.vibrate(50);

}

開始你自己的項目

現在您已經對適用於 Android 的 Cardboard SDK 更加熟悉了,是時候創建自己的應用程序了。

無論是從頭開始的新項目還是現有項目,這都是您應該做的。

1) 下載這兩個 JAR 文件。 點擊這裡下載

2) 將其複制並粘貼到您的 app/libs 文件夾中(在 Android Studio 項目結構的項目視圖中找到它)

3)右鍵單擊庫並選擇“添加為庫”

然後,確保項目的app/build.gradle文件中存在以下行:

依賴項 { ... 編譯 fileTree(dir: 'libs', include: ['*.jar']) }

您已準備好開始虛擬現實應用程序開發!

你是安卓開發者嗎? 立即加入 Truelancer並開始自由職業

在 Truelancer 上僱用自由職業者