2011-01-21 14 views
1

これは簡単なことだと思うかもしれませんが、運がないだけです。コアモーションを使用して電話機の高度と方位を判断する

私ができることを望むのは、コア・モーションを使用して、携帯電話のカメラがどこに向いているかを追跡することです(拡張現実感アプリの一種)。ユーザは、電話機を基準点(写真を撮っているかのように)に向け、ボタンを押して、電話機の位置をオブジェクトに「合わせる」。ユーザーが電話機のカメラを他のオブジェクトに向けてポイントすると、変更電話の高度(-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つは私が理解できない方法で絡み合っている。

私はこれらを分別するために必要な簡単な数学はありますか?繰り返しますが、これは拡張現実感アプリの必要性と思われますが、これを行う例は見つけられませんでした。

+0

まだ問題を解決したことはありますか? –

答えて

1

一般的に、あなたのアプローチは私にとっては妥当なものです。私はTeapotデモアプリで使われているのと同じことだと思います。多分最も簡単な方法は、それをチェックアウトし、それを見ていることです。

CMMotionManager and the Gyroscope on iPhone 4

あなたが将来的に、より複雑な動作を処理することを計画している場合、私はハードな方法、すなわち四元数をお勧めします。はい、それは簡単ではありませんが、一度それを持っていれば非常に便利です。

関連する問題