仮想現実の 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" android:screenOrientation="ランドスケープ"> ... <インテントフィルター> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="com.google.intent.category.CARDBOARD" /> </インテントフィルター> </アクティビティ> </アプリケーション> </マニフェスト>
権限の説明:
- <uses-sdk android:minSdkVersion=”16″/>は、デバイスが API レベル 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"は、アクティビティに必要な画面の向きが "landscape" であることを示します。 これは、VR アプリに設定する必要がある向きです。 Cardboard SDK で使用されるビューである CardboardView は、フルスクリーンおよびランドスケープ (landscape、reverseLandscape、sensorLandscape) モードでのみレンダリングされます。
- android:configChanges=”orientation|keyboardHidden” の設定も推奨されますが、必須ではありません。
- Cardboard SDK が Cardboard の NFC タグにアクセスするには、 android.permission.NFCパーミッションが必要です。
- android.permission.READ_EXTERNAL_STORAGEとandroid.permission.WRITE_EXTERNAL_STORAGE 。 これらのアクセス許可は、Cardboard SDK がユーザーの電話を VR ビューアーにペアリングするために必要です。
- android.permission.VIBRATEパーミッションは、何かが起こったことをユーザーに知らせるために電話を振動させるデモ アプリで必要です。
- インテント フィルタ、特にcom.google.intent.category.CARDBOARDは、このアクティビティが Cardboard のようなビューアと互換性があることを示しています。 このカテゴリは、ユーザーの電話にインストールされている互換性のあるアプリを一覧表示するために、Cardboard アプリによって使用されます。
Cardboard アクティビティの拡張:
CardboardActivity は、Cardboard アプリのコーディングの開始点です。 CardboardActivity は、Cardboard デバイスとの統合を容易にする基本アクティビティです。 イベントを公開して Cardboard とやり取りし、VR レンダリング用のアクティビティを作成するときに一般的に必要となる詳細の多くを処理します。
CardboardActivity は、システム UI が非表示になり、コンテンツが画面全体を占めるスティッキー イマーシブ モードを使用することに注意してください。 CardboardView はアクティビティがフルスクリーン モードの場合にのみレンダリングされるため、これは VR アプリの要件です。
Android 4.4 (API レベル 19) では、 setSystemUiVisibility() に新しい SYSTEM_UI_FLAG_IMMERSIVE フラグが導入され、アプリを完全に「フルスクリーン」にすることができます。 このフラグを SYSTEM_UI_FLAG_HIDE_NAVIGATION および SYSTEM_UI_FLAG_FULLSCREEN フラグと組み合わせると、ナビゲーション バーとステータス バーが非表示になり、アプリで画面上のすべてのタッチ イベントをキャプチャできるようになります。
CardBoardView を定義します。
Android アプリのすべてのユーザー インターフェイス要素は、ビューを使用して構築されます。 Cardboard SDK for Android には、VR レンダリングに使用できる GLSurfaceView の便利な拡張機能である CardboardView という独自のビューが用意されています。 CardboardView はコンテンツをステレオでレンダリングします。 デモ アプリがアクティビティ レイアウト xml ファイルで aCardboardView を次のように定義する方法を確認できます。
<com.google.vrtoolkit.cardboard.CardboardView android:fill_parent" android:layout_height="fill_parent" />
次に、メイン アクティビティ クラスで、onCreate() メソッドで CardboardView を初期化します。
** * ビューを CardboardView に設定し、使用する変換マトリックスを初期化します * シーンをレンダリングします。 * @param savedInstanceState */ @オーバーライド public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_ui); CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view); // CardboardView.StereoRenderer を cardboardView に関連付けます。 cardboardView.setRenderer(これ); // cardboardView をこのアクティビティに関連付けます。 setCardboardView(cardboardView); // ここで他のオブジェクトを初期化します .... }
ビューをレンダリングする
CardboardView を取得したら、それをレンダラーに関連付けてから、CardboardView をアクティビティに関連付けます。 Cardboard は 2 種類のレンダラーをサポートしていますが、デモ アプリで使用されている CardboardView.StereoRenderer を使用するのが最も簡単な方法です。
CardboardView.StereoRenderer には、次の主要なメソッドが含まれています。
- onNewFrame() は、アプリがレンダリングされるたびに呼び出されます。
- onDrawEye() は、異なる目のパラメーターを使用してそれぞれの目に対して呼び出されます。
これらの実装は、OpenGL アプリケーションに対して通常行うことと似ています。 これらの方法については、以降のセクションで詳しく説明します。
onNewFrame を実装する
onNewFrame() メソッドを使用して、個々の目がレンダリングされる前にレンダリング ロジックをエンコードします。 単一のビューに固有ではないフレームごとの操作は、ここで行う必要があります。 これは、モデルを更新するのに適した場所です。 このスニペットでは、変数 mHeadView に頭の位置が含まれています。 この値は、後でユーザーが宝物を見ているかどうかを判断するために保存する必要があります。
/** * フレームを描画する前に OpenGL ES を準備します。 * @param headTransform 新しいフレームでの頭の変換。 */ @オーバーライド public void onNewFrame(HeadTransform headTransform) { ... headTransform.getHeadView(mHeadView, 0); ... }
onDrawEye を実装する
onDrawEye() を実装して、目ごとの構成を実行します。
これはレンダリング コードの要であり、通常の OpenGL ES2 アプリケーションの構築と非常によく似ています。 次のスニペットは、ビュー変換マトリックスと透視変換マトリックスを取得する方法を示しています。 低レイテンシーでレンダリングすることを確認する必要があります。 Eye オブジェクトには、目の変換行列と射影行列が含まれています。 これは一連のイベントです。
- お宝は目の空間に入ります。
- 射影行列を適用します。 これにより、指定された目にレンダリングされたシーンが提供されます。
- Cardboard SDK は、歪みを自動的に適用して、最終的なシーンをレンダリングします。
/** * 目のフレームを描画します。 * * @param eye レンダリングする目。 必要なすべての変換が含まれます。 */ @オーバーライド public void onDrawEye(Eye eye) { 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 マトリックスを構築します // 立方体の位置と光を計算します。 float[] パースペクティブ = eye.getPerspective(Z_NEAR, Z_FAR); Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM(mModelViewProjection、0、パースペクティブ、0、mModelView、0); drawCube(); // シーンの残りを描画します。 ... }
入力の処理
Cardboard ビューアには、磁石を使用したプッシュ ボタンが含まれています。 磁石を押すと、磁場が変化し、携帯電話の磁力計によって検出されます。 これらのマグネット イベントは、Cardboard SDK によって自動的に検出されます。
ユーザーが磁石を引いたときのカスタム動作を提供するには、アプリのアクティビティで CardboardActivity.onCardboardTrigger() をオーバーライドします。 宝探しアプリでは、宝を見つけて磁石を引っ張ると、宝を手に入れることができます。
/** * スコアを増やし、オブジェクトを非表示にし、ユーザーが磁石を引っ張るとフィードバックを返します *オブジェクトを見てください。 それ以外の場合は、何をすべきかをユーザーに思い出させます。 */ @オーバーライド public void onCardboardTrigger() { if (isLookingAtObject()) { mScore++; mOverlayView.show3DToast("見つけました!別のものを探してください。\nScore = " + mScore); ... } そうしないと { mOverlayView.show3DToast("見回してオブジェクトを見つけてください!"); } // 常にユーザー フィードバックを提供する mVibrator.vibrate(50); }
独自のプロジェクトを開始する
Cardboard SDK for Android について理解を深めたところで、独自のアプリケーションを作成してみましょう。
ゼロから始める新しいプロジェクトでも、既存のプロジェクトでも、次のことを行う必要があります。
1) 2 つの JAR ファイルをダウンロードします。 ダウンロードするにはこちらをクリック
2) app/libs フォルダーにコピーして貼り付けます (Android Studio プロジェクト構造のプロジェクト ビューでこれを見つけます)。
3) ライブラリを右クリックし、[ライブラリとして追加] を選択します。
次に、プロジェクトのapp/build.gradleファイルに次の行が存在することを確認します。
dependencies { … compile fileTree(dir: 'libs', include: ['*.jar']) }
バーチャル リアリティ アプリの開発を開始する準備が整いました。