加速度センサ サンプル
加速度センサを使うには、UIAccelerometerDelegateをdelegateしたいオブジェクト(controlerとかviewとか)にプロトコルを追加。具体的には
// UIViewにUIAccelerometerDelegateプロトコルを追加 @interface EAGLView : UIView <UIAccelerometerDelegate> { とか // アプリクラスにUIAccelerometerDelegateプロトコルを追加 @interface MyAppDelegate : NSObject <UIApplicationDelegate,UIAccelerometerDelegate> { とか こんな感じで追加したいトコに記述(ViewControllerとかのがいいかも)
これで初期化時に以下の記述を追加してやれば、加速度センサイベント起きるようになる
UIAccelerometer *theAccelerometer = [UIAccelerometer sharedAccelerometer]; theAccelerometer.updateInterval = 1 / 100; //検出頻度 theAccelerometer.delegate = self; //←これはもちろんプロトコル追加したクラスを設定
以下、公式のGLGravityサンプルから抜粋。
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)accel { //Use a basic low-pass filter to only keep the gravity in the accelerometer values const double kFilteringFactor = 0.1; // 0.1なら10回、0.01なら100回 分を平均化 accel[0] = accel.x * kFilteringFactor + accel[0] * (1.0 - kFilteringFactor); accel[1] = accel.y * kFilteringFactor + accel[1] * (1.0 - kFilteringFactor); accel[2] = accel.z * kFilteringFactor + accel[2] * (1.0 - kFilteringFactor); }
ローパスフィルタって書かれてるけど、要はkFilteringFactorをかけて(10で割る)、割った値を前回の値に足し込んでって平坦化するって事。それによってノイズ除去して安定した値を取得したいと。
old = now x 0.1 + old x 0.9
old = now / 10 + (old / 10) x 9
kFilteringFactorが0.1の時、新しい値を10分の一ずつ足し込んでいく事で、10回かけて本来の値に近づく(途中経過が平坦になる)
kFilteringFactorを0.01とか小さく設定すればノイズも減りますが、当然、機敏な動作の検出とかはできなくなっていきます。この辺、やってみて調節って感じでしょうね。
以下、参考にしたサイト等
http://d.hatena.ne.jp/glass-_-onion/20081121/1227194373#c