استخدام علامات الارتساء الجغرافي المكاني لاختيار موضع المحتوى في الواقع على iOS

تعتبر علامات ارتساء الموقع الجغرافي المكاني نوع من الارتساء الذي يسمح لك بوضع محتوى ثلاثي الأبعاد في العالم الحقيقي.

أنواع ارتساء الأماكن الجيوفضائية

هناك ثلاثة أنواع من نقاط الربط الجغرافية، يتعامل كلّ نوع منها مع الارتفاع بشكلٍ مختلف:

  1. علامات ارتساء WGS84:
    تتيح لك علامات ارتساء WGS84 وضع محتوى ثلاثي الأبعاد في أي خط عرض محدد، وخط الطول والارتفاع.

  2. نقاط تثبيت التضاريس:
    تتيح لك نقاط تثبيت التضاريس وضع المحتوى باستخدام خط العرض وخط الطول فقط مع ارتفاع نسبي للتضاريس في هذا الموضع. يتم تحديد الارتفاع بالنسبة إلى الأرض أو الطابق كما هو معروف من قِبل VPS.

  3. نقاط التثبيت على السطح:
    تسمح لك نقاط التثبيت على السطح بوضع المحتوى باستخدام خطي الطول والعرض فقط مع ارتفاع نسبي لسطح المبنى في هذا الموضع. يتم تحديد الارتفاع بالنسبة إلى قمة المبنى كما هو معروف بواسطة هندسة التجوّل الافتراضي. سيتم ضبط هذه القيمة تلقائيًا على ارتفاع التضاريس في حال عدم وضعها على مبنى.

WGS84 التضاريس على السطح
موضع أفقي خط العرض وخط الطول خط العرض وخط الطول خط العرض وخط الطول
موضع رأسي نسبةً إلى ارتفاع WGS84 نسبةً إلى مستوى التضاريس الذي تحدّده "خرائط Google" بالنسبة إلى مستوى سطح السطح الذي تحدّده "خرائط Google"
هل يجب حلّ المشاكل في الخادم؟ لا نعم نعم

المتطلبات الأساسية

تأكّد من تفعيل واجهة برمجة التطبيقات Geospatial API قبل المتابعة.

وضع علامات ارتساء الجغرافيا المكانية

ويتضمّن كلّ نوع من أنواع الارتساء واجهات برمجة تطبيقات مخصَّصة لإنشائها. يمكنك الاطّلاع على أنواع ارتساءات المواقع الجغرافية المكانية للحصول على مزيد من المعلومات.

إنشاء إعلان ثابت من اختبار نجاح

ويمكنك أيضًا إنشاء مراسي جغرافي مكاني من نتيجة اختبار النتائج. استخدِم عنصر التحويل من اختبار الارتطام وحوِّله إلى GARGeospatialTransform. استخدِمه لوضع أيٍّ من أنواع الارتساء الثلاثة الموضّحة.

الحصول على تحويل جغرافي من تحويل الواقع المعزّز

يوفّر GARSession.geospatialTransformFromTransform:error: طريقة إضافية لتحديد خط العرض وخط الطول من خلال تحويل "تحويل الواقع المعزّز" إلى "تحوّل جغرافي مكاني".

الحصول على تحويل الواقع المعزّز من تحويل جغرافي

تحوِّل دالة GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error: الموضع الأفقي والارتفاع ودرجة دوران الرباعي وفقًا لنظام إحداثيات الشرق والشمال والجنوب إلى عملية تحويل الواقع المعزّز وفقًا لنظام إحداثيات GL العالمي.

اختيار الطريقة التي تناسب حالة الاستخدام

لكل طريقة من طرق إنشاء عنصر الربط توازنات مرتبطة يجب أخذها في الاعتبار:

  • عند استخدام هندسة المشهد في الشوارع، استخدِم اختبار التصادم لإرفاق المحتوى بمبنى.
  • استخدِم نقاط تثبيت التضاريس أو أسطح المنازل بدلاً من نقاط تثبيت WGS84 لأنّها تستخدِم قيم الارتفاع التي تحدّدها "خرائط Google".

تحديد خط العرض وخط الطول لموقع جغرافي

هناك ثلاث طرق يمكنك من خلالها احتساب خطوط الطول والعرض لموقع جغرافي:

  • يمكنك استخدام Geospatial Creator لعرض محتوى ثلاثي الأبعاد حول العالم وتعزيزه بدون الحاجة إلى الانتقال إلى موقع جغرافي فعليًا. يتيح لك ذلك وضع محتوى ثلاثي الأبعاد غامر باستخدام "خرائط Google" في محرِّر Unity. سيتم تلقائيًا احتساب خط العرض وخط الطول ودرجة الدوران والارتفاع للمحتوى.
  • استخدام خرائط Google
  • استخدِم Google Earth. يُرجى العِلم أنّ الحصول على هذه الإحداثيات باستخدام Google Earth، بدلاً من "خرائط Google"، سيؤدي إلى هامش خطأ يصل إلى عدة أمتار.
  • الانتقال إلى الموقع الجغرافي

استخدام خرائط Google

للحصول على خط العرض وخط الطول لموقع باستخدام خرائط Google:

  1. انتقِل إلى خرائط Google على الكمبيوتر المكتبي.

  2. انتقل إلى الطبقات > المزيد.

  3. غيِّر نوع الخريطة إلى القمر الصناعي وأزِل العلامة من مربّع الاختيار عرض الكرة الأرضية في أسفل يمين الشاشة.

    سيؤدي ذلك إلى فرض منظور ثنائي الأبعاد وإزالة الأخطاء المحتملة التي قد تنتج عن عرض بزاوية ثلاثية الأبعاد.

  4. على الخريطة، انقر بزر الماوس الأيمن على الموقع الجغرافي واختَر خط الطول/خط العرض لنسخهما إلى الحافظة.

استخدام Google Earth

يمكنك احتساب خط العرض وخط الطول لموقع جغرافي من Google Earth من خلال النقر على موقع جغرافي في واجهة المستخدم وقراءة البيانات من تفاصيل العلامة المكانية.

للحصول على خط العرض وخط الطول لموقع جغرافي باستخدام Google Earth:

  1. انتقِل إلى Google Earth على الكمبيوتر المكتبي.

  2. انتقِل إلى قائمة الهامبرغر واختَر نمط الخريطة.

  3. أوقِف مفتاح التبديل المباني الثلاثية الأبعاد.

  4. بعد إيقاف مفتاح المباني ثلاثية الأبعاد، انقر على رمز الدبوس لإضافة علامة موضعية في الموقع المحدد.

  5. حدّد مشروعًا لتضمين علامتك الموضعية وانقر على حفظ.

  6. في حقل العنوان للعلامة الموضعية، أدخِل اسمًا للعلامة الموضعية.

  7. انقر على سهم الرجوع في لوحة المشروع واختَر إجراءات إضافية.

  8. اختر تصدير كملف KML من القائمة.

يعرض ملف KLM خطوط الطول والعرض والارتفاع لعلامة مكان في علامة <coordinates> مفصولة بفواصل، على النحو التالي:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

لا تستخدِم خطوط الطول والعرض من علامات <LookAt> التي تحدّد موضع الكاميرا وليس الموقع الجغرافي.

الانتقال إلى الموقع الجغرافي

يمكنك حساب ارتفاع الموقع من خلال الذهاب إلى هناك فعليًا وإجراء ملاحظة محلية.

الحصول على رباعي الأبعاد للتناوب

تستخرج أداة GARGeospatialTransform.eastUpSouthQTarget الاتجاه من التحويل الجغرافي المكاني وتُنتج رباعيًا يمثل مصفوفة الدوران التي تحوِّل المتّجهًا من الهدف إلى نظام الإحداثيات من الشرق إلى الأعلى والجنوب. تشير القيمة الموجبة لسمة X إلى الشرق، وتشير القيمة الموجبة لسمة Y إلى الأعلى، وتشير القيمة الموجبة لسمة Z إلى الجنوب. يتم كتابة القيم بالترتيب {x, y, z, w}.

علامات ارتساء WGS84

عنصر التثبيت WGS84 هو نوع من عناصر التثبيت التي تتيح لك وضع محتوى ثلاثي الأبعاد في أي خط عرض وخط طول وارتفاع معيّنَين. ويعتمد هذا العنصر على التحويل والاتجاه لوضعه في العالم الواقعي. يتكوّن الموضع من خط العرض وخط الطول والارتفاع، ويتم تحديدها في نظام إحداثيات WGS84. يتألّف الاتجاه من عملية تدوير رباعي الأبعاد.

يتم تسجيل الارتفاع بالمتْر فوق الشكل الإهليجي المرجعي WGS84 بحيث لا يكون مستوى سطح الأرض هو الصفر. تطبيقك مسؤول عن تقديم هذه الإحداثيات لكل ارتساء يتم إنشاؤه.

وضع عنصر تثبيت WGS84 في العالم الحقيقي

تحديد ارتفاع موقع جغرافي

هناك عدة طرق لتحديد ارتفاع الموقع من أجل وضع علامات ارتساء الموقع:

  • إذا كان الموقع الجغرافي للارتساء قريبًا من المستخدم فعليًا، يمكنك استخدام ارتفاع مشابه لارتفاع جهاز المستخدم.
  • بعد الحصول على خط العرض وخط الطول، استخدِم Elbation API للحصول على ارتفاع استنادًا إلى مواصفات EGM96. يجب تحويل ارتفاع واجهة برمجة التطبيقات EGM96 إلى واجهة برمجة التطبيقات WGS84 للمقارنة مع ارتفاع GARGeospatialTransform. راجع GeoidEval الذي يحتوي على سطر أوامر وواجهة HTML. تُبلغ Maps API عن خطوط العرض والطول وفقًا لمواصفات WGS84 تلقائيًا.
  • يمكنك الحصول على خط العرض وخط الطول والارتفاع لموقع ما من Google Earth. سيؤدي ذلك إلى هامش خطأ يصل إلى عدة أمتار. استخدِم خطوط الطول والعرض والارتفاع من علامات <coordinates>، ووليس علامات <LookAt>، في ملف KML.
  • إذا كان هناك مرساة حالية قريبة وإذا لم تكن على منحدر شديد الانحدار، قد تتمكّن من استخدام بيانات الارتفاع من GARGeospatialTransform الكاميرا بدون استخدام مصدر آخر، مثل Maps API.

إنشاء إعلان ثابت في أسفل الصفحة

بعد الحصول على الرباعي الرباعي لخط العرض وخط الطول والارتفاع والتدوير، استخدِم createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error: لربط المحتوى بالإحداثيات الجغرافية التي تحدّدها.

  NSError *error = nil;
  GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
                                                         altitude:altitude
                                               eastUpSouthQAnchor:eastUpSouthQAnchor
                                                            error:&error];

أدوات تثبيت التضاريس

عنصر التثبيت على التضاريس هو نوع من عناصر التثبيت التي تتيح لك وضع عناصر الواقع المعزّز باستخدام خطي الطول والعرض فقط، والاستفادة من المعلومات الواردة من VPS للعثور على الارتفاع الدقيق فوق سطح الأرض.

وبدلاً من إدخال الارتفاع المطلوب، يمكنك توفير الارتفاع فوق التضاريس. وعندما تكون هذه القيمة صفرًا، ستكون الارتساء على مستوى الأرض مع التضاريس.

ضبط وضع البحث عن الطائرة

إنّ العثور على المستوى اختياري وليس مطلوبًا لاستخدام علامات الارتساء. يُرجى العلم أنّه يتم استخدام المستويات الأفقية فقط. ستساعد المستويات الأفقية المحاذاة الديناميكية لمرتكزات التضاريس على الأرض.

استخدِم ARWorldTrackingConfiguration.PlaneDetection لاختيار كيفية رصد تطبيقك للطائرات.

إنشاء علامة ارتساء لتضاريس التضاريس باستخدام Async API الجديدة

لإنشاء عنصر تثبيت لسطح الأرض ووضعه، اتصل بالرقم GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:.

لن يكون العنصر الثابت جاهزًا على الفور ويجب حلّه. بعد حلّ المشكلة، ستتوفَّر في GARCreateAnchorOnTerrainFuture.

GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveTerrain:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

الاطّلاع على "حالة المستقبل"

سيكون للمستقبل GARFutureState مرتبط به.

الحالة الوصف
GARFutureStatePending لا تزال العملية في انتظار المراجعة.
GARFutureStateDone اكتملت العملية وأصبحت النتيجة متاحة.
GARFutureStateCancelled تم إلغاء العملية.

التحقق من حالة ارتساء التضاريس لنتيجة "المستقبل"

ينتمي GARTerrainAnchorState إلى العملية غير المتزامنة وهو جزء من النتيجة النهائية المستقبلية.

switch (future.resultTerrainAnchorState) {
  case GARTerrainAnchorStateSuccess:
    // Terrain anchor finished resolving.
    break;
  case GARTerrainAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARTerrainAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARTerrainAnchorStateErrorInternal:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

مسامير التثبيت على السطح

بطل علامات الارتساء على السطح

هي نوع من مثبّتات الأسطح وتشبه إلى حدّ كبير مثبّتات التضاريس أعلاه. ويكمن الاختلاف في أنك ستوفر الارتفاع فوق السطح بدلاً من الارتفاع فوق التضاريس.

إنشاء شريط إعلاني على السطح باستخدام واجهة Async API الجديدة

لن يكون العنصر الثابت جاهزًا على الفور ويجب حلّه.

لإنشاء ثابت في السقف ووضعه، اتّصِل بالرقم GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error:. على غرار نقاط تثبيت التضاريس، ستتمكّن أيضًا من الوصول إلى GARFutureState المستقبلية. يمكنك بعد ذلك الاطّلاع على نتيجة "المستقبل" للوصول إلى GARRooftopAnchorState.

GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveRooftop:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

الاطّلاع على "حالة المستقبل"

سيكون للمستقبل GARFutureState مرتبط به، اطّلِع على الجدول أعلاه.

التحقّق من حالة عنصر التثبيت على السطح للنتيجة المستقبلية

ينتمي GARRooftopAnchorState إلى العملية غير المتزامنة وهو جزء من النتيجة النهائية المستقبلية.

switch (future.resultRooftopAnchorState) {
  case GARRooftopAnchorStateSuccess:
    // Rooftop anchor finished resolving.
    break;
  case GARRooftopAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARRooftopAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARRooftopAnchorStateErrorInternal:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

الخطوات التالية