2

私のアプリでは、加速度計を使用してゲーム内のキャラクターを制御しています。現在、縦向きのみを許可しているため、ユーザーはキャラクターを移動するためにデバイスを右または左に傾ける必要があります。それは今のところうまくいっています。私が今達成しようとしているのは、ユーザーがプレイしている現在の傾きを考慮して加速度計を「調整」することです。ユーザーが横になっているとしましょう。開始点が考慮されていないため、値が歪んでしまい、キャラクターを制御できなくなります。そのため、最初の傾斜量を考慮してから、ゲーム中にそれを考慮しようとしていますが、機能していません。

そのため、ゲーム以外のビューに加速度計を「調整」するためのボタンがあり、これが実行するコードです。

これはIBActionにあります

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0f/30.0f];
[[UIAccelerometer sharedAccelerometer] setDelegate:self];

これは加速度計のデリゲート呼び出しです

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"];
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
}

次に、init のゲーム ビューで、iVar calibrationFloat を NSUserDefaults で設定した値に設定します。次に、小さなジッターを取り除くための kFilteringFactor もあります。これは、rollingX をすべてに等しく設定し、rollingX に基づいてキャラクターを移動するゲームの加速度計デリゲート メソッドです。

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
}

ただし、これは機能していません。キャリブレーションは何もしていないようで、その理由はわかりません。これが機能しない理由を設定した人はいますか?

4

1 に答える 1

2

私はあなたにいくつかの指針を与えることができます。RollingX の計算が正しくありません。-1 ~ +1 の範囲外の値が返されます。制限に達したことを検出して適切に調整する方法が必要です。また、単に 1 つの軸をオフセットしても機能しません。加速度計は 3D 空間で動作します。計算が正しく機能するためには、電話は常に z 平面で 0 でなければなりません。ユーザーが電話を z 平面に近づけるほど、デバイスが x 平面に出力する読み取り値が小さくなります。加速度計は重力を感知するため、平面はこれに対して固定されます。

効果的なキャリブレーションを実行するには、重み付けされたオフセットが必要になるため、すべての 3 軸に連続的な行列変換を適用する必要があります (たとえば、z が大きくなると、x ではなく y に注意を払うなど)。

于 2012-11-09T11:20:54.437 に答える