3D立体視表示概要

【APIの説明】

概要

本APIは、Android標準SurfaceViewに対して、3D立体視コンテンツを表示できるように機能追加しています。
SurfaceViewの拡張クラス(GLSurfaceView, VideoViewなど)に対しても3D立体視コンテンツを表示する機能を提供します。
また、携帯電話の設定メニュー[3D表示の飛び出し度]情報が取得でき、ユーザ設定に応じた表示が実現可能になります。

3D立体視のデータ形式

3D立体視の画像形式は、Side-by-Side(Half)のデータを描画する必要があります。

Side-by-Side(Half)とは、左右両眼用の画像を横幅1/2に圧縮したものを横に並べて1枚のフレームを形成し、再生時に伸長することにより3D立体視映像となります。
左側が左目用、右側が右目用の画像になります。

SidebySide(Half)データを準備する場合、どのような手法があるか例を記載します。
(静止画、動画、OpenGLなどにつかえる例であり、特に制限するものではありません。)

a) SidebySide(Half)データを準備し、画面サイズにあわせて拡大・縮小等を行い、描画する。
b) 右目用と左目用の画像をそれぞれ準備しておき、画面サイズに対して横幅1/2にリサイズし並べて描画する。
c) 1枚の画像を横幅1/2に縮小し、視差を出すために少しずらして並べて描画する。

 (気をつける点)
センタリングする場合、全画面に対して行うと、期待する画像が表示されません。
右図のようにSidebySide(Half)を対して行います。

2D/3D切替

2D/3D切替は複数のSurfaceViewに対して別々に行うことができます。
例えば、2D表示のListViewと3D表示のVideoViewを重ね合せて使うこともできます。
但し、1つ以上のSurfaceViewに対して3D切替を行うと液晶画面が3D状態になるため、2D表示しているListViewの横-解像度が1/2になり、小さいFontなど見えづらくなる可能性があります。

2D/3D切替を行う場合、2D用と3D用でSurfaceViewをそれぞれ用意すると、切り替えがスムーズになります。

3D飛び出し度設定

設定メニューからユーザの好みに合わせた3D飛び出し度を設定することができます。
[ランチャー]->[設定]->[サウンド&画像設定] /[表示]->[3D表示の飛び出し度]

この設定は、3D Game、MediaPlayerや、PictureViewなど3D立体視に対応したアプリケーション共通で参照しています。
プリインストールアプリケーション以外からも、この設定の値を取得できるようParallaxクラスのI/Fを公開しているので、自作アプリの起動時/再開時/縦横切替時に、3D飛び出し度設定情報を取得し、表示する際に反映するようにしてください。

【パッケージ/クラス一覧】

パッケージ名 クラス名 備考
jp.co.sharp.android.stereo3dlcd SurfaceController 3D立体視表示の設定を行う
  Parallax 3D立体視表示の飛び出し度を取得する

【APIの使い方】

Manifestの記載について

3D立体視表示を含むパッケージを使うため、Manifestに下記<uses-library>を記載する必要があります。
<uses-library>を設定することにより、3D機能に対応した弊社端末以外でGoogle Playにアクセスした場合に表示されないようになります。

<uses-library android:name="jp.co.sharp.android.stereo3dlcd"/>

例1)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.package.name">
  ...
  <application android:name="MyApplication" >
    <uses-library android:name="jp.co.sharp.android.stereo3dlcd" />
    ...
  </application>
  ...
</manifest>
 <uses-library>宣言がなければ、本APIを使用することができないため、注意してください。

2D/3D切替方法について

SurfaceViewを制御するクラスSurfaceControllerを作成し、そのメソッドsetStereoViewをコールします。
SurfaceControllerのコンストラクタにて制御するSurfaceViewを設定してください。
パラメータがtrueの場合、3D立体視表示になります。
Falseの場合、2D表示になります。

パッケージ名: jp.co.sharp.android.stereo3dlcd
クラス名: SurfaceController
コンストラクタ: SurfaceController(SurfaceView surface)
メソッド: public void setStereoView (boolean flag)
引数: flag true: 3D表示有効
false: 3D表示無効

例2)
import jp.co.sharp.android.stereo3dlcd.*;
 
public class Kube extends Activity implements KubeRenderer.AnimationCallback {
 
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    ...
        mView = new GLSurfaceView(getApplication());
        mRenderer = new KubeRenderer(makeGLWorld(), this);
        mView.setRenderer(mRenderer);
        SurfaceController sc = new SurfaceController(mView);
        sc.setStereoView(true);
    ...
    
    
setStereoViewをコールしたあとに、画像データを描画します。
setStereoViewをコールすると、onSurfaceChangedが呼び出されるため、そのタイミングで描画することを推奨します。

SidebySide(Half)を描画

SidebySide(Half)を描画する方法については、特に制限はありません。
下記のようにクリップをして描画することで実現できます。
OpenGLを使う場合、glViewportで描画範囲を設定することも可能です。

例3)

SurfaceHolder holder = getHolder();
Canvas canvas = holder.lockCanvas();
If (canvas == null) return;
canvas.clipRect( 0, 0, width/2, height);
canvas.drawBitmap(mImageHalf, x / 2, y, null); /* 左目用のデータ描画 */
canvas.drawText("depth: " + d, x/2, y, p);
canvas.restore();
canvas.clipRect( width/2, 0, width, height);
canvas.drawBitmap(mImageHalf, (width / 2 + x / 2 + d ), y, null); /* 右目用のデータ描画 */

例4)
gl.glViewport( 0, 0, w/2, h);
... /* 左目用のデータ描画 */
gl.glDrawElements( GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
... /* 右目用のデータ描画 */
gl.glViewport( w/2, 0, w/2, h);
gl.glDrawElements( GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);

飛び出し度設定について
下記I/Fにより3D飛び出し度設定の値が取得可能です。
この値は、[ランチャー]->[設定]->[サウンド&画像設定]/[表示]->[3D表示の飛び出し度]に対応した設定の値になります。

パッケージ名:jp.co.sharp.android.stereo3dlcd
クラス名:Parallax
メソッド:public float get3dDepthSettingsFl()
    
戻り値は、0.00f~1.00fの間になり、1.00fが一番飛び出た状態となります。
デフォルト設定は、1.00fになります。
移動機の設定が4段階の場合は、下記のような値が戻されます。
    
・強(default) ⇒1.00f
・中 ⇒0.66f
・弱 ⇒0.33f
・微弱 ⇒0.00f
 
この値を起動時/再開時/縦横切替時に取得し、飛び出し度に反映してください。
※解像度の違いからHDMI出力中は補正されます。
import jp.co.sharp.android.stereo3dlcd.*;
 
~飛び出し度設定の値を取得したい箇所で~
    float fParallax;
 
    Parallax mParallax = new Parallax();
    fParallax = mParallax.get3dDepthSettingsFl();

【その他の特記事項】

視差についての注意事項

  • 立体視画像を生成するときに気をつける点として、ユーザの目に優しいコンテンツを作成するために下記ガイドラインから限界視差1度程度が推奨されております。
    ガイドラインPDFへのリンク(P21 快適視差範囲'その1)
  • 実際の移動機上での確認をお願いいたします。
  • デバック方法として、DDMSなどでScreen captureと取ることで、SidebySide(Half)データでの確認ができます。

SurfaceController#setStereoViewの呼び出し制限事項

Android標準のSurfaceHolder#setFormat/setFixedSize/setSizeFromLayoutと同様にSurfaceController#setStereoViewの呼び出しは、SurfaceViewのWindowを動かすスレッドでコールする必要があります。
例えば、GLSurfaceView.RendererのonSurfaceCreated()、onSurfaceChanged()などからは呼び出さないでください。

このページの先頭へ