從零開始學習開發虛擬現實 Android 應用程序
已發表: 2015-11-16本文將指導您如何從頭開始開發虛擬現實 Android 應用程序,假設您已經了解 Android 應用程序開發的基礎知識。
要求
- 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_STORAGE和android.permission.WRITE_EXTERNAL_STORAGE 。 Cardboard SDK 需要這些權限才能將用戶的手機與其 VR 查看器配對。
- 我們的演示應用需要android.permission.VIBRATE權限,以使手機振動以通知用戶發生了什麼事。
- 意圖過濾器,特別是com.google.intent.category.CARDBOARD聲明此活動與類似 Cardboard 的查看器兼容。 Cardboard 應用程序使用此類別列出安裝在用戶手機上的兼容應用程序。
擴展紙板活動:
CardboardActivity 是編寫紙板應用程序的起點。 CardboardActivity 是提供與 Cardboard 設備輕鬆集成的基礎活動。 它公開事件以與 Cardboards 交互,並處理創建 VR 渲染活動時通常需要的許多細節。
注意 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(),為每隻眼睛調用不同的眼睛參數。
實現這些類似於您通常為 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, LIGHT_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 會為您檢測到這些磁鐵事件。
要在用戶拉動磁鐵時提供自定義行為,請在應用的 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']) }
您已準備好開始虛擬現實應用程序開發!