لنگرهای جغرافیایی نوعی لنگر هستند که به شما امکان می دهند محتوای سه بعدی را در دنیای واقعی قرار دهید.
سه نوع لنگر ژئوفضایی وجود دارد که هر کدام به طور متفاوتی ارتفاع را کنترل می کنند:
لنگرهای WGS84 :
لنگرهای WGS84 به شما امکان می دهند محتوای سه بعدی را در هر عرض جغرافیایی، طول جغرافیایی و ارتفاع مشخصی قرار دهید.لنگرهای زمین :
لنگرهای زمین به شما امکان می دهند محتوا را فقط با استفاده از طول و عرض جغرافیایی با ارتفاع نسبت به زمین در آن موقعیت قرار دهید. ارتفاع نسبت به همکف یا طبقه که توسط VPS شناخته می شود تعیین می شود.لنگرهای پشت بام :
لنگرهای پشت بام به شما امکان می دهند محتوا را فقط با استفاده از طول و عرض جغرافیایی با ارتفاع نسبت به پشت بام ساختمان در آن موقعیت قرار دهید. ارتفاع نسبت به بالای یک ساختمان که توسط Streetscape Geometry شناخته می شود تعیین می شود. زمانی که روی ساختمان قرار نگیرد، به طور پیشفرض ارتفاع زمین را نشان میدهد.
WGS84 | زمین | پشت بام | |
---|---|---|---|
موقعیت افقی | طول جغرافیایی عرض جغرافیایی | طول جغرافیایی عرض جغرافیایی | طول جغرافیایی عرض جغرافیایی |
موقعیت عمودی | نسبت به ارتفاع WGS84 | نسبت به سطح زمین تعیین شده توسط Google Maps | نسبت به سطح پشت بام تعیین شده توسط Google Maps |
نیاز به حل و فصل سرور دارد؟ | خیر | آره | آره |
قبل از ادامه، مطمئن شوید که Geospatial API را فعال کرده اید.
هر نوع لنگر دارای APIهای اختصاصی برای ایجاد آنها است. برای اطلاعات بیشتر به انواع لنگرهای جغرافیایی مراجعه کنید.
شما همچنین می توانید یک لنگر Geospatial از یک نتیجه تست ضربه ایجاد کنید. از Pose از تست ضربه استفاده کنید و آن را به GeospatialPose
تبدیل کنید. از آن برای قرار دادن هر یک از 3 نوع لنگر شرح داده شده استفاده کنید.
Earth.getGeospatialPose()
یک راه اضافی برای تعیین طول و عرض جغرافیایی با تبدیل یک Pose AR به یک Pose Geospatial ارائه می دهد.
Earth.getPose()
یک موقعیت افقی، ارتفاع و چرخش چهارتایی مشخص شده توسط زمین را با توجه به یک قاب مختصات شرق به بالا به جنوب به یک حالت AR با توجه به مختصات جهان GL تبدیل می کند.
هر روش ایجاد یک لنگر دارای معاوضه هایی است که باید به خاطر داشته باشید:
- هنگام استفاده از Streetscape Geometry ، از تست ضربه برای پیوست کردن محتوا به ساختمان استفاده کنید.
- لنگرهای زمینی یا پشت بام را به لنگرهای WGS84 ترجیح دهید زیرا از مقادیر ارتفاع تعیین شده توسط Google Maps استفاده می کنند.
سه روش برای محاسبه طول و عرض جغرافیایی یک مکان وجود دارد:
- از Geospatial Creator برای مشاهده و تقویت جهان با محتوای سه بعدی بدون نیاز به رفتن فیزیکی به مکانی استفاده کنید. این به شما امکان می دهد محتوای سه بعدی همه جانبه را به صورت بصری با استفاده از نقشه های گوگل در ویرایشگر Unity قرار دهید. طول و عرض جغرافیایی، چرخش و ارتفاع محتوا به طور خودکار برای شما محاسبه می شود.
- از نقشه های گوگل استفاده کنید
- از Google Earth استفاده کنید. توجه داشته باشید که به دست آوردن این مختصات با استفاده از گوگل ارث، بر خلاف نقشه گوگل، تا چندین متر حاشیه خطا برای شما ایجاد می کند.
- به مکان فیزیکی بروید
برای دریافت طول و عرض جغرافیایی یک مکان با استفاده از Google Maps:
در رایانه رومیزی خود به Google Maps بروید.
به لایه ها > بیشتر بروید.
نوع Map را به Satellite تغییر دهید و تیک Globe View را در گوشه سمت چپ پایین صفحه پاک کنید.
این کار باعث می شود که یک چشم انداز دوبعدی ایجاد شود و خطاهای احتمالی که می تواند از نمای سه بعدی زاویه دار ایجاد شود را حذف می کند.
روی نقشه، روی مکان کلیک راست کرده و طول جغرافیایی/طول جغرافیایی را انتخاب کنید تا آن را در کلیپ بورد خود کپی کنید.
میتوانید با کلیک کردن روی یک مکان در رابط کاربری و خواندن دادهها از جزئیات مکاننما، طول و عرض جغرافیایی یک مکان را از Google Earth محاسبه کنید.
برای دریافت طول و عرض جغرافیایی یک مکان با استفاده از Google Earth:
در رایانه رومیزی خود به Google Earth بروید.
به منوی همبرگر بروید
و Map Style را انتخاب کنید.
سوئیچ ساختمان های سه بعدی را خاموش کنید.
هنگامی که سوئیچ ساختمان های سه بعدی خاموش شد، روی نماد پین کلیک کنید
برای اضافه کردن یک مکان در مکان انتخاب شده.
پروژه ای را مشخص کنید که نشان مکان شما را داشته باشد و روی ذخیره کلیک کنید.
در قسمت عنوان برای نشان مکان، یک نام برای نشان مکان وارد کنید.
روی فلش عقب کلیک کنید
در پنجره پروژه و انتخاب کنید
منوی اقدامات بیشتر .
از منو Export as file KML را انتخاب کنید.
فایل KLM طول، طول و ارتفاع را برای یک مکان در تگ <coordinates>
که با کاما از هم جدا شده است، به شرح زیر گزارش می دهد:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
از طول و عرض جغرافیایی تگ های <LookAt>
که موقعیت دوربین را مشخص می کنند، نه مکان را استفاده نکنید .
شما می توانید ارتفاع یک مکان را با رفتن به آنجا به صورت فیزیکی و انجام یک مشاهده محلی محاسبه کنید.
GeospatialPose.getEastUpSouthQuaternion()
جهت گیری را از یک Pose Geospatial استخراج می کند و یک کواترنیون به دست می دهد که نشان دهنده ماتریس چرخشی است که یک بردار را از هدف به سیستم مختصات شرق به بالا به جنوب (EUS) تبدیل می کند. X+ به شرق، Y+ به سمت بالا و Z+ به سمت جنوب اشاره می کند. مقادیر به ترتیب {x, y, z, w}
نوشته میشوند.
لنگر WGS84 نوعی لنگر است که به شما امکان می دهد محتوای سه بعدی را در هر عرض جغرافیایی، طول و ارتفاع معین قرار دهید. برای قرار گرفتن در دنیای واقعی به پوز و جهت گیری متکی است. این موقعیت شامل یک عرض جغرافیایی، طول جغرافیایی و ارتفاع است که در سیستم مختصات WGS84 مشخص شده است. جهت گیری از یک چرخش کواترنیونی تشکیل شده است.
ارتفاع بر حسب متر بالاتر از بیضی مرجع WGS84 گزارش شده است به طوری که سطح زمین در صفر نیست . برنامه شما مسئول ارائه این مختصات برای هر لنگر ایجاد شده است.
چند راه برای تعیین ارتفاع مکان برای قرار دادن لنگر وجود دارد:
- اگر مکان لنگر از نظر فیزیکی نزدیک کاربر است، میتوانید از ارتفاعی مشابه ارتفاع دستگاه کاربر استفاده کنید.
- هنگامی که طول و عرض جغرافیایی را دارید، از Elevation API برای بدست آوردن ارتفاع بر اساس مشخصات EGM96 استفاده کنید. شما باید ارتفاع Maps API EGM96 را برای مقایسه با ارتفاع
GeospatialPose
به WGS84 تبدیل کنید. GeoidEval را ببینید که دارای خط فرمان و رابط HTML است. Maps API طول و عرض جغرافیایی را مطابق با مشخصات WGS84 از جعبه گزارش می دهد. - میتوانید طول، طول و ارتفاع یک مکان را از Google Earth دریافت کنید. این به شما یک حاشیه خطا تا چند متر می دهد. از طول، طول و ارتفاع از تگ های
<coordinates>
استفاده کنید، نه تگ های<LookAt>
را در فایل KML. - اگر یک لنگر موجود نزدیک است و اگر در شیب تند نیستید، ممکن است بتوانید از ارتفاع
GeospatialPose
دوربین بدون استفاده از منبع دیگری مانند Maps API استفاده کنید.
هنگامی که ربع طول جغرافیایی، طول جغرافیایی، ارتفاع و چرخش را دارید، از Earth.createAnchor()
برای لنگر انداختن محتوا به مختصات جغرافیایی که مشخص می کنید استفاده کنید.
if (earth != null && earth.getTrackingState() == TrackingState.TRACKING) { Anchor anchor = earth.createAnchor( /* Location values */ latitude, longitude, altitude, /* Rotational pose values */ qx, qy, qz, qw); // Attach content to the anchor specified by geodetic location and pose. }
if (earth.trackingState == TrackingState.TRACKING) { val anchor = earth.createAnchor( /* Location values */ latitude, longitude, altitude, /* Rotational pose values */ qx, qy, qz, qw ) // Attach content to the anchor specified by geodetic location and pose. }
لنگر زمینی نوعی لنگر است که به شما امکان می دهد اشیاء AR را فقط با استفاده از طول و عرض جغرافیایی قرار دهید و از اطلاعات VPS برای یافتن ارتفاع دقیق از سطح زمین استفاده کنید.
به جای اینکه ارتفاع مورد نظر را وارد کنید، ارتفاع بالای زمین را ارائه می دهید. هنگامی که این صفر باشد، لنگر هم سطح با زمین خواهد بود.
پیدا کردن هواپیما اختیاری است و برای استفاده از لنگرها لازم نیست. توجه داشته باشید که فقط از صفحات افقی استفاده می شود. هواپیماهای افقی به هم ترازی پویا لنگرهای زمین در زمین کمک خواهند کرد.
از Config.PlaneFindingMode
برای انتخاب نحوه شناسایی هواپیماها توسط برنامه استفاده کنید.
برای ایجاد و قرار دادن لنگر Terrain، Earth.resolveAnchorOnTerrainAsync()
را فراخوانی کنید.
لنگر بلافاصله آماده نخواهد شد و باید حل شود. پس از حل شدن، در ResolveAnchorOnTerrainFuture
در دسترس خواهد بود.
final ResolveAnchorOnTerrainFuture future = earth.resolveAnchorOnTerrainAsync( latitude, longitude, /* altitudeAboveTerrain= */ 0.0f, qx, qy, qz, qw, (anchor, state) -> { if (state == TerrainAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } });
var future = earth.resolveAnchorOnTerrainAsync( latitude, longitude, altitudeAboveTerrain, qx, qy, qz, qw, { anchor, state -> if (state == TerrainAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } } )
آینده یک FutureState
مرتبط خواهد داشت.
حالت | شرح |
---|---|
FutureState.PENDING | عملیات همچنان در انتظار است. |
FutureState.DONE | عملیات کامل شده و نتیجه در دسترس است. |
FutureState.CANCELLED | عملیات لغو شده است. |
Anchor.TerrainAnchorState
متعلق به عملیات ناهمزمان است و بخشی از نتیجه نهایی Future است.
switch (terrainAnchorState) { case SUCCESS: // A resolving task for this Terrain anchor has finished successfully. break; case ERROR_UNSUPPORTED_LOCATION: // The requested anchor is in a location that isn't supported by the Geospatial API. break; case ERROR_NOT_AUTHORIZED: // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized // for troubleshooting steps. break; case ERROR_INTERNAL: // The Terrain anchor could not be resolved due to an internal error. break; default: // not reachable break; }
when (state) { TerrainAnchorState.SUCCESS -> { // A resolving task for this Terrain anchor has finished successfully. } TerrainAnchorState.ERROR_UNSUPPORTED_LOCATION -> { // The requested anchor is in a location that isn't supported by the Geospatial API. } TerrainAnchorState.ERROR_NOT_AUTHORIZED -> { // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized // for troubleshooting steps. } TerrainAnchorState.ERROR_INTERNAL -> { // The Terrain anchor could not be resolved due to an internal error. } else -> { // Default. } }
لنگرهای پشت بام نوعی لنگر هستند و بسیار شبیه به لنگرهای Terrain در بالا هستند. تفاوت این است که شما به جای ارتفاع بالای زمین، ارتفاع بالای پشت بام را ارائه می دهید.
لنگر بلافاصله آماده نخواهد شد و باید حل شود.
برای ایجاد و قرار دادن یک لنگر پشت بام، Earth.resolveAnchorOnRooftopAsync()
را فراخوانی کنید. مشابه لنگرهای Terrain، به FutureState
of the Future نیز دسترسی خواهید داشت. سپس می توانید نتیجه Future را برای دسترسی به Anchor.RooftopAnchorState
بررسی کنید.
final ResolveAnchorOnRooftopFuture future = earth.resolveAnchorOnRooftopAsync( latitude, longitude, /* altitudeAboveRooftop= */ 0.0f, qx, qy, qz, qw, (anchor, state) -> { if (state == RooftopAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } });
var future = earth.resolveAnchorOnRooftopAsync( latitude, longitude, altitudeAboveRooftop, qx, qy, qz, qw, { anchor, state -> if (state == RooftopAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } } )
Future یک FutureState
مرتبط خواهد داشت، جدول بالا را ببینید.
Anchor.RooftopAnchorState
متعلق به عملیات ناهمزمان است و بخشی از نتیجه نهایی Future است.
switch (rooftopAnchorState) { case SUCCESS: // A resolving task for this Rooftop anchor has finished successfully. break; case ERROR_UNSUPPORTED_LOCATION: // The requested anchor is in a location that isn't supported by the Geospatial API. break; case ERROR_NOT_AUTHORIZED: // An error occurred while authorizing your app with the ARCore API. // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized // for troubleshooting steps. break; case ERROR_INTERNAL: // The Rooftop anchor could not be resolved due to an internal error. break; default: // not reachable break; }
when (state) { RooftopAnchorState.SUCCESS -> { // A resolving task for this Rooftop anchor has finished successfully. } RooftopAnchorState.ERROR_UNSUPPORTED_LOCATION -> { // The requested anchor is in a location that isn't supported by the Geospatial API. } RooftopAnchorState.ERROR_NOT_AUTHORIZED -> { // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized // for troubleshooting steps. } RooftopAnchorState.ERROR_INTERNAL -> { // The Rooftop anchor could not be resolved due to an internal error. } else -> { // Default. } }
- مطمئن شوید که سهمیه استفاده Geospatial API را درک کرده اید.