2009/11/24

SIO2 - マルチタッチを検出する(2) このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

開発環境を iPhone SDK 3.1.2, Xcode 3.2.1, SIO2 intteractive 1.4 に変えて、作っていたプログラムを新たに tutorial062 にマージしたところ、Interface Builder で Multiple Touch にチェックを入れるだけではマルチタッチが検出できなくなってしまいました。

いろいろ調べたり試したりしたところ、Classes/EAGLView.mm の createFramebuffer 関数で EAGLView の multipleTouchEnabled を YES にしたらうまくいくことが分かりました。なにゆえに昔はこうしなくても良かったのかまでは調べていませんが、とりあえずこれで動いてます。Window と View の両方で multipleTouchEnabled=YES にする必要があるとか?(教えて君)

追加後のコードはこんな感じになります。


// EAGLView.mm
- (BOOL)createFramebuffer {
self.multipleTouchEnabled=YES;
glGenFramebuffersOES(1, &viewFramebuffer);

2009/11/12

SIO2 - gluLookAt を使いたい このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

gluLookAt 的な便利関数を使いたい

SIO2 のチュートリアルには画面タップで視点が移動するサンプルが入っていますが、使い慣れた(?) gluLookAt を使いたいなぁと思ったので探してみました。



vectormath を使う

いろいろ調べて試したところ、vectormath を使うのが楽だという結論になりました。


  • 行列、ベクトルなどの演算ライブラリ. LookAt 系関数もあり.

  • SCE 製.

  • BSD license

  • Bullet physics SDK に含まれている.



Bullet physics SDK - SVN trunkのあたりから落とせます。

行列/ベクトル演算ライブラリは DirectX とかだと充実してますが、OpenGL には全然用意されていないので、vectormath みたいなものがあるととても助かります。



使用例

include/vectormath を、例えば template.mm と同じ階層にある Classes/ にコピーして、以下のようにすると使えます。


// template.mm に書く
#include "classes/vectormath/c/vectormath_aos.h"


実際のコード例は以下。いろいろ無駄なことをしているような気もしますが、とりあえずこれでキャラクター視点のカメラワークになります。


// キャラクターの行列を取得
btTransform tr = g_vehicle_phy->getChassisWorldTransform();
VmathMatrix4 m;
tr.getOpenGLMatrix((float*)&m);

// 視点, 見る方向, 上ベクトルを計算
VmathVector4 eye, target, up;
vmathV4MakeFromElems(&eye, 0, -1, 2, 1); //
vmathV4MakeFromElems(&target, 0, 1, 1.5, 1); // Y-front
vmathV4MakeFromElems(&up, 0, 0, 1, 0); // Z-up
vmathV4Add(&up, &up, &eye);
vmathM4MulV4(&eye, &m, &eye);
vmathM4MulV4(&target, &m, &target);
vmathM4MulV4(&up, &m, &up);
vmathV4Sub(&up, &up, &eye);

// (視点, 見る方向, 上ベクトル) を元に view 行列を計算
vmathM4MakeLookAt(&m, (VmathPoint3*)&eye, (VmathPoint3*)&target, (VmathVector3*)&up);

// 設定
glMultMatrixf((float*)&m);




画面

こんな感じ。

20091112_iphone_sio2

2009/11/05

SIO2 - マルチタッチを検出する このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

SIO2 Interactive でマルチタッチを使う方法をまとめます。


マルチタッチを有効にする

少しはまりましたが、ここだけ押さえれば後は普通です。

iPhone Simulatorのマルチタッチが効かないに書いてあるとおり、Interface Builder で Multiple Touch にチェックを入れます。こうしないと、座標が 1 個しか取れないようです。

やり方を詳しく書くと


  1. MainWindow.xib を Interface Builder で開く

  2. Tools -> Attributes Inspector で View Attributes パネルを開く

  3. View タブの Interaction - Multiple Touch にチェックを入れる





SIO2 アプリケーションからの見え方


templateScreenTap()
タップされたとき、指が離れたときに呼ばれる。第二引数に SIO2_WINDOW_TAP_UP または SIO2_WINDOW_TAP_DOWN が来るようです。

templateScreenTouchMove()
ドラッグされたときに呼ばれる。

sio2->_SIO2window->n_touch
現在検出されているタッチ数。

sio2->_SIO2window->touch[i]
各タッチ座標。float x, float y を持つ vec2 型。

sio2->_SIO2window->n_tap
タップ回数。ダブルクリックだと 2, トリプルクリックだと 3, 以下同様。ちょっと(0.7 秒くらい?)時間を空けたり、ある程度離れた部分をタップしたりすると 0 にクリアされます。