XR_ANDROID_geospatial_anchor

رشته نام

XR_ANDROID_geospatial_anchor

نوع افزونه

افزونه نمونه

شماره داخلی ثبت‌شده

798

بازبینی

1

وضعیت تصویب

تصویب‌نشده

وابستگی‌های افزونه و نسخه

XR_ANDROID_geospatial
و
XR_EXT_future
و
XR_EXT_spatial_entity
و
XR_EXT_spatial_anchor

تاریخ آخرین تغییر

2025-10-30

وضعیت IP

هیچ ادعای مالکیت فکری شناخته‌شده‌ای وجود ندارد.

همیاران

John Ullman،‏ Google
Ben King،‏ Google
Nihav Jain،‏ Google
Jared Finder،‏ Google

نمای کلی

این افزونه «لنگرهای زمین‌مکانی» و «لنگرهای سطحی» را ارائه می‌دهد که برپایه افزونه زمین‌مکانی پایه ساخته شده‌اند. لنگرهای زمین‌مکانی لنگرهایی هستند که در فضا نسبت به زمین در عرض جغرافیایی، طول جغرافیایی، و ارتفاع مشخصی قرار گرفته‌اند. لنگرهای سطحی لنگرهای مرتبط با زمین هستند که در عرض جغرافیایی، طول جغرافیایی، و ارتفاع مشخصی نسبت به سطحی که برای «سرویس موقعیت‌یابی بصری» شناخته‌شده است قرار می‌گیرند. با بهبود دقت زمان اجرا در موقعیت آن نسبت به زمین، حالت «لنگر» نیز به‌طور متناسب تنظیم می‌شود.

قابلیت سیستم برای لنگرهای زمین‌مکانی

ساختار XrSystemGeospatialAnchorPropertiesANDROID به‌صورت زیر تعریف می‌شود:

typedef struct XrSystemGeospatialAnchorPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    uint32_t           maxSurfaceAnchorCount;
} XrSystemGeospatialAnchorPropertiesANDROID;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است.
  • maxSurfaceAnchorCount یک uint32_t است که حداکثر تعداد لنگرهای سطحی را که می‌توان ایجاد کرد نشان می‌دهد.

برنامه می‌تواند قابلیت‌های لنگر جغرافیایی سیستم را با زنجیر کردن ساختار XrSystemGeospatialAnchorPropertiesANDROID به XrSystemProperties هنگام فراخوانی xrGetSystemProperties بررسی کند.

اگر XrSystemGeospatialPropertiesANDROID :: supportsGeospatial برابر با XR_TRUE باشد، maxSurfaceAnchorCount نشان‌دهنده حداکثر تعداد لنگرهای سطحی است که زمان اجرا پشتیبانی می‌کند. در این مورد، حد باید بزرگ‌تر از ۰ باشد.

اگر XrSystemGeospatialPropertiesANDROID :: supportsGeospatial برابر با XR_TRUE نباشد، maxSurfaceAnchorCount باید برابر با 0 باشد.

استفاده معتبر (ضمنی)

ردگیری صفحه برای لنگرها

ساختار XrGeospatialTrackerAnchorTrackingInfoANDROID به‌صورت زیر تعریف می‌شود:

typedef struct XrGeospatialTrackerAnchorTrackingInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrBool32           shouldTrackPlanes;
} XrGeospatialTrackerAnchorTrackingInfoANDROID;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است.
  • shouldTrackPlanes یک XrBool32 است که نشان می‌دهد آیا ردیاب زمین‌مکانی هواپیماها را برای بهبود موقعیت‌یابی لنگرهای قفل‌شده به سطح ردیابی خواهد کرد یا نه.

ردیابی سطح می‌تواند برای بهبود موقعیت‌یابی لنگرهای قفل‌شده روی سطح فعال شود.

اگر برنامه بخواهد ردیابی صفحه را برای بهبود وضعیت لنگر سطح فعال کند، می‌تواند ساختار XrGeospatialTrackerAnchorTrackingInfoANDROID را به XrGeospatialTrackerCreateInfoANDROID هنگام فراخوانی xrCreateGeospatialTrackerANDROID زنجیر کند.

استفاده معتبر (ضمنی)

لنگرهای زمین‌مکانی

تابع xrCreateGeospatialAnchorANDROID به‌صورت زیر تعریف می‌شود:

XrResult xrCreateGeospatialAnchorANDROID(
    XrSpatialContextEXT                         spatialContext,
    const XrGeospatialAnchorCreateInfoANDROID*  createInfo,
    XrSpatialEntityIdEXT*                       anchorEntityId);

شرح پارامترها

  • ‫spatialContext همان XrSpatialContextEXT است که لنگر در آن ایجاد می‌شود. بافت باید برای XR_SPATIAL_CAPABILITY_ANCHOR_EXT پیکربندی شود، درغیراین‌صورت زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
  • ‫createInfo اشاره‌گری به XrGeospatialAnchorCreateInfoANDROID است که حاوی پارامترهای ایجاد لنگر است.
  • anchorEntityId اشاره‌گری به XrSpatialEntityIdEXT است که در آن شناسه نهاد لنگر برگردانده می‌شود.

اگر XrGeospatialTrackerANDROID مشخص‌شده در XrGeospatialAnchorCreateInfoANDROID :: geospatialTracker در حالت XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID نباشد، زمان اجرا باید XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID را برگرداند.

استفاده معتبر (ضمنی)

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROID
  • XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

ساختار XrGeospatialAnchorCreateInfoANDROID به‌صورت زیر تعریف می‌شود:

typedef struct XrGeospatialAnchorCreateInfoANDROID {
    XrStructureType               type;
    const void*                   next;
    XrGeospatialTrackerANDROID    geospatialTracker;
    XrGeospatialPoseANDROID       geospatialPose;
} XrGeospatialAnchorCreateInfoANDROID;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است.
  • ‫geospatialTracker همان XrGeospatialTrackerANDROID است که برای ایجاد لنگر استفاده می‌شود.
  • ‫geospatialPose اشاره‌گری به XrGeospatialPoseANDROID است که مکان و جهت لنگر را تعریف می‌کند.

استفاده معتبر (ضمنی)

لنگرهای سطحی

لنگرهای سطحی لنگرهایی هستند که نسبت به یک سطح، مانند زمین یا پشت‌بام، قرار می‌گیرند.

شمارش XrSurfaceAnchorTypeANDROID به‌صورت زیر تعریف می‌شود:

typedef enum XrSurfaceAnchorTypeANDROID {
    XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID = 1,
    XR_SURFACE_ANCHOR_TYPE_ROOFTOP_ANDROID = 2,
    XR_SURFACE_ANCHOR_TYPE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSurfaceAnchorTypeANDROID;

شمارش XrSurfaceAnchorTypeANDROID نوع سطحی را که لنگر نسبت به آن قرار دارد مشخص می‌کند.

مقادیر شمارشی دارای مقادیر زیر هستند:

شرح شمارشی

XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID

نوع لنگری که نسبت به زمین قرار داده شده است.

XR_SURFACE_ANCHOR_TYPE_ROOFTOP_ANDROID

نوع لنگری که نسبت به پشت‌بام یا زمین (درصورت نبود ساختمان) قرار داده شده است.

تابع xrCreateSurfaceAnchorAsyncANDROID به‌صورت زیر تعریف می‌شود:

XrResult xrCreateSurfaceAnchorAsyncANDROID(
    XrSpatialContextEXT                         spatialContext,
    const XrSurfaceAnchorCreateInfoANDROID*     createInfo,
    XrFutureEXT*                                future);

شرح پارامترها

  • ‫spatialContext همان XrSpatialContextEXT است که لنگر در آن ایجاد می‌شود.
  • ‫createInfo اشاره‌گری به XrSurfaceAnchorCreateInfoANDROID است که حاوی پارامترهای ایجاد لنگر است.
  • ‫future اشاره‌گری به XrFutureEXT است که نتیجه عملیات ناهمگام را نگه می‌دارد.

تابع xrCreateSurfaceAnchorAsyncANDROID عملیاتی ناهمگام را برای ایجاد لنگر سطح آغاز می‌کند. برخلاف لنگرهای زمین‌مکانی استاندارد، زمان اجرا ممکن است داده‌های زمین را برای تعیین ارتفاع صحیح واکشی کند. اگر برنامه تلاش کند بیش‌از XrSystemGeospatialAnchorPropertiesANDROID :: maxSurfaceAnchorCount لنگر سطحی را به‌طور هم‌زمان ایجاد کند، زمان اجرا باید XR_ERROR_LIMIT_REACHED را برگرداند. اگر XrGeospatialTrackerANDROID مشخص‌شده در XrSurfaceAnchorCreateInfoANDROID :: geospatialTracker در حالت XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID نباشد، زمان اجرا باید XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID را برگرداند. اگر داده‌های سطح برای مکان داده‌شده وجود نداشته باشد، ممکن است عملیات به‌صورت ناهمگام با نتیجه XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID ناموفق باشد. اگر XR_SPATIAL_CAPABILITY_ANCHOR_EXT برای spatialContext پیکربندی نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.

استفاده معتبر (ضمنی)

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROID
  • XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

ساختار XrSurfaceAnchorCreateInfoANDROID به‌صورت زیر تعریف می‌شود:

typedef struct XrSurfaceAnchorCreateInfoANDROID {
    XrStructureType               type;
    const void*                   next;
    XrGeospatialTrackerANDROID    geospatialTracker;
    XrSurfaceAnchorTypeANDROID    surfaceAnchorType;
    XrQuaternionf                 eastUpSouthOrientation;
    double                        latitude;
    double                        longitude;
    double                        altitudeRelativeToSurface;
} XrSurfaceAnchorCreateInfoANDROID;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است.
  • ‫geospatialTracker همان XrGeospatialTrackerANDROID است که باید استفاده شود.
  • ‫surfaceAnchorType XrSurfaceAnchorTypeANDROID برای لنگر است.
  • eastUpSouthOrientation جهت‌یابی نسبت به سیستم مختصات است که در آن ‎+X=شرق، ‎+Y=بالا، و ‎+Z=جنوب است.
  • latitude عرض جغرافیایی به درجه است، بین ۸۹٫۹- و ۸۹٫۹+.
  • longitude طول جغرافیایی به درجه است، بین ۱۸۰- و ۱۸۰+.
  • altitudeRelativeToSurface ارتفاع به متر نسبت به سطح مشخص‌شده توسط surfaceAnchorType است.

استفاده معتبر (ضمنی)

  • افزونه XR_ANDROID_geospatial_anchor باید قبل‌از استفاده از XrSurfaceAnchorCreateInfoANDROID فعال شود
  • type باید XR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROID باشد
  • ‫ next باید NULL یا اشاره‌گر معتبری به ساختار بعدی در زنجیره ساختار باشد
  • geospatialTracker باید یک دسته XrGeospatialTrackerANDROID معتبر باشد
  • surfaceAnchorType باید مقدار XrSurfaceAnchorTypeANDROID معتبری باشد
  • latitude باید مقدار double معتبری باشد
  • longitude باید مقدار double معتبری باشد
  • altitudeRelativeToSurface باید مقدار double معتبری باشد

تابع xrCreateSurfaceAnchorCompleteANDROID به‌صورت زیر تعریف می‌شود:

XrResult xrCreateSurfaceAnchorCompleteANDROID(
    XrSpatialContextEXT                         spatialContext,
    XrFutureEXT                                 future,
    XrSurfaceAnchorCreateCompletionANDROID*     completion);

شرح پارامترها

استفاده معتبر (ضمنی)

کدهای برگشتی

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_FUTURE_INVALID_EXT
  • XR_ERROR_FUTURE_PENDING_EXT
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

ساختار XrSurfaceAnchorCreateCompletionANDROID نتیجه ایجاد لنگر سطح ناهمگام را نگه می‌دارد.

typedef struct XrSurfaceAnchorCreateCompletionANDROID {
    XrStructureType         type;
    void*                   next;
    XrResult                futureResult;
    XrSpatialEntityIdEXT    anchorEntityId;
} XrSurfaceAnchorCreateCompletionANDROID;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫next برابر با NULL یا اشاره‌گری به ساختار بعدی در زنجیره ساختار است.
  • ‫futureResult XrResult عملیات ایجاد است. اگر futureResult برابر با XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID باشد، ساختاری در زنجیره next ممکن است اطلاعات بیشتری درباره این عملیات ناموفق ارائه دهد.
  • anchorEntityId XrSpatialEntityIdEXT لنگر ایجادشده است، یا XR_NULL_SPATIAL_ENTITY_ID_EXT اگر futureResult XR_SUCCESS نباشد.

کدهای برگشتی آتی

مقادیر futureResult:

موفقیت‌آمیز بود

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ناموفق

  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
  • XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID
  • XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID

استفاده معتبر (ضمنی)

مثال

ایجاد لنگر زمین

PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
PFN_xrCreateSurfaceAnchorAsyncANDROID xrCreateSurfaceAnchorAsyncANDROID;
PFN_xrPollFutureEXT xrPollFutureEXT;
PFN_xrCreateSurfaceAnchorCompleteANDROID xrCreateSurfaceAnchorCompleteANDROID;
XrInstance instance;
XrSession session;
XrGeospatialTrackerANDROID geospatialTracker;

// Create a spatial context
XrSpatialContextEXT spatialContext{};
{
  std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
    XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
  };

  XrSpatialCapabilityConfigurationAnchorEXT
       anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
  anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
  anchorConfig.enabledComponentCount = enabledComponents.size();
  anchorConfig.enabledComponents = enabledComponents.data();

  std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
    reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
  };

  XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
  spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
  spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
  XrFutureEXT createContextFuture;
  CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

  // ... wait until future is ready ...

  XrCreateSpatialContextCompletionEXT contextCompletion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &contextCompletion));
  if (contextCompletion.futureResult != XR_SUCCESS) {
    return;
  }

  spatialContext = contextCompletion.spatialContext;
}

XrSurfaceAnchorCreateInfoANDROID anchorCreateInfo{
    XR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROID};
anchorCreateInfo.surfaceAnchorType = XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID;
anchorCreateInfo.eastUpSouthOrientation = {0, 0, 0, 1};
anchorCreateInfo.latitude = 37.7749;
anchorCreateInfo.longitude = -122.4194;
anchorCreateInfo.altitudeRelativeToSurface = 0;
anchorCreateInfo.geospatialTracker = geospatialTracker;
XrFutureEXT anchorFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSurfaceAnchorAsyncANDROID(spatialContext, &anchorCreateInfo, &anchorFuture));

XrFuturePollInfoEXT anchorPollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT anchorPollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
anchorPollInfo.future = anchorFuture;
anchorPollResult.state = XR_FUTURE_STATE_PENDING_EXT;
while (anchorPollResult.state == XR_FUTURE_STATE_PENDING_EXT) {
  // Do in render loop/state loop.
  CHK_XR(xrPollFutureEXT(instance, &anchorPollInfo, &anchorPollResult));
}

XrSurfaceAnchorCreateCompletionANDROID anchorCompletion{
    XR_TYPE_SURFACE_ANCHOR_CREATE_COMPLETION_ANDROID};
CHK_XR(xrCreateSurfaceAnchorCompleteANDROID(spatialContext, anchorFuture, &anchorCompletion));
if (anchorCompletion.futureResult == XR_SUCCESS) {
  // Use completion.anchorEntityId.
  XrSpatialEntityIdEXT anchorId = anchorCompletion.anchorEntityId;

  // Query in UpdateSnapshot.
}

فرمان‌های جدید

سازه‌های جدید

Enums جدید

ثابت‌های شمارشی جدید

  • XR_ANDROID_GEOSPATIAL_ANCHOR_EXTENSION_NAME
  • XR_ANDROID_geospatial_anchor_SPEC_VERSION
  • درحال گسترش دادن XrResult :

    • XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID
  • درحال گسترش دادن XrStructureType :

    • XR_TYPE_GEOSPATIAL_ANCHOR_CREATE_INFO_ANDROID
    • XR_TYPE_GEOSPATIAL_TRACKER_ANCHOR_TRACKING_INFO_ANDROID
    • XR_TYPE_SURFACE_ANCHOR_CREATE_COMPLETION_ANDROID
    • XR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROID
    • XR_TYPE_SYSTEM_GEOSPATIAL_ANCHOR_PROPERTIES_ANDROID

مشکلات

سابقه نسخه

  • بازبینی ۱،‏ ۲۰۲۵-۱۰-۳۰ (Ben King)

    • پیش‌نویس اولیه.