質問

ここで考えたり検索したりする問題があり、見るべき良い方向が見つかりません...デバイスの動きを利用して、360度画像(球体状)内を移動するアルゴリズムを開発したいと考えています。

したがって、ユーザーがデバイスを目の前に向けると、画像の決定された原点が得られます。彼が自分の周りでデバイスを動かすと、それに応じてパノラマ画像も動きます。

調べられるアイデアや情報源はありますか?

Swift を使っている皆さんに感謝と幸運を祈ります :)

役に立ちましたか?

解決

あまり計算の手間をかけずにこれを実装する簡単な方法が 2 つあります。

  1. オイラー角を使用します。つまり、の CMAttitude のロール プロパティ. 。画像の幅と測定された角度の間のマッピングを定義し、180° / -180° の特異点に注意します。このアプローチの欠点:
    • 考えられる危険性 ジンバルロック ユーザーがデバイスを無秩序に動かし始めたとき。
    • フル 3D ビューに関する拡張性についても同様です。
  2. 使用 CMDeviceMotion からの磁場 ジンバルロックに強いです。磁力計は加速度計/ジャイロよりも少し遅いですが、CoreMotion の融合アルゴリズムが合理的な推定を提供してくれるので、これは重要ではないと思います。ここでの欠点:
    • 磁場は常に利用できるわけではなく、あるいはわずかに不正確になる傾向があります。
    • 3D ビューに拡張するのは面倒かもしれません。

どちらのアプローチも実装は非常に簡単なので、どちらか 1 つから始めます。さらに洗練された解決策が必要な場合は、数学をもう少し深く掘り下げる必要があります。この場合、考えられる解決策は、現在のデバイスの標準 (s.例えば iOS デバイスへの法線ベクトルの検索)、それを地表面に投影し、円筒パノラマの角度のデルタを取得します。

この場合、法線ベクトルを直接使用できるため、球投影がさらに簡単になります。

他のヒント

Kayのおかげで、私はこの効果を達成するために正しいトラック上にいるかもしれません。

私は同じことを探している人にもっと詳細を提供するだけで、この答えをしています。

最初にCmMotionManagerオブジェクトを作成する必要があります。

はStartDeviceMotionUpdateSequeueを使用してモーションイベントを処理します。

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
    [self processMotion];
}];
.

ProcessMotionの場合、前の1つに基づいて態度を得る必要があります。

// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];
.

最後の更新以来、ユーザーによって作られた新しい角度を知っています。 それからあなたがあなたのビューを扱うところで新しいユーラーの角度をあなたの画像を移動するために必要なピクセルの量に変換します。 慎重なオイラー角は、-180,180の間で変化し、リンゴによってradで与えられます。これは便利なものかもしれません:

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))
.

だから私はX軸に移動するだけで新しいXオフセットを計算するだけです。

これが役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top