XR_ANDROID_scene_meshing پسوند OpenXR

رشته نام XR_ANDROID_scene_meshing

پسوند نمونه نوع پسوند

شماره پسوند ثبت شده 464

ویرایش 3

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

آخرین تاریخ اصلاح 2025-05-15

وضعیت IP هیچ ادعای IP شناخته شده ای وجود ندارد.

مشارکت کنندگان Spencer Quin، Google Jared Finder، Google Antonio Fontan، Google Cairn Overturf، Google Nihav Jain، Google Salar Khan، Google Sebastian Klose، Google Jürgen Sturm، Google Vinny DaSilva، Google Ricardo Campbell، Google

نمای کلی

این برنامه افزودنی برای ارائه داده های مش برای مش ها در نظر گرفته شده است که تقریباً اشیاء فیزیکی در محیط شما را نشان می دهد. می توان از آن برای تجسم صحنه شما در یک برنامه غوطه ور استفاده کرد و به اشیاء مجازی اجازه می دهد با اشیاء فیزیکی مانند برخوردها تعامل داشته باشند.

داده های مش بندی صحنه می تواند اطلاعات شخصی حساس باشد و ارتباط نزدیکی با حریم خصوصی و یکپارچگی شخصی دارد. اکیداً توصیه می‌شود که برنامه‌هایی که داده‌های مشبک صحنه را ذخیره یا انتقال می‌دهند، همیشه از کاربر درخواست پذیرش فعال و خاص برای انجام این کار را داشته باشند.

مجوزها

برنامه‌های Android باید مجوز android.permission.SCENE_UNDERSTANDING_FINE را که در مانیفست آنها فهرست شده است داشته باشند. مجوز android.permission.SCENE_UNDERSTANDING_FINE یک مجوز حساس در نظر گرفته می شود زیرا به زمان اجرا اجازه می دهد تا محیط کاربر را مطالعه کند.

برنامه برای استفاده از این توابع باید در زمان اجرا مجوز درخواست کند:

(سطح حفاظت: خطرناک)

قابلیت سیستم را بررسی کنید

هنگام فراخوانی xrGetSystemProperties، یک برنامه کاربردی می تواند بررسی کند که آیا سیستم قادر به مش بندی صحنه است یا خیر.

XrSystemSceneMeshingPropertiesANDROID

typedef struct XrSystemSceneMeshingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;

توضیحات اعضا

  • type XrStructureType این ساختار است.
  • next NULL یا اشاره گر به ساختار بعدی در زنجیره ساختار است. چنین ساختاری در هسته OpenXR یا این پسوند تعریف نشده است.
  • supportsSceneMeshing یک XrBool32 است که نشان می دهد آیا سیستم از مش بندی صحنه پشتیبانی می کند یا خیر.

اگر supportsSceneMeshing XR_FALSE باشد، سیستم از مش بندی صحنه پشتیبانی نمی کند. هنگامی که supportsSceneMeshing XR_FALSE است، برنامه باید از استفاده از عملکرد مشبک صحنه اجتناب کند، زیرا تماس با xrCreateSceneMeshingTrackerANDROID ناموفق خواهد بود.

اگر supportsSceneMeshing XR_TRUE باشد، سیستم از مش بندی صحنه پشتیبانی می کند.

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

XrSceneMeshSemanticLabelSetANDROID

شمارش XrSceneMeshSemanticLabelSetANDROID مجموعه های برچسب معنایی را برای مش بندی صحنه توصیف می کند. هر مقدار در این enum نمایانگر enum دیگری است که حاوی برچسب های معنایی است. برای مثال، مقدار XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID مجموعه XrSceneMeshSemanticLabelANDROID را نشان می دهد.

typedef enum XrSceneMeshSemanticLabelSetANDROID {
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID = 0,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID = 1,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;

xrEnumerateSupportedSemanticLabelSetsANDROID

این برنامه می‌تواند مجموعه‌های برچسب معنایی پشتیبانی شده توسط سیستم را با استفاده از تابع xrEnumerateSupportedSemanticLabelSetsANDROID دریافت کند.

XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    supportedSemanticLabelSetsInputCapacity,
    uint32_t*                                   supportedSemanticLabelSetsOutputCount,
    XrSceneMeshSemanticLabelSetANDROID*         supportedSemanticLabelSets);

توضیحات پارامترها

  • instance یک XrInstance است که توسط برنامه ایجاد شده است.
  • systemId یک XrSystemId است که از xrGetSystem دوباره امتحان شده است.
  • supportedSemanticLabelSetsInputCapacity طول supportedSemanticLabelSets است.
  • supportedSemanticLabelSetsOutputCount تعداد عناصر موجود در supportedSemanticLabelSets است که توسط زمان اجرا از ابتدای آرایه شروع می شود.
  • supportedSemanticLabelSets آرایه‌ای از XrSceneMeshSemanticLabelSetANDROID است که مجموعه‌های برچسب معنایی پشتیبانی شده توسط زمان اجرا روی آن نوشته می‌شوند.

انتظار می رود که هر سیستم حداقل از XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID پشتیبانی کند زیرا این مقدار enum نشان دهنده هیچ مجموعه ای از برچسب معنایی نیست و می تواند در مواردی که برنامه به معنای راس نیاز ندارد استفاده شود.

یک دسته ردیاب مشبک صحنه ایجاد کنید

XrSceneMeshingTrackerANDROID

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

دسته XrSceneMeshingTrackerANDROID یک ردیاب مش بندی صحنه برای مش بندی صحنه و مدیریت منابع مرتبط را نشان می دهد.

از این دسته می توان برای ایجاد یک عکس فوری مش صحنه با استفاده از xrCreateSceneMeshSnapshotANDROID در این افزونه استفاده کرد.

xrCreateSceneMeshingTrackerANDROID

یک برنامه می تواند با استفاده از تابع xrCreateSceneMeshingTrackerANDROID یک دسته XrSceneMeshingTrackerANDROID ایجاد کند.

XrResult xrCreateSceneMeshingTrackerANDROID(
    XrSession                                   session,
    const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
    XrSceneMeshingTrackerANDROID*               tracker);

توضیحات پارامترها

  • session یک XrSession است که در آن ردیاب مش بندی صحنه فعال خواهد بود.
  • createInfo یک اشاره گر به ساختار XrSceneMeshingTrackerCreateInfoANDROID است که برای توصیف ردیاب مشبک صحنه ای که قرار است ایجاد شود استفاده می شود.
  • tracker دسته بازگشتی XrSceneMeshingTrackerANDROID است.

اگر سیستم از مش بندی صحنه پشتیبانی نمی کند، xrCreateSceneMeshingTrackerANDROID XR_ERROR_FEATURE_UNSUPPORTED را برمی گرداند. برنامه می تواند با فراخوانی xrGetSystemProperties با ساختار XrSystemSceneMeshingPropertiesANDROID ، پشتیبانی سیستم را بررسی کند.

فقط مجموعه‌های برچسب معنایی که توسط سیستم پشتیبانی می‌شوند می‌توانند در XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet هنگام ایجاد یک ردیاب مشبک صحنه استفاده شوند. تابع xrEnumerateSupportedSemanticLabelSetsANDROID می تواند برای دریافت لیست مجموعه های برچسب معنایی پشتیبانی شده استفاده شود.

اگر برنامه یک semanticLabelSet پشتیبانی نشده درخواست کند، xrCreateSceneMeshingTrackerANDROID XR_ERROR_FEATURE_UNSUPPORTED برمی گرداند.

دسته xrCreateSceneMeshingTrackerANDROID دارای تمام منابع برای مش بندی صحنه است. پس از اتمام تجربه مش بندی صحنه، برنامه باید دسته را از طریق تابع xrDestroySceneMeshingTrackerANDROID از بین ببرد.

XrSceneMeshingTrackerCreateInfoANDROID

ساختار XrSceneMeshingTrackerCreateInfoANDROID اطلاعاتی را برای ایجاد یک دسته XrSceneMeshingTrackerANDROID توصیف می کند.

typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    XrSceneMeshSemanticLabelSetANDROID    semanticLabelSet;
    XrBool32                              enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;

توضیحات اعضا

  • type XrStructureType این ساختار است.
  • next NULL یا اشاره گر به ساختار بعدی در زنجیره ساختار است. چنین ساختاری در هسته OpenXR یا این پسوند تعریف نشده است.
  • semanticLabelSet یک XrSceneMeshSemanticLabelSetANDROID است که برای تعیین مجموعه برچسب معنایی مورد استفاده برای مش بندی صحنه استفاده می شود. اگر این روی XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID تنظیم شود، زمان اجرا فیلد بافر XrSceneSubmeshDataANDROID::vertexSemantics را نادیده می گیرد.
  • enableNormals یک XrBool32 است که برای تعیین اینکه آیا هنگام دریافت داده مش صحنه، نرمال های راس را برای رئوس مش در بافر مش صحنه گنجانده شود یا نه استفاده می شود.

xrDestroySceneMeshingTrackerANDROID

تابع xrDestroySceneMeshingTrackerANDROID tracker و منابع زیربنایی را پس از اتمام تجربه مشبک سازی صحنه آزاد می کند.

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID          tracker);

توضیحات پارامترها

یک دسته عکس فوری مش صحنه ایجاد کنید

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

دسته XrSceneMeshSnapshotANDROID یک عکس فوری مش صحنه را نشان می دهد. این با استفاده از xrCreateSceneMeshSnapshotANDROID ایجاد می شود که اساساً یک عکس فوری از داده مش صحنه را در زمان فراخوانی تابع می گیرد.

این دسته می تواند برای بازیابی اطلاعات و داده های زیرمش با استفاده از xrGetAllSubmeshStatesANDROID و xrGetSubmeshDataANDROID استفاده شود.

XrSceneMeshSnapshotCreateInfoANDROID

ساختار XrSceneMeshSnapshotCreateInfoANDROID اطلاعاتی را برای ایجاد یک دسته XrSceneMeshSnapshotANDROID توصیف می کند.

typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            baseSpace;
    XrTime             time;
    XrBoxf             boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;

توضیحات اعضا

  • type XrStructureType این ساختار است.
  • next NULL یا اشاره گر به ساختار بعدی در زنجیره ساختار است. چنین ساختاری در هسته OpenXR یا این پسوند تعریف نشده است.
  • baseSpace یک XrSpace است که برای توصیف فضای مرجع که در آن اطلاعات ژست زیرمش های صحنه باید نمایش داده شود استفاده می شود.
  • time XrTime است که زمانی را توصیف می کند که مش صحنه پردازش یا نمایش داده می شود.
  • boundingBox یک XrBoxf است که جعبه مرزی را که در آن مش صحنه را به دست می‌آورد، توصیف می‌کند.

XrSceneMeshTrackingStateANDROID

شمارش XrSceneMeshTrackingStateANDROID وضعیت ردیابی ردیاب مشبک صحنه را توصیف می کند. هر مقدار در این enum حالتی از ردیاب مش بندی صحنه را نشان می دهد. این شماره در ساختار XrSceneMeshSnapshotCreationResultANDROID پیچیده شده است که از xrCreateSceneMeshSnapshotANDROID برگردانده شده است.

typedef enum XrSceneMeshTrackingStateANDROID {
    XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID = 0,
    XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID = 1,
    XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID = 2,
    XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID = 3,
    XR_SCENE_MESH_TRACKING_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshTrackingStateANDROID;

XrSceneMeshSnapshotCreationResultANDROID

ساختار XrSceneMeshSnapshotCreationResultANDROID نتیجه ایجاد یک عکس فوری مش صحنه بازگشتی از xrCreateSceneMeshSnapshotANDROID را ذخیره می کند. نتیجه شامل دسته عکس فوری و وضعیت ردیابی ردیاب مشبک صحنه در زمان ایجاد عکس فوری است.

typedef struct XrSceneMeshSnapshotCreationResultANDROID {
    XrStructureType                  type;
    void*                            next;
    XrSceneMeshSnapshotANDROID       snapshot;
    XrSceneMeshTrackingStateANDROID    trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;

توضیحات اعضا

  • type XrStructureType این ساختار است.
  • next NULL یا اشاره گر به ساختار بعدی در زنجیره ساختار است. چنین ساختاری در هسته OpenXR یا این پسوند تعریف نشده است.
  • snapshot یک دسته XrSceneMeshSnapshotANDROID است که توسط زمان اجرا ایجاد شده است.
  • trackingState یک XrSceneMeshTrackingStateANDROID است که وضعیت ردیاب مش بندی صحنه را در زمان ایجاد عکس فوری توصیف می کند.

xrCreateSceneMeshSnapshotANDROID

این برنامه می تواند از تابع xrCreateSceneMeshSnapshotANDROID برای ایجاد یک عکس فوری مش صحنه از ردیاب مشبک صحنه استفاده کند. این تابع یک دسته XrSceneMeshSnapshotANDROID را به همراه XrSceneMeshTrackingStateANDROID که در ساختار XrSceneMeshSnapshotCreationResultANDROID پیچیده شده است، برمی گرداند. دسته از نظر فنی یک عکس فوری از داده های مش صحنه در زمان ایجاد است. این دسته می تواند برای پرس و جو از اطلاعات مش صحنه و داده ها به ترتیب با استفاده از xrGetAllSubmeshStatesANDROID و xrGetSubmeshDataANDROID استفاده شود.

XrResult xrCreateSceneMeshSnapshotANDROID(
    XrSceneMeshingTrackerANDROID                tracker,
    const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
    XrSceneMeshSnapshotCreationResultANDROID*   outSnapshotCreationResult);

توضیحات پارامترها

دریافت داده مش صحنه از عکس فوری مش صحنه

XrSceneSubmeshStateANDROID

XrSceneSubmeshStateANDROID یک زیرمش را توصیف می کند. این شامل اطلاعات اولیه در مورد زیرمش (id، pose، bounds، آخرین زمان به روز رسانی) است.

typedef struct XrSceneSubmeshStateANDROID {
    XrStructureType    type;
    void*              next;
    XrUuid             submeshId;
    XrTime             lastUpdatedTime;
    XrPosef            submeshPoseInBaseSpace;
    XrExtent3Df        bounds;
} XrSceneSubmeshStateANDROID;

توضیحات اعضا

  • type XrStructureType این ساختار است.
  • next NULL یا اشاره گر به ساختار بعدی در زنجیره ساختار است. چنین ساختاری در هسته OpenXR یا این پسوند تعریف نشده است.
  • submeshId یک XrUuid است که زیرمش را شناسایی می کند.
  • lastUpdatedTime یک XrTime است که نشان دهنده زمان آخرین به روز رسانی زیر مش است.
  • submeshPoseInBaseSpace یک XrPosef است که نشان دهنده ژست زیر مش در فضای پایه است که برای ایجاد عکس فوری مش صحنه استفاده می شود. این همچنین موقعیت مرکز جعبه محدود کننده زیر مش است.
  • bounds یک XrExtent3Df است که ابعاد جعبه مرزی را که زیر مش را در بر می گیرد، توصیف می کند. این کران در فضای پایه ای است که برای ایجاد دسته مش صحنه استفاده شده است.

xrGetAllSubmeshStatesANDROID

این برنامه می تواند از تابع xrGetAllSubmeshStatesANDROID برای دریافت وضعیت همه زیرمش ها در مش صحنه استفاده کند. این شامل اطلاعات اطلاعات اولیه است تا به برنامه اجازه دهد شبکه های فرعی را که برنامه برای آنها داده می خواهد انتخاب کند. این تابع را می توان در یک اصطلاح 2-تماسی استفاده کرد.

XrResult xrGetAllSubmeshStatesANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshStateCapacityInput,
    uint32_t*                             submeshStateCountOutput,
    XrSceneSubmeshStateANDROID*           submeshStates);

توضیحات پارامترها

  • snapshot یک دسته XrSceneMeshSnapshotANDROID است که قبلا با xrCreateSceneMeshSnapshotANDROID ایجاد شده است.
  • submeshStateCapacityInput طول submeshStates است.
  • submeshStateCountOutput تعداد عناصر موجود در submeshStates است که توسط زمان اجرا که از ابتدای آرایه شروع می شود، اصلاح می شوند.
  • submeshStates آرایه‌ای از ساختارهای XrSceneSubmeshStateANDROID است که زمان اجرا وضعیت همه زیرمش‌ها را در مش صحنه خروجی می‌دهد.

XrSceneSubmeshDataANDROID

XrSceneSubmeshDataANDROID حاوی داده های مثلثی برای یک زیرمش به همراه شناسه زیرمش است. این ساختار در xrGetSubmeshDataANDROID برای دریافت داده های زیرمش استفاده می شود. برنامه باید شناسه submesh این ساختار و نشانگرهای بافر را روی بافرهای اختصاص داده شده تنظیم کند تا داده های برگشتی برای submesh در بافرهای اختصاص داده شده پر شوند. برنامه می تواند از xrGetSubmeshDataANDROID به عنوان یک اصطلاح 2 تماسی استفاده کند که در آن تماس اول از برنامه نیاز دارد تا شناسه submesh را تنظیم کند و اندازه بافرهای مورد نیاز برای داده های submesh را دریافت کند و سپس برنامه می تواند بافرها را اختصاص دهد و داده ها را در تماس دوم دریافت کند.

typedef struct XrSceneSubmeshDataANDROID {
    XrStructureType    type;
    const void*        next;
    XrUuid             submeshId;
    uint32_t           vertexCapacityInput;
    uint32_t           vertexCountOutput;
    XrVector3f*        vertexPositions;
    XrVector3f*        vertexNormals;
    uint8_t*           vertexSemantics;
    uint32_t           indexCapacityInput;
    uint32_t           indexCountOutput;
    uint32_t*          indices;
} XrSceneSubmeshDataANDROID;

توضیحات اعضا

  • type XrStructureType این ساختار است.
  • next NULL یا اشاره گر به ساختار بعدی در زنجیره ساختار است. چنین ساختاری در هسته OpenXR یا این پسوند تعریف نشده است.
  • submeshId یک XrUuid است که زیرمش را شناسایی می کند.
  • vertexCapacityInput طول vertexPositions ، vertexNormals و vertexSemantics است.
  • vertexCountOutput تعداد عناصر vertexPositions ، vertexNormals و vertexSemantics است که توسط زمان اجرا که از ابتدای آرایه شروع می‌شود، اصلاح شده‌اند.
  • vertexPositions آرایه‌ای از XrVector3f است که زمان اجرا موقعیت‌های رأس زیرمش را به آن خروجی می‌دهد.
  • vertexNormals آرایه ای از XrVector3f است که زمان اجرا نرمال های رأس زیرمش را به آن خروجی می دهد. اگر برنامه یک ردیاب با غیرفعال بودن نرمال ایجاد کند، می‌توان این قسمت را NULL گذاشت.
  • vertexSemantics آرایه‌ای از uint8_t است که زمان اجرا، معنای راس زیرمش را به آن خروجی می‌دهد. اگر برنامه یک ردیاب با مجموعه برچسب معنایی XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID ایجاد کند، می‌توان این فیلد را NULL گذاشت.
  • indexCapacityInput طول indices است.
  • indexCountOutput تعداد عناصر موجود در indices است که توسط زمان اجرا از ابتدای آرایه تغییر کرده اند.
  • indices آرایه ای از uint32_t است که زمان اجرا، اندیس های زیرمش را به آن خروجی می دهد.

xrGetSubmeshDataANDROID

این برنامه می‌تواند از تابع xrGetSubmeshDataANDROID برای دریافت داده‌های فهرست انتخابی از زیرمش‌ها استفاده کند. این تابع را می توان در یک اصطلاح 2-تماسی استفاده کرد. در تماس اول، برنامه باید یک شناسه submesh معتبر (به عنوان مثال: قابل بازیابی از xrGetAllSubmeshStatesANDROID با همان عکس فوری مش صحنه) و ظرفیت صفر برای هر عنصر در لیست انتخابی زیرمش ها تنظیم کند تا اندازه بافرهای مورد نیاز برای داده های submesh را بدست آورد. در فراخوانی دوم، برنامه باید نشانگرهای بافر را به یک بافر اختصاص داده شده برای هر عنصر در لیست انتخابی زیرمش ها به همراه ظرفیت بافرها برای دریافت داده های زیرمش ها تنظیم کند.

XrResult xrGetSubmeshDataANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshDataCount,
    XrSceneSubmeshDataANDROID*            inoutSubmeshData);

توضیحات پارامترها

XrSceneMeshSemanticLabelANDROID

شمارش XrSceneMeshSemanticLabelANDROID مجموعه پیش‌فرض برچسب‌های معنایی است که می‌توان از آن برای برچسب‌گذاری رئوس مش استفاده کرد تا توصیف کند که راس مش در کدام سطح محیط فیزیکی قرار دارد. این مجموعه enum با مقدار XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID در XrSceneMeshSemanticLabelSetANDROID نشان داده می شود.

typedef enum XrSceneMeshSemanticLabelANDROID {
    XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID = 0,
    XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID = 1,
    XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID = 2,
    XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID = 3,
    XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID = 4,
    XR_SCENE_MESH_SEMANTIC_LABEL_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelANDROID;

یک عکس فوری مش صحنه را از بین ببرید

xrDestroySceneMeshSnapshotANDROID

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

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID            snapshot);

توضیحات پارامترها

کد مثال برای مش بندی صحنه

کد مثال زیر نحوه دسترسی به داده مش صحنه را برای رندر نشان می دهد.

XrInstance instance;  // Created at app startup
XrSystemId systemId;  // Received from xrGetSystem() at app startup
XrSession session;    // Created at app startup
XrSpace appPlaySpace; // Created at app startup

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateSceneMeshingTrackerANDROID xrCreateSceneMeshingTrackerANDROID;
PFN_xrDestroySceneMeshingTrackerANDROID xrDestroySceneMeshingTrackerANDROID;
PFN_xrEnumerateSupportedSemanticLabelSetsANDROID xrEnumerateSupportedSemanticLabelSetsANDROID;
PFN_xrCreateSceneMeshSnapshotANDROID xrCreateSceneMeshSnapshotANDROID;
PFN_xrDestroySceneMeshSnapshotANDROID xrDestroySceneMeshSnapshotANDROID;
PFN_xrGetAllSubmeshStatesANDROID xrGetAllSubmeshStatesANDROID;
PFN_xrGetSubmeshDataANDROID xrGetSubmeshDataANDROID;

// Inspect system capability
XrSystemSceneMeshingPropertiesANDROID sceneMeshingProps = {
  .type = XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
  .type = XR_TYPE_SYSTEM_PROPERTIES,
  .next = &sceneMeshingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!sceneMeshingProps.supportsSceneMeshing) {
    // scene meshing is not supported.
    return;
}

uint32_t supportedsemanticLabelSetsCount = 0;
xrEnumerateSupportedSemanticLabelSetsANDROID(
  instance, systemId, 0, &supportedsemanticLabelSetsCount, nullptr);
std::vector<XrSceneMeshSemanticLabelSetANDROID> supportedSemanticLabelSets(
  supportedsemanticLabelSetsCount);
xrEnumerateSupportedSemanticLabelSetsANDROID(
  instance, systemId, supportedsemanticLabelSetsCount,
  &supportedsemanticLabelSetsCount, supportedSemanticLabelSets.data());

XrSceneMeshSemanticLabelSetANDROID semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID;
// Check if system supports XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
if (std::find(supportedSemanticLabelSets.begin(), supportedSemanticLabelSets.end(),
              XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID) !=
    supportedSemanticLabelSets.end()) {
  semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID;
}

XrSceneMeshingTrackerCreateInfoANDROID trackerCreateInfo = {
  .type = XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID,
  .semanticLabelSet = semanticLabelSet,
  .enableNormals = XR_TRUE
};

XrSceneMeshingTrackerANDROID tracker = XR_NULL_HANDLE;
CHK_XR(xrCreateSceneMeshingTrackerANDROID(session, &trackerCreateInfo, &tracker));

XrSceneMeshSnapshotCreationResultANDROID snapshotResult = {
  .type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID,
  .snapshot = XR_NULL_HANDLE
};
XrSceneMeshSnapshotANDROID& snapshot = snapshotResult.snapshot;
XrSceneMeshSnapshotCreateInfoANDROID createInfo = {
  .type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
};

// app update loop
while (true) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState; // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;
  XrBoxf box; // populated with the bounding box of the camera frustum

  // ...

  createInfo.baseSpace = appPlaySpace;
  createInfo.time = time;
  createInfo.boundingBox = box;

  // Grab the scene mesh snapshot. This way the app can: know all of the submesh infos,
  // choose the appropriate submeshes for which to get data, allocate the necessary
  // buffer for those submeshes, and then get the data.
  CHK_XR(xrCreateSceneMeshSnapshotANDROID(tracker, &createInfo, &snapshotResult));

  // check the tracking state
  if (snapshotResult.trackingState == XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID) {
    // unrecoverable error. Exit the app.
    if (snapshot != XR_NULL_HANDLE) {
      CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
      snapshot = XR_NULL_HANDLE;
    }
    break;
  } else if (snapshotResult.trackingState != XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID) {
    // The tracker is not tracking. Try again later.
    if (snapshot != XR_NULL_HANDLE) {
      CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
      snapshot = XR_NULL_HANDLE;
    }
    continue;
  }

  // 2-call idiom for getting submesh states
  std::vector<XrSceneSubmeshStateANDROID> states;
  uint32_t submeshCount = 0;
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
  states.resize(submeshCount);
  for (XrSceneSubmeshStateANDROID& state : states) {
    state = {.type = XR_TYPE_SCENE_SUBMESH_STATE_ANDROID};
  }
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, submeshCount, &submeshCount, states.data()));

  // To store the poses for the selected submeshes
  std::vector<XrPosef> submeshesPoses;
  submeshesPoses.reserve(submeshCount);

  std::vector<XrSceneSubmeshDataANDROID> submeshes;
  submeshes.reserve(submeshCount);
  // Iterate the states and determine which submeshes the app wants data for
  for (XrSceneSubmeshStateANDROID& state : states) {
    // Modify this bool as necessary by looking at states. Maybe state.lastUpdatedTime
    // is below a threshold or maybe the bounding box does not intersect with camera view
    // frustum (The submesh will be culled).
    bool needed;
    if (needed) {
      // Add the selected submesh to the submeshes list. Set the capacity
      // zero for now since the size of the buffer will be determined later.
      XrSceneSubmeshDataANDROID submesh = {
        .type = XR_TYPE_SCENE_SUBMESH_DATA_ANDROID,
        .submeshId = state.submeshId,
        .vertexCapacityInput = 0,
        .vertexCountOutput = 0,
        .vertexPositions = nullptr,
        .vertexNormals = nullptr,
        .vertexSemantics = nullptr,
        .indexCapacityInput = 0,
        .indexCountOutput = 0,
        .indices = nullptr,
      };
      submeshes.push_back(submesh);
      submeshesPoses.push_back(state.submeshPoseInBaseSpace);
    }
  }

  // Grab the data for the selected submeshes using the 2-call idiom.
  CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
  for (XrSceneSubmeshDataANDROID& submesh : submeshes) {
    submesh.vertexCapacityInput = submesh.vertexCountOutput;
    submesh.vertexCountOutput = 0;
    submesh.vertexPositions = new XrVector3f[submesh.vertexCountOutput];
    submesh.vertexNormals = new XrVector3f[submesh.vertexCountOutput];
    submesh.vertexSemantics = new uint8_t[submesh.vertexCountOutput];
    submesh.indexCapacityInput = submesh.indexCountOutput;
    submesh.indexCountOutput = 0;
    submesh.indices = new uint32_t[submesh.indexCountOutput];
  }
  CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));

  // Destroy the scene mesh snapshot since we have finally grabbed the submeshes data. In
  // next iteration app can: create a new one to get latest mesh data
  CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
  snapshot = XR_NULL_HANDLE;

  // Iterate the submeshes and get the vertex positions, vertex normals and
  // vertex semantics data for the selected submeshes
  for (uint32_t i = 0; i < submeshes.size(); i++) {
    XrSceneSubmeshDataANDROID& data = submeshes[i];
    XrVector3f* vertexPositions = data.vertexPositions;
    XrVector3f* vertexNormals = data.vertexNormals;
    XrSceneMeshSemanticLabelANDROID* vertexSemantics =
      reinterpret_cast<XrSceneMeshSemanticLabelANDROID*>(data.vertexSemantics);
    XrPosef pose = submeshesPoses[i];

    // *** Use the data as per needs ***

    // Release the allocated memory for the data buffers when done using
    delete [] data.vertexPositions;
    delete [] data.vertexNormals;
    delete [] data.vertexSemantics;
    delete [] data.indices;
  }

  // ...
  // Finish frame loop
  // ...
}

CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));

انواع اشیاء جدید

ثابت های جدید Enum

شمارش XrObjectType با:

  • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

شمارش XrStructureType با:

  • XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
  • XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
  • XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID
  • XR_TYPE_SCENE_SUBMESH_STATE_ANDROID
  • XR_TYPE_SCENE_SUBMESH_DATA_ANDROID

فهرست های جدید

ساختارهای جدید

توابع جدید

مسائل

تاریخچه نسخه

  • ویرایش 3، 15-05-2025 (سالار خان) ** توضیحات پسوند اولیه

OpenXR™ و لوگوی OpenXR علائم تجاری متعلق به The Khronos Group Inc. هستند و به عنوان یک علامت تجاری در چین، اتحادیه اروپا، ژاپن و بریتانیا ثبت شده اند.