Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲

VR入門

編輯:關於Android編程

入門指南

本文檔介紹如何使用實驗性的 Cardboard SDK for Android 創建您自己的虛擬實境 (VR) 體驗。
Android 演示版應用:Treasure Hunt

本教程中的代碼示例摘自“Treasure Hunt”Android 演示版應用。

Cardboard 是一個簡單的設備,可讓智能手機發揮虛擬實境平台的威力。 Cardboard 可與手機配合使用,從而在雙眼中呈現三維場景、跟蹤響應頭部移動以及通過磁鐵輸入與應用進行交互。 演示版應用“Treasure Hunt”可展示上述功能。 在此游戲中,用戶在數字化的世界裡四處觀望,目的是盡快尋找和搜集物品。 這是一款很基本的游戲,但它展示了 Cardboard 的核心功能。
游戲特性

“Treasure Hunt”一開場是以三維立體文字呈現的游戲說明。 當用戶發現物品後,系統會指示用戶拉動磁鐵。

這就是屏幕上顯示的內容。 在 Cardboard 中觀看時,這些將以三維場景呈現。

當用戶在屏幕中間的中心位置發現立方體時,立方體通過將其顏色更改為黃色進行指示。 用戶在立方體變為黃色時拉動磁鐵,用戶的得分就會增加,隨後立方體將移動到新的位置。

此應用使用OpenGL ES 2.0 顯示物品。 它演示了一些基本的功能,如燈光、在空間的移動和著色。 展示了如何使用磁鐵作為輸入、如何知道用戶是否正在看某樣東西,以及如何通過為每只眼睛提供不同的視圖來呈現圖像。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
現在,我們看下如何構建演示版應用,並在手機上運行它。
打開並運行 Treasure Hunt
開始前的准備工作<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPrm5vajR3cq+sObTptPD0OjSqqO6PC9wPg0KPHA+QW5kcm9pZCBTdHVkaW8gMS4wILvyuPy437Dmsb48YnIgLz4NCkFuZHJvaWQgU0RLIDE5ILDmsb48YnIgLz4NCtTL0NAgQW5kcm9pZCAxNiAoSmVsbHkgQmVhbikgu/K4/LjfsOaxvrXEIEFuZHJvaWQgzu/A7cnosbg8L3A+DQo8cD7PwtTYyr7A/bT6wus8L3A+DQo8cD7NqLn91MvQ0NLUz8LD/MHuo6y002NhcmRib2FyZC1qYXZhIEdpdEh1YiC05rSiv+K/y8Kh0d3KvrDm06bTwzwvcD4NCjxwPjxjb2RlPmdpdCBjbG9uZTxhIGhyZWY9"https://github.com/googlesamples/cardboard-java.git">https://github.com/googlesamples/cardboard-java.git

構建演示版應用

1.打開 Android Studio,在 Welcome 頁面上,選擇Import Non-Android Studio Project。 選擇位於您剛下載的示例代碼文件根目錄處的 build.gradle 文件,然後點擊 OK。

這會在編輯器視圖中打開一個名為 CardboardSample 的項目,其包含我們上面介紹的 Treasure Hunt 示例應用。

2.將手機連接到裝置上,點擊Run,然後運行“CardboardSample”以在手機上編譯和運行應用。
代碼概覽
manifest文件

Cardboard SDK 需要以下manifest文件標簽:


    
    

    
    ...
    
    
    
                ...

            
                
                
                
            
        
    

請注意以下事項:

· 表示設備必須運行 API 級別 16 (Jellybean)
或更高版本。
· 表示應用針對的是 API 級別 19 (KitKat)。
· 表示設備必須支 持 OpenGL ES 2.0 才能運行演示版應用。
· android:screenOrientation=”landscape” 表示 Activity 要求屏幕方向為”橫向。” 您必須將 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 權限才能使手機發生震動,以通知用戶發生了一些事。
· intent-filter,特別是 com.google.intent.category.CARDBOARD,聲明此 Activity 與類似 Cardboard 的查看器兼容。 Cardboard 應用使用此類別列出用戶手機上安裝的兼容應用

擴展 CardboardActivity

CardboardActivity 是對 Cardboard 應用進行編碼的起點。 CardboardActivity 是一個基礎 Activity,可與 Cardboard 設備輕松集成。 它將事件公開,以便與 Cardboard 進行交互,並處理為 VR 呈現創建 Activity 時通常要求的眾多細節。

請注意,CardboardActivity 使用粘滯的沉浸模式,在該模式下,系統 UI 處於隱藏狀態,且內容會占用整個屏幕。 這是對 VR 應用的一項要求,原因是 CardboardView 僅在 Activity 處於全屏模式時才會呈現。 有關此功能的更多討論,請參見使用沉浸式全屏模式。

演示版應用的 MainActivity 可擴展 CardboardActivity。 MainActivity 可實現以下界面:

CardboardView.StereoRenderer:渲染器界面,將所有立體影像渲染細節分配到視圖。 實現者在渲染視圖時,采用的方式應與以往一樣(使用提供的變換參數)。 所有的立體影像呈現和失真校正細節都是從渲染器提取的,並通過視圖在內部管理。

定義 CardboardView

Android 應用中的所有用戶界面元素都是使用視圖構建的。 Cardboard SDK for Android 可提供自己的視圖CardboardView,這是GLSurfaceView的簡單擴展,可用於 VR 呈現。 CardboardView 使內容呈現出立體感。 您可以查看演示版應用如何通過以下方式將 CardboardView 定義到其 Activity 布局 xml 文件中:

<com.google.vrtoolkit.cardboard.cardboardview android:id="@+id/cardboard_view
    android:layout_width=" fill_parent"="" android:layout_height="fill_parent">

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

**
 * Sets the view to our CardboardView and initializes the transformation matrices we will use
 * to render our scene.
 * @param savedInstanceState
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.common_ui);
    CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view);
    // Associate a CardboardView.StereoRenderer with cardboardView.
    cardboardView.setRenderer(this);
    // Associate the cardboardView with this activity.
    setCardboardView(cardboardView);

    // Initialize other objects here.
...
}

呈現視圖

在獲得 CardboardView 後,將其與渲染器關聯,然後將 CardboardView 與 Activity 進行關聯。 Cardboard 支持兩類渲染器,但入門的最快方式是使用 CardboardView.StereoRenderer,這是演示版本應用使用的內容。

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

onNewFrame(),應用每次進行渲染時調用。
onDrawEye(),針對眼睛參數不同的每只眼睛進行調用。

實現這些的方法與針對 OpenGL 應用的普遍做法相似。 將在後面的部分中詳細闡述這些方法。
實現 onNewFrame

在呈現到人眼之前,使用 onNewFrame() 方法對呈現邏輯進行編碼。 任何不屬於單個視圖特有的按幀操作都應在此處進行。 此處非常適合更新您的模型。 在此代碼段中,變量 mHeadView 包含頭部的位置。 需要保存此值以便日後使用(用於了解用戶是否正在尋寶):

/**
 * Prepares OpenGL ES before we draw a frame.
 * @param headTransform The head transformation in the new frame.
 */
@Override
public void onNewFrame(HeadTransform headTransform) {
...
    headTransform.getHeadView(mHeadView, 0);
...
}

實現 onDrawEye

實現 onDrawEye() 以執行每只眼睛的配置。

這是呈現代碼的重要部分,與構建常見的 OpenGL ES2 應用非常相似。 以下代碼段顯示如何獲取視圖變換矩陣,也稱為透視變換矩陣。 您必須確保低延時呈現。 Eye 對象包含眼睛的變換和投影矩陣。 以下是事件的順序:

寶物進入眼睛的空間。
應用投影矩陣。 這可以提供為指定的眼睛呈現的場景。
Cardboard SDK 自動應用失真,以呈現最終的場景。

/**
 * Draws a frame for an eye.
 *
 * @param eye The eye to render. Includes all required transformations.
 */
@Override
public void onDrawEye(Eye eye) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
...
    // Apply the eye transformation to the camera.
    Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0);

    // Set the position of the light
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0);

    // Build the ModelView and ModelViewProjection matrices
    // for calculating cube position and light.
    float[] perspective = eye.getPerspective(Z_NEAR, Z_FAR);
    Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0);
    Matrix.multiplyMM(mModelViewProjection, 0, perspective, 0, mModelView, 0);
    drawCube();

    // Draw rest of the scene.
...
}

處理輸入

Cardboard 觀片器包含一個使用磁鐵的按鈕。 推動磁鐵時,磁場會發生變化,而手機的磁力計可以檢測到這種變化。 因此,Cardboard SDK 可以為您檢測到這些磁鐵事件。

若要提供用戶拉動磁鐵時的自定義行為,請在應用的 Activity 中重寫CardboardActivity.onCardboardTrigger()。 在 treasure hunt 應用中,如果您發現了寶物並拉動磁鐵,您就可以留下寶物:

/**
 * Increment the score, hide the object, and give feedback if the user pulls the magnet while
 * looking at the object. Otherwise, remind the user what to do.
 */
@Override
public void onCardboardTrigger() {
    if (isLookingAtObject()) {
        mScore++;
        mOverlayView.show3DToast("Found it! Look around for another one.\nScore = " + mScore);
        ...
    } else {
        mOverlayView.show3DToast("Look around to find the object!");
    }
    // Always give user feedback
    mVibrator.vibrate(50);
}

開始創建您自己的項目

現在,您對 Cardboard SDK for Android 有了更多的了解,可以創建您自己的應用了。

無論是從頭開始創建一個新項目還是使用現有項目,均應按照以下步驟操作:

首先,從示例的 libs 文件夾(或 從此處進行下載)采集所有 jar 文件,並將其復制到項目的 app/libs 文件夾。

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

  dependencies {
    ...
    compile fileTree(dir: 'libs', include: ['*.jar'])
  }

現在,您可以使用 Cardboard SDK for Android 了!

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