9

拡張現実カメラビューの画面に画像を配置し、地球上のその位置にとどまることができる拡張現実アプリの構築を開始しているため、カメラビューを持つ他の誰かが来て、拡張現実でそれを見ることができます現実のカメラ ビュー。このためには、方位角と仰角とともに、ある種の距離係数を計算する必要があることを知っています。

そのため、オブジェクトのグラフィックをサーバーに送信して取得する方法はすでに理解していますが、地球に対して元の位置に戻すにはどうすればよいですか。私はそれを計算する必要があることを知っています:

  • 高度
  • 座標
  • 方位角
  • 標高
  • 距離

しかし、これらをどのように計算し、それらを説明するか、それらをつなぎ合わせますか。私の言いたいことを理解していただければ幸いです。

理解を深めるために、アプリの短いデモを紹介します。

男は家にいて、壁の1つに絵のイメージを置くことにしました。デフォルトで拡張現実画面が表示されるアプリを開き、プラス ボタンを押して、フォト ライブラリから画像を追加します。舞台裏では、場所と位置データをサーバーに保存し、アプリとその拡張現実画面を持っている誰かがやって来て、サーバーに上がり、近くに保存されている画像を見つけ、画像をダウンロードして配置します他の人が通り過ぎるときに電話でそれを見ることができるように壁。

これを達成するには、どのようなアプローチを取る必要がありますか? 概要、リンク、リソース、チュートリアル、考え、経験など。ありがとう! これは一般的に書き留めるのが難しい質問でした。ご理解いただければ幸いです。そうでない場合は、教えてください。言い直します。

ローハン

4

2 に答える 2

19

私は次のことを行う 2 つの AR iOS アプリに取り組んでいます: 方位角 (コンパス、水平角) と仰角 (ジャイロスコープ、垂直角) を 3D 空間の位置に変換します (例: 球面からデカルト)。

必要なフレームワークは次のとおりです。

  • コアロケーション
  • コアモーション

地理位置情報 (座標) を取得することは、緯度、経度、および高度について非常に簡単です。この情報は、いくつかのオンライン ソースで簡単に見つけることができますが、これは電話したCLLocationManagerDelegate後に必要な主な電話startUpdatingLocationです。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    latitude = (float) manager.location.coordinate.latitude;
    longitude = (float) manager.location.coordinate.longitude;
    altitude = (float) manager.location.altitude;
}

方位角を取得することも非常に簡単で、呼び出し後に場所と同じデリゲートを使用しますstartUpdatingHeading

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    azimuth  = (float) manager.heading.magneticHeading;
}

標高は、デリゲートを持たないジャイロスコープから抽出されますが、セットアップも簡単です。呼び出しは次のようになります (注: これは、横向きモードで実行されている私のアプリで機能します。あなたのものを確認してください)。

elevation = fabsf(self.motionManager.deviceMotion.attitude.roll);

最後に、次のように方向座標を 3D ポイントに変換できます。

- (GLKVector3)sphericalToCartesian:(float)radius azimuth:(float)theta elevation:(float)phi
{
    // Convert Coordinates: Spherical to Cartesian
    // Spherical: Radial Distance (r), Azimuth (θ), Elevation (φ)
    // Cartesian: x, y, z

    float x = radius * sinf(phi) * sinf(theta);
    float y = radius * cosf(phi);
    float z = radius * sinf(phi) * cosf(theta);
    return GLKVector3Make(x, y, z);
}

この最後の部分では、角度と軸の命名規則はソースごとに大きく異なるため、十分に注意してください。私のシステムでは、θ は水平面上の角度、φ は垂直面上の角度、x は左右、y は上下、z は前後です。

距離に関しては、実際に使用する必要があるかどうかはわかりませんが、使用する場合は「半径」に置き換えてください。

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

于 2012-12-28T14:54:04.817 に答える