これは簡単なことだと思うかもしれませんが、運がないだけです。コアモーションを使用して電話機の高度と方位を判断する
私ができることを望むのは、コア・モーションを使用して、携帯電話のカメラがどこに向いているかを追跡することです(拡張現実感アプリの一種)。ユーザは、電話機を基準点(写真を撮っているかのように)に向け、ボタンを押して、電話機の位置をオブジェクトに「合わせる」。ユーザーが電話機のカメラを他のオブジェクトに向けてポイントすると、変更電話の高度(-90°〜+ 90°)と方位角(0°〜360°)を決定する必要があります。
CMAttitudeによって与えられたオイラー角は、私が必要とするようには見えません。私はユーザーが "整列"をヒットしたときに取得されたCMAttitudeをキャッシュしようとしました。その後、ユーザーが電話機を動かすと、新しいCMAttitudeが取得され、multiplyByInverseOfAttitudeを使用して基準姿勢との違いを判断します。
- (void)checkForMotion {
CMMotionManager *motionMgr = appDelegate.motionMgr;
CMDeviceMotion *deviceMotion = motionMgr.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
if (referenceAttitude != nil)
{
[attitude multiplyByInverseOfAttitude: referenceAttitude];
double deltaAlt = attitude.pitch;
double deltaAzm = attitude.roll;
// Do something with deltaAlt and deltaAz
}
else
{
NSLog(@"Getting new referenceAttitude");
self.referenceAttitude = attitude;
}
}
しかし、これは正しい結果を生むものではありません。電話が縦に(長軸上に)保持されている場合、deltaAltは正常に機能します。電話機が地平線(alt = 0)を指している限り、deltaAzmも正しいです。しかし、電話機が空に45度の方向を指している場合、電話機を方位角方向に動かすと高度も同様に変更されます。 2つは私が理解できない方法で絡み合っている。
私はこれらを分別するために必要な簡単な数学はありますか?繰り返しますが、これは拡張現実感アプリの必要性と思われますが、これを行う例は見つけられませんでした。
まだ問題を解決したことはありますか? –