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 度空に向けられている場合、携帯電話を方位角に動かすと、高度コンポーネントも変更されます。この二つは、私には理解できない形で絡み合っています。

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

4

1 に答える 1

1

一般的に、あなたのアプローチは私には合理的に聞こえます。Teapotのデモアプリで使われているものと同じだと思います。おそらく最も簡単な方法は、それをチェックアウトして見てみることです。

iPhone 4 の CMMotionManager とジャイロスコープ

将来、より複雑なモーションを処理する予定がある場合は、ハードな方法、つまりクォータニオンをお勧めします。ええ、そう簡単ではありませんが、一度取得すると非常に便利です。

于 2011-02-01T22:27:24.800 に答える