まだ BigNerdRanch iOS Development book にあります。
加速度計の章では、最初に加速度計の追跡を実装しますが、かなり不安定です。次に、元のコードを変更してローパス フィルターを適用することを提案します。
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
HypnosisView *hv = (HypnosisView *)[self view];
[hv setXShift:10.0 * [acceleration x]];
[hv setYShift:10.0 * [acceleration y]];
[hv setNeedsDisplay];
}
これに:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
HypnosisView *hv = (HypnosisView *)[self view];
float xShift = [hv xShift] * 0.8 + [accel x] * 2.0;
float yShift = [hv yShift] * 0.8 + [accel y] * 2.0;
[hv setXShift:xShift];
[hv setYShift:yShift];
[hv setNeedsDisplay];
}
かなり単純な質問: これらの値はどこから取得するのでしょうか? ドキュメントを調べたところ、次のコードを示唆するローパス フィルターに関する情報が見つかりました。
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
// Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
// Use the acceleration data.
}
ただし、最初にそのコードを試してみたところ、(アプリを分析して)「「*」の左の値はガベージ値です」というエラーが発生しました。加速度計の追跡も機能しませんでした。
これらの値が何を意味するのか、私はかなり混乱しています。たとえば、コードの最初の部分で、なぜ加速値を 10 倍するのでしょうか? 「より大きな」動きを得るには?私はそれをある程度理解することができましたが、ローパス フィルターを使用した 2 番目のコードはまったく意味がありません。