0

画像(三角形)を回転させて重力に合わせようとしています。そのため、1つのコーナーは常に下になります。しかし、何も役に立ちません。三角形が狂う。

double accelX = motion.userAcceleration.x;
double accelY = motion.userAcceleration.y;
rollingX = (accelX * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
rollingY = (accelY * kFilteringFactor) + (rollingY * (1.0 - kFilteringFactor));
accelX = accelX - rollingX;
accelY = accelY - rollingY;
float angle = atan2(accelY, accelX);

[rootLayer setAnchorPoint:CGPointMake(0.5, 0.5)];
CATransform3D rotation = CATransform3DIdentity;
rotation.m34 = 1.0f / -500.0f;
rotation = CATransform3DRotate(rotation, angle, 0.0f, 0.0f, 1.0f);
rootLayer.sublayerTransform = rotation;
4

1 に答える 1

0

がCMDeviceMotion のインスタンスを参照していると仮定すると、ユーザーの加速度の代わりに重力motionプロパティを使用する必要があります。次に、重力ベクトルを直接、つまりフィルタリングなしで使用する必要があります。ジャイロスコープも使用して精度を高めるため、最も簡単で推奨される方法です。

ジャイロスコープを持たない古いデバイスをサポートするために純粋な加速度計データを使用する必要がある場合は、CMMotionManager のaccelerometerDataプロパティを使用する必要があります。しかし、少しバグがあります。accelXこのコードは、ローパス フィルターのaccelY代わりにハイパス フィルターを適用します。したがって、次のようになります。

double accelX = motionManager.accelerometerData.acceleration.x;
double accelY = motionManager.accelerometerData.acceleration.y;
rollingX = (accelX * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
rollingY = (accelY * kFilteringFactor) + (rollingY * (1.0 - kFilteringFactor));
float angle = atan2(rollingY, rollingX);

filteringFactor<= 0.3で

于 2012-08-10T08:34:19.340 に答える