2011年6月18日土曜日

[Android] OpenGLでシャープ製端末用3D(立体視)アプリケーションを作る

How to create 3-dimensional Applications on OpenGL

[Android] 3Dアプリケーションの作り方 でSH Developers Squareの3D(立体視)用ライブラリーのインストールについて書きました。
このライブラリーを使って立体視可能なOpenGLアプリケーションを作ってみました。

※画像はイメージです

立体視アプリを作るためにはサイドバイサイド画像を表示します。
サイドバイサイド画像とは、左半分に左目からの視線に映る映像を、右半分に右目からの視線に映る映像を並べた画像です。左右の画像それぞれ横の解像度を半分に縮小します。
サイドバイサイド画像のサンプルです。左右とも同じCGですが少しだけ視点を変えてます。

この画像はピアプロ・キャラクター・ライセンスに基づいてクリプトン・フューチャー・メディア株式会社のキャラクター「鏡音リン」「鏡音レン」を描いたものです。

3D用ライブラリーは自動的に左右の画像を1ドットずつ交互に並べ替えて視差バリアで左目と右目にそれぞれに映像を見せる処理をしてくれます。

立体視アプリを作るに当たり、次の手順は完了しているものとします。
  1. SH Develpoers Squareにユーザー登録しライブラリーをダウンロードする
  2. ライブラリーをAndroid SDKのadd-onsフォルダーに解凍する
  3. EclipseでAndroidプロジェクトを新規作成し、Build targetの「Sharp_addon」を選択する(Build targetは2.1以上ならどれでもOK)
OpenGLでサイドバイサイド画像を表示するには、1フレームごとに画面の左半分に左目の視線の映像を描画した後、右半分に右目の視線の映像を描画します。
今回のサンプルはGoogle codeのソースを参考に立体視アプリ用にアレンジしました。キューブが回転しながら前後左右に動きます。

マニフェスト(AndroidManifest.xml)
Activity(Main.java)

res/values/string.xmlは自動生成された内容を使ってます。
レイアウト用xmlは使用しません。

画面をタップするたびに3Dと2Dが切り替わります。
画面の向きは横に固定していますが、縦向きでも立体視できます。
立体感を演出するポイントはonDrawFrameメソッドの「(1)左の描画」「(2)右の描画」のGLU.gluLookAtによる視点の位置と向きです。
左右の視差を大きくすれば立体感も増えますが、大きくしすぎると映像が乱れて見えます。
このサンプルでは視点の位置は固定ですが、視点が移動するアプリでも右の描画の時だけ視点のX座標の位置と向きを変えるだけです。
ライブラリーのおかげで簡単に立体視化できますし、既存のOpenGLアプリの立体視化も簡単にできそうです。
立体視アプリケーションの開発コストはほとんど変わらないと思います。
ただし、横方向の実質的な解像度が半分になる、描画処理が2倍に増えるなどのデメリットがあります。仕様によってはパフォーマンス向上のため、やむなくポリゴンを減らす必要があるかもしれません。
サイドバイサイド方式は、どれだけフレームレートの低い端末でもちゃんとステレオ表示できるのが強みです。

立体視アプリ実行中のスクリーンショットはこんな画像です。
ポリゴンはサイドバイサイドで表示されてますが、タスクバーが1ドットごとにシャッフルされてます。
3Dテレビやニンテンドー3DSなど立体視のコンテンツが増えているので知っていて損はない技術だと思います。

キーワード
side by side image GLSurfaceView Renderer jp.co.sharp.android.stereo3dlcd.SurfaceController LYNX3D SH-30C GALAPAGOS SoftBank 003SH 005SH AQUOS PHONE 006SH SH-12C

以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。