私は次のことを行う 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 は前後です。
距離に関しては、実際に使用する必要があるかどうかはわかりませんが、使用する場合は「半径」に置き換えてください。
それが役立つことを願っています