2009/04/09

形が作れるようになったお!


タップした場所のブロックを消せるようになりました。タップした座標(スクリーン座標)と3D空間上の座標を比較するのに結構手こずった。いろいろ調べたところ、以下のような変換が必要でした。

モデル自身の座標 → モデルビュー座標系 → プロジェクション座標系 → ビューポート座標系 → スクリーン座標系

ここで見落としがちなのが「プロジェクション座標系」から「ビューポート座標系」への変換ですね。てっきり、プロジェクション行列をかけた時点で奥行き情報がつぶれてスクリーン上の座標になるのかと思ってたので、得られた数値に定数を掛けたり割ったりで調整しようとして失敗してました。というわけで、プロジェクション変換後に奥行きに従って縦横に座標をつぶすような処理が必要だったわけですね。

詳細は、以下のページを参考にしたので、メモおいておきます。
capa's blog on JUGEM ワールド座標→スクリーン座標変換
MWsite オブジェクト座標系からウインドウ座標系までの変換(JOGL)

さて、先日の隠面消去問題ですが、手抜き対処で対応しました。要は表面よりも側面が弱くなればよいので、側面と表面の接続をあきらめて、隙間があいてしまっても表面を前に出しておけばチラつかないわけです。添付画面の前面と側面の際を見ると細い線が出てますが、これは隙間です。いや、そこを埋める処理もしてみたけど、描画がかなり重かったのでね。ポリゴン数も増えちゃうし。なので、これでいいことにします。

2009/04/08

開発情報メモ

日本人がつまずかないための
iPhone開発ポイント

http://www.atmarkit.co.jp/fwcr/design/benkyo/iphone01/01.html

基本的な内容でしたけど、上記の記事はなかなか参考になります。
有料公開のために、前もって手続きしておくかなぁ・・・。

かなり軽量化、そして隠面消去問題

 まずはかなりの軽量化を達成。23x23x23程度まではすいすい動くようになりました。32x32x32でもなんとか動く感じ。そこまでいくとカクカクですが。
やはりモデル合成が効いてますね。頂点バッファに使用できる変数がunsigned short型なので65536個までの頂点しか保持できない。そこで、ぎりぎりまでを1モデルにして、以降を別モデルとするような合成ルーチンを作成。
 さて、そして2枚目の図の方ですが、いままでキューブの切れ目がわかるように若干間隔を開けて表示してましたが、ぴったり隣り合うようにしたら、見えない側面が表面とのZテストでちらちらでてきたしまった!さて、どうしようかという問題発生。あーうー。

2009/04/06

多少軽くなりました


いろいろとチューンナップして、多少軽くなりました。やった点は以下の通り。
・強引な1ストリップ化をやめて最小限の面でGL_TRIANGLESを使用(無駄なポリゴンが消えてフィルアップかと)
・見えないキューブは非表示に(すべての隣り合う面にキューブが存在している場合は自身を非表示に設定)
・カメラ操作の仕組みを変更(まずあたらしい回転変換、その後累積か移転変換をかける、合計の回転変換をバッファに記憶という流れ、glRotateを使ったらおかしいという問題ではなかった。ローカル/グローバル座標系に対しての理解が甘かっただけでした)

というわけで、添付画像は16x16x16個、合計4096個のキューブが出ているように見える状態です。ま、実際ドローされているのは外周だけなので1352個ですが。
これに加えて、前回のエントリーに書いたモデル合成を使用すればさらにいけるのではないかと考え中。

2009/04/05

描画が重いです。。。


テストで立方体を10 x 10 x 10の合計1000個表示していますが、とても重いです。フレームレートにして秒間15〜20フレームくらいでしょうか。高速化手段はVertex Buffer ObjectとかIndex Buffer Objectを使用してますが、焼け石に水ですね。やっぱりglDrawElementsの回数が多すぎるのかもです。なので、次は表示前にモデルを合成して見ようかなとか思ってます。

カメラ操作は指で動かした方向をとってきてglRotateでモデルビューを回転させてるので、たまにおかしな動きをします。このあたりもプロジェクションビューに切り替えて、カメラの回転もマトリクス使った方がいいような気がしてます。手探りなんでよくわかってませんが。

そんなこんなで、3Dは覚えること多すぎてなかなかすすまなーいw

2009/04/02

3D勉強中

OpenGLなんて触ったことないのですが、勉強中です。
とりあえずティーポットが指で回せるようになりました。

難しいねー。世の中のプログラマさんはすげーなと。

再申請となりました

先週提出したver1.2にバグがあることが判明しましたので、再提出となりました。
バグ自体はすぐ解消したのですが、ビルド設定をうっかり削除してしまって、復旧するまで1日費やしてしまったw
本日修正版を提出したので、来週にはメール機能がついているバージョンを使用できるかと思います。