Ekstensi OpenXR XR_ANDROID_scene_meshing

String Nama XR_ANDROID_scene_meshing

Jenis Ekstensi Ekstensi instance

Registered Extension Number 464

Revisi 3

Dependensi Ekstensi dan Versi OpenXR 1.0

Tanggal Terakhir Diubah 15-05-2025

Status IP Tidak ada klaim IP yang diketahui.

Kontributor 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

Ringkasan

Ekstensi ini dimaksudkan untuk menyediakan data mesh bagi mesh yang secara kasar merepresentasikan objek fisik di lingkungan Anda. Fitur ini dapat digunakan untuk memvisualisasikan adegan Anda dalam aplikasi imersif dan memungkinkan objek virtual berinteraksi dengan objek fisik seperti tabrakan.

Data penyambungan adegan dapat berupa informasi pribadi yang sensitif dan terkait erat dengan privasi dan integritas pribadi. Sangat disarankan agar aplikasi yang menyimpan atau mentransfer data penyusunan mesh adegan selalu meminta persetujuan aktif dan spesifik dari pengguna untuk melakukannya.

Izin

Aplikasi Android harus memiliki izin android.permission.SCENE_UNDERSTANDING_FINE yang tercantum dalam manifesnya. Izin android.permission.SCENE_UNDERSTANDING_FINE dianggap sebagai izin sensitif karena memungkinkan runtime mempelajari lingkungan pengguna.

Aplikasi harus meminta izin saat runtime untuk menggunakan fungsi berikut:

(tingkat perlindungan: berbahaya)

Memeriksa kemampuan sistem

Aplikasi dapat memeriksa apakah sistem mampu melakukan penyusunan mesh adegan dengan menghubungkan struktur XrSystemSceneMeshingPropertiesANDROID ke XrSystemProperties saat memanggil xrGetSystemProperties.

XrSystemSceneMeshingPropertiesANDROID

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • supportsSceneMeshing adalah XrBool32, yang menunjukkan apakah sistem mendukung penyusunan jaring adegan.

Jika supportsSceneMeshing adalah XR_FALSE, sistem tidak mendukung penggabungan adegan. Aplikasi harus menghindari penggunaan fungsi pemaduan adegan saat supportsSceneMeshing adalah XR_FALSE, karena panggilan ke xrCreateSceneMeshingTrackerANDROID akan gagal.

Jika supportsSceneMeshing adalah XR_TRUE, sistem mendukung penyatuan adegan.

Penggunaan yang Valid (Implisit)

XrSceneMeshSemanticLabelSetANDROID

Enumerasi XrSceneMeshSemanticLabelSetANDROID menjelaskan set label semantik untuk pembuatan mesh adegan. Setiap nilai dalam enum ini merepresentasikan enum lain yang berisi label semantik. Misalnya, nilai XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID mewakili set 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

Aplikasi dapat mendapatkan set label semantik yang didukung oleh sistem menggunakan fungsi xrEnumerateSupportedSemanticLabelSetsANDROID.

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

Deskripsi Parameter

  • instance adalah XrInstance yang dibuat oleh aplikasi.
  • systemId adalah XrSystemId yang dicoba lagi dari xrGetSystem.
  • supportedSemanticLabelSetsInputCapacity adalah panjang supportedSemanticLabelSets.
  • supportedSemanticLabelSetsOutputCount adalah jumlah elemen dalam supportedSemanticLabelSets yang diubah oleh runtime mulai dari awal array.
  • supportedSemanticLabelSets adalah array XrSceneMeshSemanticLabelSetANDROID yang berisi set label semantik yang didukung dan ditulis oleh runtime.

Setiap sistem diharapkan setidaknya mendukung XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID karena nilai enum ini tidak merepresentasikan set label semantik dan dapat digunakan jika aplikasi tidak memerlukan semantik verteks.

Membuat handle pelacak penyambungan adegan

XrSceneMeshingTrackerANDROID

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

Handle XrSceneMeshingTrackerANDROID merepresentasikan pelacak pemetaan visualisasi 3D untuk pemetaan visualisasi 3D dan mengelola resource terkait.

Handle ini dapat digunakan untuk membuat snapshot mesh adegan menggunakan xrCreateSceneMeshSnapshotANDROID dalam ekstensi ini.

xrCreateSceneMeshingTrackerANDROID

Aplikasi dapat membuat handle XrSceneMeshingTrackerANDROID menggunakan fungsi xrCreateSceneMeshingTrackerANDROID.

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

Deskripsi Parameter

Jika sistem tidak mendukung penyusunan jaring adegan, xrCreateSceneMeshingTrackerANDROID akan menampilkan XR_ERROR_FEATURE_UNSUPPORTED. Aplikasi dapat memeriksa dukungan sistem dengan memanggil xrGetSystemProperties dengan struktur XrSystemSceneMeshingPropertiesANDROID.

Hanya set label semantik yang didukung oleh sistem yang dapat digunakan di XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet saat membuat pelacak pemeshan adegan. Fungsi xrEnumerateSupportedSemanticLabelSetsANDROID dapat digunakan untuk mendapatkan daftar set label semantik yang didukung.

Jika aplikasi meminta semanticLabelSet yang tidak didukung, xrCreateSceneMeshingTrackerANDROID akan menampilkan XR_ERROR_FEATURE_UNSUPPORTED.

Handler xrCreateSceneMeshingTrackerANDROID memiliki semua resource untuk pemetaan mesh adegan. Setelah selesai menggunakan pengalaman pemaduan adegan, aplikasi harus menghancurkan handle melalui fungsi xrDestroySceneMeshingTrackerANDROID.

XrSceneMeshingTrackerCreateInfoANDROID

Struktur XrSceneMeshingTrackerCreateInfoANDROID menjelaskan informasi untuk membuat handle XrSceneMeshingTrackerANDROID.

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • semanticLabelSet adalah XrSceneMeshSemanticLabelSetANDROID yang digunakan untuk menentukan set label semantik yang akan digunakan untuk pembuatan mesh adegan. Jika disetel ke XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, runtime akan mengabaikan kolom buffer XrSceneSubmeshDataANDROID::vertexSemantics.
  • enableNormals adalah XrBool32 yang digunakan untuk menentukan apakah akan menyertakan normal verteks untuk verteks mesh dalam buffer mesh adegan saat mendapatkan data mesh adegan.

xrDestroySceneMeshingTrackerANDROID

Fungsi xrDestroySceneMeshingTrackerANDROID melepaskan tracker dan resource pokok saat selesai menggunakan pengalaman pemetaan mesh adegan.

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID          tracker);

Deskripsi Parameter

Membuat handle snapshot mesh adegan

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

Handle XrSceneMeshSnapshotANDROID merepresentasikan snapshot mesh adegan. Objek ini dibuat menggunakan xrCreateSceneMeshSnapshotANDROID yang pada dasarnya mengambil snapshot data mesh adegan pada saat panggilan fungsi.

Handle ini dapat digunakan untuk mengambil informasi dan data submesh menggunakan xrGetAllSubmeshStatesANDROID dan xrGetSubmeshDataANDROID.

XrSceneMeshSnapshotCreateInfoANDROID

Struktur XrSceneMeshSnapshotCreateInfoANDROID menjelaskan informasi untuk membuat handle XrSceneMeshSnapshotANDROID

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • baseSpace adalah XrSpace yang digunakan untuk mendeskripsikan ruang referensi tempat info pose submesh adegan harus direpresentasikan.
  • time adalah XrTime yang menjelaskan waktu saat mesh adegan akan diproses atau ditampilkan.
  • boundingBox adalah XrBoxf yang menjelaskan kotak pembatas tempat untuk mendapatkan mesh adegan.

XrSceneMeshTrackingStateANDROID

Enumerasi XrSceneMeshTrackingStateANDROID menjelaskan status pelacakan untuk pelacak pemetaan visualisasi adegan. Setiap nilai dalam enum ini mewakili status pelacak pemeshan adegan. Enum ini di-wrap dalam struktur XrSceneMeshSnapshotCreationResultANDROID yang ditampilkan dari 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

Struktur XrSceneMeshSnapshotCreationResultANDROID menyimpan hasil pembuatan snapshot mesh adegan yang ditampilkan dari xrCreateSceneMeshSnapshotANDROID. Hasilnya mencakup handle snapshot dan status pelacakan dari pelacak pemeshan scene pada saat pembuatan snapshot.

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • snapshot adalah handle XrSceneMeshSnapshotANDROID yang dibuat oleh runtime.
  • trackingState adalah XrSceneMeshTrackingStateANDROID yang mendeskripsikan status pelacak pemetaan visualisasi adegan pada saat pembuatan snapshot.

xrCreateSceneMeshSnapshotANDROID

Aplikasi dapat menggunakan fungsi xrCreateSceneMeshSnapshotANDROID untuk membuat snapshot mesh adegan dari pelacak mesh adegan. Fungsi ini menampilkan handle XrSceneMeshSnapshotANDROID bersama dengan XrSceneMeshTrackingStateANDROID yang di-wrap dalam struktur XrSceneMeshSnapshotCreationResultANDROID. Secara teknis, handle adalah snapshot data mesh adegan pada saat pembuatan. Handle dapat digunakan untuk membuat kueri info dan data mesh adegan menggunakan xrGetAllSubmeshStatesANDROID dan xrGetSubmeshDataANDROID masing-masing.

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

Deskripsi Parameter

Mendapatkan data mesh adegan dari snapshot mesh adegan

XrSceneSubmeshStateANDROID

XrSceneSubmeshStateANDROID menjelaskan submesh. Objek ini berisi informasi dasar tentang submesh (ID, pose, batas, waktu terakhir diperbarui).

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

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • submeshId adalah XrUuid yang mengidentifikasi submesh.
  • lastUpdatedTime adalah XrTime yang menunjukkan waktu saat submesh terakhir diperbarui.
  • submeshPoseInBaseSpace adalah XrPosef yang merepresentasikan pose submesh dalam ruang dasar yang digunakan untuk membuat snapshot mesh adegan. Ini juga merupakan pose pusat kotak pembatas submesh.
  • bounds adalah XrExtent3Df yang menjelaskan dimensi kotak pembatas yang mengapit submesh. Bounds ini berada di ruang dasar yang digunakan untuk membuat handle mesh adegan.

xrGetAllSubmeshStatesANDROID

Aplikasi dapat menggunakan fungsi xrGetAllSubmeshStatesANDROID untuk mendapatkan status semua submesh dalam mesh adegan. Objek ini berisi informasi dasar untuk memungkinkan aplikasi memilih submesh yang datanya diinginkan oleh aplikasi. Fungsi ini dapat digunakan dalam idiom 2 panggilan.

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

Deskripsi Parameter

  • snapshot adalah handle XrSceneMeshSnapshotANDROID yang sebelumnya dibuat dengan xrCreateSceneMeshSnapshotANDROID.
  • submeshStateCapacityInput adalah panjang submeshStates.
  • submeshStateCountOutput adalah jumlah elemen dalam submeshStates yang diubah oleh runtime mulai dari awal array.
  • submeshStates adalah array struktur XrSceneSubmeshStateANDROID yang akan digunakan runtime untuk menampilkan status semua submesh dalam mesh adegan.

XrSceneSubmeshDataANDROID

XrSceneSubmeshDataANDROID berisi data segitiga untuk submesh bersama dengan ID submesh. Struktur ini digunakan di xrGetSubmeshDataANDROID untuk mendapatkan data submesh. Aplikasi harus menetapkan ID submesh struct ini dan pointer buffer ke buffer yang dialokasikan sehingga data yang ditampilkan untuk submesh dapat diisi di buffer yang dialokasikan. Aplikasi dapat menggunakan xrGetSubmeshDataANDROID sebagai idiom 2 panggilan di mana panggilan pertama akan mengharuskan aplikasi untuk menyetel ID submesh dan mendapatkan ukuran buffer yang diperlukan untuk data submesh, lalu aplikasi dapat mengalokasikan buffer dan mendapatkan data dalam panggilan kedua.

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;

Deskripsi Anggota

  • type adalah XrStructureType dari struktur ini.
  • next adalah NULL atau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.
  • submeshId adalah XrUuid yang mengidentifikasi submesh.
  • vertexCapacityInput adalah panjang vertexPositions, vertexNormals, dan vertexSemantics.
  • vertexCountOutput adalah jumlah elemen dalam vertexPositions, vertexNormals, dan vertexSemantics yang telah diubah oleh runtime mulai dari awal array.
  • vertexPositions adalah array XrVector3f yang akan digunakan runtime untuk menampilkan posisi verteks submesh.
  • vertexNormals adalah array XrVector3f yang akan digunakan runtime untuk menampilkan normalitas verteks submesh. Kolom ini dapat dibiarkan NULL jika aplikasi membuat pelacak dengan normal dinonaktifkan.
  • vertexSemantics adalah array uint8_t yang akan digunakan runtime untuk menampilkan semantik verteks submesh. Kolom ini dapat dibiarkan NULL jika aplikasi membuat pelacak dengan setelan XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID label semantik.
  • indexCapacityInput adalah panjang indices.
  • indexCountOutput adalah jumlah elemen dalam indices yang telah diubah oleh runtime mulai dari awal array.
  • indices adalah array uint32_t yang akan menampilkan indeks submesh oleh runtime.

xrGetSubmeshDataANDROID

Aplikasi dapat menggunakan fungsi xrGetSubmeshDataANDROID untuk mendapatkan data untuk daftar submesh yang dipilih. Fungsi ini dapat digunakan dalam idiom 2 panggilan. Pada panggilan pertama, aplikasi harus menetapkan ID submesh yang valid (yaitu: Dapat diambil dari xrGetAllSubmeshStatesANDROID dengan snapshot mesh adegan yang sama) dan kapasitas nol untuk setiap elemen dalam daftar submesh yang dipilih untuk mendapatkan ukuran buffer yang diperlukan untuk data submesh. Pada panggilan kedua, aplikasi harus menyetel pointer buffer ke buffer yang dialokasikan untuk setiap elemen dalam daftar submesh yang dipilih bersama dengan kapasitas buffer untuk mendapatkan data submesh.

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

Deskripsi Parameter

XrSceneMeshSemanticLabelANDROID

Enumerasi XrSceneMeshSemanticLabelANDROID adalah kumpulan default label semantik yang dapat digunakan untuk memberi label pada verteks mesh guna mendeskripsikan permukaan lingkungan fisik tempat verteks mesh berada. Kumpulan enum ini diwakili oleh nilai XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID dalam 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;

Menghancurkan snapshot mesh adegan

xrDestroySceneMeshSnapshotANDROID

Aplikasi dapat menggunakan fungsi xrDestroySceneMeshSnapshotANDROID untuk menghancurkan snapshot mesh adegan. Setelah handle dihancurkan, aplikasi tidak dapat lagi menggunakannya untuk mendapatkan info atau data submesh. Handle akan otomatis dihancurkan saat pelacak dihancurkan karena handle pelacak adalah induk dari handle snapshot mesh adegan.

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID            snapshot);

Deskripsi Parameter

Contoh kode untuk pemetaan mesh adegan

Contoh kode berikut menunjukkan cara mengakses data mesh adegan untuk rendering.

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));

Jenis Objek Baru

Konstanta Enum Baru

Enumerasi XrObjectType diperluas dengan:

  • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

Enumerasi XrStructureType diperluas dengan:

  • 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

Enum Baru

Struktur Baru

Fungsi Baru

Masalah

Histori Versi

  • Revisi 3, 15-05-2025 (Salar Khan) ** Deskripsi ekstensi awal

OpenXR™ dan logo OpenXR adalah merek dagang yang dimiliki oleh The Khronos Group Inc. dan terdaftar sebagai merek dagang di China, Uni Eropa, Jepang, dan Inggris Raya.