2009/04/27

パレット改良


テクスチャ選択画面と釣り合うようにクオリティアップさせました。機能は変わらず。

2009/04/26

盛るぜ〜盛るぜ〜、超盛るぜ〜♪


初期の固まりよりも大きく盛れるようにしてみた。それと同時に、固まりのサイズに応じて注視点とスケールが変わるようにした。これによってメモリ上は大きく確保しておいて、表示物だけ初期値を小さく作っても、のちのちの増殖に対応できるようにした形になります。

2009/04/25

Space Deadbeef

 今日、業界の人との飲み会にいってまいりましたが、まさか昔僕の1つ上でいらした先輩がiPhoneゲーム作ってたとは!
 というわけで、ご紹介します。

 Space Deadbeefという横スクロールシューティグ。敵をフリックすることでロックオン、離せばミサイル発射!指をタッチしているところに向かって自機は進んでいくので、敵の攻撃をさけることもできるというゲームです。感覚的にはRayforceに近いですかね。まさかこんなゲームがiPhoneでできるとは。そして無料です。やっぱり先輩は違うなぁと思った次第です。

 みなさんもよろしければぜひ!

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=297048779&mt=8

2009/04/24

アイコンを整備しました


テクスチャ選択の画面。なかなかよくできた。

でも、これがよくできすぎてて色選択のパレットがへぼく見える。
どうにかしないとな。

パレット自体をもっと年季の入ったやつにするか。あるいは、試験管に変えようか。

2009/04/23

好きな写真を貼れるよ


カメラを使ったりアルバムの写真を使ったりで、好きな写真を貼れるようにしました。
これでかなり遊べるんじゃないかなと。

そろそろセーブデータについて考えようかなという段階に近づいてきました。

2009/04/21

テクスチャ投影


 テクスチャの投影ができるようになりました。カメラから平行投影、あるいはパースペクティブに投影のようなことができます。とりあえず木のテクスチャ貼ってみたら木を崩しているような感じになりました。いやぁ、楽しいなあ。

 UV値は投影が指示された時点でその場で投影計算をして算出してます。3D空間上の頂点をフレームバッファへ投影し、その座標からテクスチャ上の2D座標へスケール調整するような感じですね。その際に、カメラ座標系にするか、スクリーン座標系にするかで奥行きに対してのつぶしが変わりますので、パースがかかったりかからないで平行投影になったりするということになります。

2009/04/19

Cubing Timer ver1.2

昨日ですが、ようやく審査が通りました。
新機能は以下になります。
お待たせしました。これでスクランブル後の色配置を見る以外はできあがって、練習用に使えるようになったかと思います。

JP
- 計測履歴をメールで転送できるようになりました。
- ローリング計測ができます。(12回以上計測するとローリングアベレージ表示になります)
- 計測結果を消去して再計測ができるようになりました。
- OS2.0以降に対応。

ENG
- You can send the measurement history by mail.
- You can measure rolling average. (It is changed to the rolling average mode when measuring it more than 12 times. )
- You can delete the measurement result, and can measure it again.
- It can run in OS2.0 or later.

ズーム機能


 ズーム機能を入れました。あと、カメラを回す機能もついでに。インターフェース的には左下のアイコンを触れているときだけ臨時で機能がオンになる仕様。これならiPhoneを左手で持ちながら一時的にズームにして、右手で色を塗ったり操作できるという感じになります。

 こないだのレイキャストによるコリジョン計算が、プロジェクションの逆マトリクスを使用して原点からカメラ座標へ逆変換するということをしてるのですが、この逆変換がどうやらカメラの移動に関しては効かない様子。カメラ座標を若干移動した分に関しては自前で逆変換しないとだめなようでした。

2009/04/18

より正確なコリジョン計算を


 なかなかいろいろな進展がありました。

 まずは、描画で、面と面の継ぎ目部分をつないでしまうと隣の面の側面が表面まで出てきてチラチラしてしまう問題がありましたが、それを完全に解消しました。隣のキューブの存在の有無を調べてそれに応じて面の表示をするかどうかを変えるようにしたところ、表示もきれいになったのは当然として(左の画像)、画面に描画されている無駄なポリゴンがなくなったことでだいぶ高速に動作するようになりました。いまでは20x20x20くらいでもヌルヌルです。

 そして、コリジョン関係をより丁寧なものに変更。見えている中での判別としたかったので、キューブが隣り合う面のどちらから見えているのかによってオブジェクトとしての法線を用意し、その法線とレイキャスト用のベクトルでキューブが見えているかどうかを判定するようにしました。それによって、すべてに対してレイキャスト計算をしないでよくなったため、若干の高速化も達成。高解像度キューブでの動作が多少快適になりました。

 あと、カメラ操作。ちょっとしたアイデアでしたが、画面端の方をフリックする際には視点座標系のZ軸を中心に回転するようなニュアンスにしました。普通の3Dツールだとそういうのはありませんが、これはこれでいい感じかと。

 そんなこんなで盛りだくさんな更新でした。そろそろ完成が見えてきたかな?

2009/04/17

色塗れるぞ


 パレットで選んで、ブロックに色を付けられるようになりました。ただ、塗る先の選択がなかなか思った通りにいかないので、座標の判定方法を変えてみました。
 以前は、3D空間上の座標をスクリーン座標系へ変換し、スクリーンをタップした座標を比較、あたったもののうち手前にあるものを優先で選択させるという方法をとってましたが、今回はカメラ座標からスクリーンをタップした座標を通過するベクトルが、3D座標上のブロック(球で判定してますが)にあたるかどうかを判別し、手前のものを優先するとしました。ま、ちょっとはましになったけど、やっぱ奥のものを選ぶのが難しい。混み合っているところを選択させるには、カメラのズームを入れないとだめかもですね。なにかいいズームのUI考えないとね。

2009/04/15

パレット作成中...


結構おしゃれにできてきたんではないかと。

これでカラー選択して、ボックスに塗っていければなと。

2009/04/12

コマンドメニューつけてみた


掘削の機能をいろいろ用意して、選ばせるメニューをつけてみた。武器とか並んでて楽しそうでしょw

・手袋:物体を回してみるモード
・短剣:1個づつブロックを消すモード
・モーニングスター:中心の1個とその周り上下前後左右を1個づつ消すモード
・長剣:なぞった部分を貫通しながらズバズバ消していくモード
・岩:ブロックを1個追加するモード

ってのをとりあえず実装。消すモードはいいんですけど、追加するモードの追加部分の選出がうまくいかないなぁ。一番手前でなおかつ隣り合うブロックが存在していることを条件にしているけど、それだと思った場所にブロックを置けないことがあるんですわ。見えてる中で一番奥ってのを割り出せるといいんですけどね。

・フラスコ:色をつける
・本:セーブとか

なんてのを考えてますが、当分先かな。

2009/04/10

Cubing Timer またもリジェクト

メール送信についてのUI設計に問題があるとのことです。これについては指摘はありませんでしたが、履歴の削除ボタンや全選択ボタンについても同様のことがいえますね。要は何かを行おうとした際に、条件を満たしていなくて実行できない状態であることをユーザーにわからせないといけない、あるいは、実行できない状況であれば、原因はともかく実行できないんだなと思わせるようなアフォーダンスが無いとならないわけですな。至極当たり前のことでした。チェック不足というか、自分本位になりすぎてたな。反省します。

現状は、履歴が1つも無い状態で削除ボタンやメールボタン、全選択ボタンを押しても何も起きない。全選択ボタンは反応がないだけでまだましだが、削除やメールについては「メール送信しますか」のようなダイアログを出して実行させた上で何も起きないので、たちが悪いですね。

本日訂正版を提出できそうなので、新バージョンはまた来週までお待ちください。

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
本日修正版を提出したので、来週にはメール機能がついているバージョンを使用できるかと思います。