2011年5月19日木曜日

ARの前にカメラのプレビュー画像とOpenGLの画像を重ねてみた


カメラ用のSurfaceView作って、FrameLayoutでOpenGLのViewと重ねるだけじゃん? って思ってたら結構はまりました。

いろんなところですでに言われてますが、

①普通に考えるとカメラの画像にOpenGLを重ねるので、
カメラビューの追加 → OpenGLビューの追加
となると思いきや、
OpenGLビューの追加 → カメラビューの追加
にしないといけない罠
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  FrameLayout layout = new FrameLayout(this);
  setContentView(layout);  
  layout.addView(new GameView(this, new OpeningScene(), 640, 480));
  layout.addView(new CameraSurfaceView(this));
 }

②OpenGLの方のピクセルフォーマットを透過にしなければいけない罠+ChoosConfigの時にEGL_ALPHA_SIZEを指定しないと機種によっては表示がバグる罠。
※でもなんか、PixelFormat.RGBA_8888でも大丈夫だった、うん?
  getHolder().setFormat(PixelFormat.RGBA_8888);
  getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU);
  getHolder().addCallback(this);
  int[] spec = {
   EGL10.EGL_ALPHA_SIZE,1,
   EGL10.EGL_DEPTH_SIZE,1,
   EGL10.EGL_NONE
  }; 
  EGLConfig[] configs = new EGLConfig[1];
  egl.eglChooseConfig(display, spec, configs, 1, new int[1]);

③glClearColorのアルファの指定を1以外にしないとカメラビューが映らない罠
 public static void clear() {  
  Global.gl.glClearColor(1,1,1,0);
  Global.gl.glEnable(GL10.GL_DEPTH_TEST);
  Global.gl.glDepthMask(true); // 深度バッファ書き込み有効
  Global.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
 }

ARとか程遠い。

2011年5月12日木曜日

縦画面対応


ちなみに前回書き忘れましたがモデルはココのをお借りしております。

2D画像の板ポリを球っぽく並べたまではいいんですが、実はこいつらビルボード化してないのですよな。
ちゅーか、ビルボードの為の計算量がもったいないっちゅーか。 ポイントスプライトってないのかなぁ。

2011年5月6日金曜日

Androidでメタセコイアのmqoファイルを読み込んでみるテスト

エミュレータではとてもじゃないけど開発する気にならない3Dですが、実機(IS01・Life Touch Note)ではサクサク動くので、3Dにも手を出してみることに。

最初はXファイル読み込ませようかとも思ったんですが、あのフォーマットは手に負えないのでメタセコイア(Metasequoia)のtxtのmqoファイルを読み込ます事に。
理論上は完璧だと思ってたら、穴が空きまくったり(DEPTH_SIZEが問題だった)
2Dと両用を考えてたんだけど(3Dだけど、スコア表示は2Dなど)Lief Touch Noteの射影マトリクスのスタックの数が1か2ぐらいしかなくて、glPushMatrix()・glPopMatrix()が役立たずだったりしましたとさ。

ソースコードはもうちょっとリファクタリングしたら晒したいなぁ。

2011年4月25日月曜日

LifeTouchNote買いました

でも、感圧なのでせっかくAndroid2.2なのにマルチタッチが出来ない罠

試しに弾幕作ってみましたが、30FPSぐらいは出る様子。

操作をどうしたもんか・・・。

2011年4月14日木曜日

Garaxy S でOpenGLを使おうとしたらegl_bad_surfaceで怒られる罠

タイトルの通りですが、学生のGaraxySでOpenGLのテストをしてもらおうとしたら、画面の背景色クリアすら行かない状態。

よーくログを見ると、EGL_BAD_SURFACEとか言われてるわけです。

で、調べてみてもよくわからないんですよね。 これまた日本語で見つかる記事は無いし。
読めない英語を頑張って読んでいたら、大分前にこんなのが

ようするに、OpenGLの初期化の段階で

  int[] spec = new int[] {
   EGL10.EGL_RED_SIZE, 5, //赤
   EGL10.EGL_GREEN_SIZE, 5, //青
   EGL10.EGL_BLUE_SIZE, 5, //緑
   EGL10.EGL_DEPTH_SIZE, 1, //深度
   EGL10.EGL_NONE
  };
  EGLConfig[] configs = new EGLConfig[1];
  egl.eglChooseConfig(display, spec, configs, 1, new int[1]);

ってやってる、このRGBのbit指定がダメだ。と。
エミュレータはそこらへんなんか適当なのになぁ。へ・・・へぇーーー。

でも、そのビット指定を外すと

  int[] spec = new int[] {
   EGL10.EGL_NONE
  };

こんな情けない配列になりますけど。 良いですか? 良いんです!!!

でも、こんなんで悩んでる人は今はあまりいないっぽい。 多分だけど、みんなGLSurfaceViewの恩恵に預っているのだろう。

じゃぁなんでGLSurfaceView使わないかって? だってあのGLThreadってFPS指定できないでしょ。多分。

あと、描画メソッドの中で更新もしなきゃならなさそうだし(別スレッドでやる方法もあるんだろうけど、synchronizedで同期とるとかなんか嫌。)
更新→描画→更新 のちゃんとしたゲームループがほしいんだあ。

2011年2月2日水曜日

ようやく仕事が落ち着きそうなので

なんかアンドロイドでゲームでも作りたいもんです。

案1 モザイクブロック崩し
モザイクアプリを以前作ってみたので、それを活かして、なんかエロいようでエロくない微妙な絵をモザイク化して、そのモザイクを破壊していくブロック崩し。
普通のブロック崩しと違うのは、色によってブロックへの衝撃が隣接ブロックにもつながる事。 似た色だとブロックへのダメージがあまり軽減せずに突き抜ける。 逆に全然色が違う場合はほぼ通らない。
こうすれば、「元絵」がそのまま難易度になるんじゃないかなぁ。と。

案2 麻雀パズルゲーム
僕はなんだかんだで麻雀大好きで。 Physx麻雀の作者でもあるわけなんですが・・・。
さすがにAndroidで3D+物理演算とかやりたくない。 というか、IS01では動かなそうなので、発想を変えて、積み上がった麻雀牌をドラッグしていって、面子を作り、手配にスタック。 14枚集まった時点で役判定、点数がそのまま持ち点に加算。もちろん、役が無い場合はフリテンで-8000点 上まで牌がつまったらゲームオーバー。

案3 リアルタイムオセロ
対人戦。 プレイヤーあたりの持ち秒数(例えば3秒)が決まっていて、その間であれば何個でも自分の石を置ける。ただし、挟まれた石は一気に変わるのではなく、置いた石を基点に一つづつゆっくりとひっくりがえっていくので、アクティブに取り返す事が可能。 CPU作るのが大変そう。

どれ作ろうかなぁ。

2011年1月7日金曜日

明けましておめでとう

ございます。
もう1月も7日ですが。

今年の抱負はニコニコでandroid開発の生放送してみたいなとか思ってます。

なんと、今日にでも達成できそうな抱負ですが、個人的にはハードルが高いです。
なんか恥ずいよ。