頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


OpenGLでカメラっぽいことを考えた

よく考えたらOpenGLでカメラが動くような場合にどうするんだろう?ってふと思ってさ。
ネットで調べてもどこもたいして重要な項目としては扱ってないんだ。カメラを動かそうがオブジェクトを動かそうが同じだ、modelViewMatrixでいいでしょ、みたいなことらしいんだけどさ。

とりあえず試してみたのよ。
あるオブジェクトのmodelViewMatrixを作ったとするよ。今までならGPUにこいつを渡すだけなんだけど、ここでカメラを考慮した行列(cameraViewMatirxとでもしておくよ)をかけあわせる。
各オブジェクトのmodelViewMatrixは当然位置や角度などが違うだろうからオブジェクトごとにあるけど、このcameraViewMatirxは当然全オブジェクトに対して同一のモノね。
{
    GLKMatrix4 cameraViewMatrix = GLKMatrix4Identity;

    cameraViewMatrix = GLKMatrix4Translate(cameraViewMatrix, cameraX, cameraY, cameraZ);//平行移動

    cameraViewMatrix = GLKMatrix4RotateX(cameraViewMatrix, cameraRotX);//回転
    cameraViewMatrix = GLKMatrix4RotateY(cameraViewMatrix, cameraRotY);
    cameraViewMatrix = GLKMatrix4RotateZ(cameraViewMatrix, cameraRotZ);

    modelViewMatrix = GLKMatrix4Multiply(cameraViewMatrix,modelViewMatrix);
}
各パラメータが何を指すかとか厳密なことは置いといて、、、
こんな感じでmodelViewMatrixを"修正”すれば今までのコードはほとんど修正しなくてもいいよね。
最初はカメラ用の行列をGPUに渡せるようにしないといけないのかなと思っていたし。

ちなみに平行移動の部分と回転の部分を前後入れ替えると見え方が変わる。


↑平行移動→回転の場合


↑回転→平行移動の場合

どちらもカメラが動いているようなものなので回転による遠心力なんかは当然ないよ。

とりあえずこんな感じで見た目の調整(全体を大きくするとか下にずらすとか)を行えるということがわかったよ。


Bulletでメッシュからsoft bodyを作る

Bulletでsoft bodyを扱う、の続き。
頭と尻尾はくれてやる! / Bulletでsoft bodyの布に剛体を衝突させてみた
↑ここで下側にある布っぽいのがsoft bodyなんだけど、これは平面。
今度は立体でやってみようとしたんだわ。
平面でもBullet内での各点をOpenGLで扱えるようにするのに難儀したので、立体だとどうすんだろ?と思ってたら
btSoftBodyHelpers::CreateFromTriMesh

なんてのがあって、これを使えばBlenderで作って出力したデータを使うことができるみたい。
でやってみたんだけど、、、

Bulletのsoft body 1

ふーん、元のデータが持つ三角形のメッシュ一つごとに剛体を作ってるのか、、、?
確かにBlenderから作ったメッシュのデータをBulletは理解しているっぽい。
ただこのデータは剛体としては問題なかったけど、soft bodyとしてはメッシュが粗いようで上の画像ではもろ三角形が見えている。
じゃあちょっと細かくしてデータを作ってみるか、とBlenderで単純な立方体を細かくして出力。

Blenderで作成した立方体

これ、頂点が900あるの。一辺を5個に分けてるから一つの面に25個の正方形があるでしょ。iOSのOpenGLは三角形しか扱えないからBlenderでも三角形で出力するようにしてる。で、一つの面に50個の三角形、よって50x3=150個の頂点。それが6面で150x6=900個の頂点。
頂点一つでfloatがx,y,zの三つ必要になるわけだけど、、、
これで落ちるのよ(stack over flowじゃないよ)、iPhone 5sでも。
仕方なく頂点の数を1/3くらいに減らして実行してみたんだけど、、、

Bulletのsoft body 2

soft bodyらしくぷるぷる動いてたけど、、、これじゃ使えない。
なんとなく俺の設定が悪いのかなあ?という気がしないでもないけど、soft bodyに注力するより剛体をバネとかで連結した方がいいんじゃないのって気がしてる。
今度はバネを試してみようっと。


Bulletでsoft bodyの布に剛体を衝突させてみた

開発者向けにiOS 8も出てるタイミングでアレなんだけど、OpenGLとBulletでいろいろと試したりしているんだ。
Bulletには剛体(rigid body)以外にもsoft bodyを扱えるというので試してみたんだけど、これがえらく苦労してさ。soft bodyと言ってもどうせ剛体に毛が生えたようなものだろうと思ってたんだけど、痛い目みたよ。



↑とりあえず布のような面(右手前の点だけ固定してない)を作って、そこに上から剛体が落ちるようにしてみた。赤い丸が時々表示されるけど、これはタップした場所でタップすると剛体がランダムな位置に生成されるというだけで本筋とは関係ない。
とりあえずそれらしく動いてるみたい。
布は両辺10分割のCreatePatchで作ってるけど、さすがのiPhone 5s、サクサクだよ!

Bulletでの計算結果をOpenGLで表示させるんだけど、これがまたよくわかんない。
というのもCreatePatchでsoft bodyを作った場合、
const btVector3& position = cloth_softBody->m_nodes[nodeIndex].m_x;
ってな感じで各頂点座標にアクセスするみたいなのよ。さらに
position.x()
position.y()
position.z()
というメソッドで各値を得るようなので、どこかひとつポインタを得ればそれをOpenGL側に渡してやればOKという感じではないみたい。
結局描画のたびにOpenGL(のシェーダ)に渡すための三角形が並ぶような配列を作ってる。他に方法があれば知りたいわ。毎回描画ごとに座標データを取ってきて並べて、、、なんて無駄だよね。どういう方法が定石なんだろ?


ところでBulletでsoft bodyを扱う場合の記事が日本語はもちろん英語でも少ないのよね。ましてiOS用のだとさらに少なくなるし。結局はあちこちで見かけたようにBulletに同梱の SoftDemo.h / SoftDemo.cpp を頼りにするしかないみたい。SoftDemoでの処理の流れを見ながらネットでいろいろ調べて、、、って繰り返し。
どこかにいいチュートリアルがないものか、と思っちゃうよ。


App Annieに新しいアプリを追加する方法

なんやかんやで自分のアプリのダウンロード数チェックなんかはApp Annieを使ってるんだ。iTunes Connectだとサイトもアプリも自分には微妙で、、、

金曜日の午前に審査通過したアプリをApp Annieで見ようと思ってどうやるんだっけ、、、?ってなったのよ。
そもそも最初にどうやって自分のアプリを追加したのかよく覚えてないし。

サイトの隅々を見てもアプリ追加する方法が見当たらないし、ネットで情報探してもそれらしいのが見つからない。
結局ほったらかしにしてたら日曜日の午前に勝手に追加されてるのに気付いたよ。
開発者アカウントそのものを登録してたのね。
ってことで数日待ってればOKだったわ。

ps AdMobはさらに4日後くらいでやっと検索で出てくるようになったよ。


数字認識エンジン搭載!手書きマス計算アプリリリース

先週の金曜日に申請した新しいアプリが今朝無事に審査通過したんだ!WWDC期間中だけど普段通り一週間ほどだったね。

新アプリは百マス計算アプリなんだけど、手書き入力ってところ(だけ)が特徴なのよ。
すでに百マス計算アプリとかはいくつもあるんだけど、手書き入力ってほとんどないんだよね。実際やろうとすると相当面倒だったし。

マス計算アプリ スクリーンショット

↑App Storeアプリのスクショ。
ウルトラ強力な手書き数字認識エンジン搭載!と言いたいところだけど、、、数字が近いと認識できないとかまあ、”強力”にはほど遠く”エンジン"なんて言うのもおこがましいくらいだけど。
丁寧に数字を書けばそこそこ認識してくれると思うんだけど、どうだろう?無料なので試してみてね。


今回のアプリ開発では自己満足的な部分は極力抑え、とにかくスピード優先で開発してみたんだわ。4月から取りかかったのでまる二ヶ月で申請までこぎ着けたことになるなあ。俺にしては相当早い。
特に個人開発ではスピードは神だよね、と最近宗旨替えしたんだよ(ってか今までのんびりしすぎ?)。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.