FC2ブログ

Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://android20092009.blog67.fc2.com/tb.php/41-47853a9d
この記事にトラックバックする(FC2ブログユーザー)

三次元コンパスを作ってみた

SDK1.5r3

ソースコード

センサー、カメラ、OpenGLときたので組み合わせてみました
というより元々ARモドキをやるために下準備をしていたわけですが

んで、カメラをSurfaceView、OpenGLをGLSurfaceViewにして重ねてみたんですが、
GLSurfaceView側で背景を消すのでうまくいかず…
そんなときはググレカスというわけで調べてみたところこんな素敵なものが

Camera image as an OpenGL texture on top of the native camera viewfinder

カメラ画面をキャプチャしながらOpenGLのテクスチャとして使っているサンプルです

キモとしては
・OpenGL側をPixelFormat.TRANSLUCENTで半透明化する
・カメラViewを上にして、OpenGL側のモデルを透かせる
・glClearColorで背景を塗りつぶさない
といった感じです

こんな感じで動いてます
Compass3Da.jpg
ロールにも対応しています
Compass3Db.jpg

動かしてみるとわかりますが、反応遅いです。カメラをPUSH_BUFFERにして処理を食われているせいかなと思われます
あと割り込みかかるとワイヤーフレームが止まるのなんで?電話ボタンも効かなくなるし…
この辺は修正課題ですけど今回は「ARっぽい(?)もの作る!」が御題なのでとりあえずこんなもんで


全部説明してると大変なので今までと違うところをちょこちょこと

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.sample.Compass3D"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="true"
>
<activity android:name=".Compass3D"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-sdk android:minSdkVersion="3" />
</manifest>

「android:debuggable="true"」はデバッグモードです
このパラメータの結果はCompass3D.java内の以下のコードで拾えます

   // デバッグモード確認
public static boolean isDebug(){
PackageManager manager = mContext.getPackageManager();
ApplicationInfo appInfo = null;
try {
appInfo = manager.getApplicationInfo( mContext.getPackageName(), 0);
} catch (NameNotFoundException e) {
return false;
}
f( ( appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE ) == ApplicationInfo.FLAG_DEBUGGABLE ){
return true;
}
return false;
}

Contextが拾えるところではデバッグモードの確認ができます。

続いてmain.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<!-- OpenGLClass -->
<test.sample.Compass3D.OpenGLClass
android:id="@+id/OpenGLClass"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

<!-- CameraClass -->
<test.sample.Compass3D.CameraClass
android:id="@+id/CameraClass"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

<!-- DebugClass -->
<test.sample.Compass3D.DebugClass
android:id="@+id/DebugClass"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</FrameLayout>
</LinearLayout>

前述のようにOpenGL→カメラ→デバッグの順位になっています

OpenGLClass.javaの初期化部分の一部です

// 初期化
private void Init( Context ctx ){
mContext = ctx; // リソースを拾うため

// レンダラーの指定
this.setEGLConfigChooser(5, 6, 5, 8, 16, 0);
this.setRenderer( this );
this.getHolder().setFormat( PixelFormat.TRANSLUCENT ); // 画面の抜け設定

「setEGLConfigChooser」でRGB深度の指定をします
そしてGLSurfaceViewのHolderのフォーマットを「PixelFormat.TRANSLUCENT」で抜けにしています
これは「APIDemo」の「Glaphics」→「OpenGL ES」→「Translucent GLSurfaceView」でも同じことをしています

いままであった「onSurfaceCreated」内の「glClearColor」はコメントアウトして止めています
忘れるとカメラ画像が出ません。

最後に方位表示

// 南描画
gl.glPushMatrix(); //現在のモデルビュー行列を記憶
gl.glTranslatex( (int)(1.0f*ONE), 0, (int)(1.0f*boxPoint*ONE) ); // 平行移動
// gl.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f ); // 回転
gl.glRotatex( 180*ONE, 0, ONE, 0 ); // 回転
gl.glBindTexture( GL10.GL_TEXTURE_2D, textureId[1] );
gl.glVertexPointer( 3, GL10.GL_FIXED, 0, boxBuff ); // 表示座標のセット
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, boxTextureBuff ); // テクスチャのセット
gl.glDrawArrays( GL10.GL_TRIANGLE_STRIP, 0, 4 );
gl.glPopMatrix(); //記憶しているモデルビュー行列に戻す

「glPushMatrix」「glPopMatrix」で前に処理された平行移動行列、回転行列
をバッファに待機、回復させています
「glTranslatex」は平行移動行列の指定です。この元の四角は原点からX方向に2のサイズで表示しているため
X方向に1移動し、Y方向にboxPoint(今回は5)だけ平行移動させます
「glRotatef」は回転の指定です。元座標系のY軸を中心に180度回転させています

あとは視点の変更とカメラの上方向の計算をしていますがただのベクトル計算なので省略

カメラ、デバッグ画面は特に何もしていないので説明略

こんな感じでARっぽいものは出来ているということで。
Cameraで苦戦したので今後「SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS」を使わない実験を
してみようかと思ってます
いじってて液晶にCamera画像を出さずに撮影できてしまうことに気づいたのは内緒w
あたりまえですけど悪用されても困るので秘密
スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://android20092009.blog67.fc2.com/tb.php/41-47853a9d
この記事にトラックバックする(FC2ブログユーザー)

Appendix

プロフィール

Ukai2009

Author:Ukai2009
FC2ブログへようこそ!

最新記事

検索フォーム

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。