頭と尻尾はくれてやる!

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


フラグメントシェーダに値を渡す

OpenGLで使うフラグメントシェーダって(ざっくり言うと)ピクセルの回数だけコールされるとか言うじゃない。だからできるだけ重複する計算はさせないようにとあらかじめ計算しておいた値を渡しておこうと思ったのよ。
いざやろうとするとフラグメントシェーダにテクスチャ情報以外に何かを渡したことがないことに気付いてさ。バーテックスシェーダからはいろいろ渡したりしてたんだけど。

で、調べてみるととりあえずこういうことでfloatを渡せた。
{
    glUniform1f(location , floatValue);
}
受け取るフラグメントシェーダ側の宣言部分は
uniform highp float value;
みたいな感じでOK。テクスチャの場合とほとんど同じだな。


Bulletで物体が衝突せずにすり抜ける

Bulletでまれに物体同士が衝突せずにすり抜けることがあったんだわ。まるごとすり抜けることもあれば、表面だけすり抜けて物体内部にとどまってしまったりすることも。

前に物体の質量を大きくすればよくなるってどこかで見たような気がしてやってみたけど、改善も限度がある感じ。
どうしたものかなあと思ってたんだけど、再度調べるとこういうページが。

情報メディア実験

ページの下の方にContinuous Collision Detectionの説明があってようやく納得。そういう設定をしないとダメだったのか。Bulletがデフォで考慮してるんだろうなとなんとなく思ってたけど間違いだったよ。
{
    body->setCcdSweptSphereRadius(radius);
    body->setCcdMotionThreshold(threshold);
}
この二つをセットすると劇的に改善したわ。助かった〜


iPhoneカメラ入力画像を60FPSで画像処理したいが

iPhoneのカメラ入力画像に対してGPUで画像処理ってどうやるんだろう?と思って試してたんだけどさ。

過去の流れでCADisplayLink使ってフラグを立てて、そのフラグが立ってる時に
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
メソッド内で画像を得る、みたいな流れでやっていたんだけどどういうわけかiPhone 5sでも最大30FPSくらいしかいかない。

その程度なの?CADisplayLinkが悪いのかな?と思ってCADisplayLinkを使わないでさっきのメソッド内から直接画像処理用のメソッドをコールするように変更してみたけど、やっぱり30FPS程度。

CADisplayLinkを使わず画像処理

CADisplayLinkはデフォで60FPSみたいだし、OpenGLの描画でも60FPSくらい出てたのに。

いろいろ調べてみたところ、どうやらiPhoneのカメラ画像の取得間隔を設定するのがAVCaptureDeviceクラスの
activeVideoMaxFrameDurationってのがあってこれを設定すればいいのか!と思ったんだけど最高でも30FPSまでしか設定できないんだわ、、、

どうすればいいんだろうなあ?


Bulletで穴を作る

そういえば今までBulletでは凸型形状でしか物体を作ったことがなかったんだよね。
つまり、btCollisionShapeオブジェクトはbtConvexHullShapeやbtBoxShapeなどで作っていたんだわ。
これらは凹んでいる部分は考慮されないので穴を作ることはできないはず。

どうやって穴を作ればいいのかなと思って調べるとこういう記事を発見。
btBvhTriangleMeshShape - OOgtech.org

ここにあるようにbtTriangleMeshオブジェクトに三角形の座標を突っ込んでそれでbtBvhTriangleMeshShapeを作る、という方法でどうやら成功。頂点の数、三角形の数、データの数とか何かと注意しないとおかしなことになるよね。

Bulletで作成した穴
↑緑のオブジェクトは中空になってる。

ちなみにbtTriangleIndexVertexArrayで頂点データをまとめるサンプルも見たけど、こちらはなぜかうまくいかなかったな。


ナガシマスパーランドの絶叫マシンに乗ってみた

三重長島への旅行ネタの続き。

最近は脳を刺激するんだ!ってことで普段しないことをするように心がけてるんだ。外食するならなるべく行ったことのないお店に行くとか、行ったことのあるお店へ行ってしまったなら注文したことのないモノを注文するとか。

家族でナガシマスパーランドの遊園地へ行ったんだけど、息子に付き合って子供用の乗り物にばかり乗っていてはダメだ!と思って、、、

ジャイアントフリスビー

↑これに乗ってみたのよ。ジャイアントフリスビーって言うみたい。
これ作った人、かなりクレイジーだ。角度がおかしい。振り子みたいに往復運動するわけだけど、その角度が尋常じゃない。時計で言うと振れ幅が2時と10時くらいになってる。
これは普段できない体験だ!と勇ましく乗ってみわけなんだけど、スピードが最速になるであろう6時の位置あたりで感じるGが半端ない。拷問だ。どうしてお金払って拷問を受けなければいけないんだろう?

あと、ナガシマスパーランドというと俺が真っ先に思い付くのがこれ。

ホワイトサイクロン

↑木造のジェットコースター、ホワイトサイクロン。美しいよね。これも空いてる時間を狙って乗ってみたのよ。ちなみに写真は近くの観覧車から撮影。
木造と言っても木と木を繋ぎ止めてる部材は普通に金属だし、レールも金属だった。そりゃそうか。
幸運なことに最前列に座ることができたんだけどさ。
乗り心地が最悪でお尻が痛い。拷問だ。どうしてお金払って拷問を、、、以下同文。

まあ普段できないことをやって身も心も刺激を受けたことは間違いないわ。




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

FC2Ad