これは簡単なことのように思えますが、運が悪いだけです。
私ができるようにしたいのは、コアモーションを使用して、電話のカメラがどこに向けられているかを追跡することです(一種の拡張現実アプリの場合)。ユーザーは電話を基準点に向け (写真を撮るかのように)、ボタンを押して電話の位置をオブジェクトに「位置合わせ」します。ユーザーが携帯電話のカメラを他のオブジェクトに向けると、携帯電話の高度 (-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 度空に向けられている場合、携帯電話を方位角に動かすと、高度コンポーネントも変更されます。この二つは、私には理解できない形で絡み合っています。
これらを分解するために必要な簡単な数学はありますか? 繰り返しますが、これは拡張現実アプリに必要な必要性だと思いますが、これを行う例を見つけることができませんでした.