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:
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(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
adalahNULL
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)
- Ekstensi
XR_ANDROID_scene_meshing
harus diaktifkan sebelum menggunakan XrSystemSceneMeshingPropertiesANDROID type
harus berupaXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
next
harus berupaNULL
atau pointer yang valid ke struktur berikutnya dalam rantai struktur
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 panjangsupportedSemanticLabelSets
.supportedSemanticLabelSetsOutputCount
adalah jumlah elemen dalamsupportedSemanticLabelSets
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
session
adalah XrSession tempat pelacak pemetaan mesh scene akan aktif.createInfo
adalah pointer ke struktur XrSceneMeshingTrackerCreateInfoANDROID yang digunakan untuk mendeskripsikan pelacak pemeshan adegan yang akan dibuat.tracker
adalah handle XrSceneMeshingTrackerANDROID yang ditampilkan.
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
adalahNULL
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 keXR_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
tracker
adalah XrSceneMeshingTrackerANDROID yang sebelumnya dibuat oleh xrCreateSceneMeshingTrackerANDROID.
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
adalahNULL
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
adalahNULL
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
tracker
adalah handle XrSceneMeshingTrackerANDROID yang sebelumnya dibuat dengan xrCreateSceneMeshingTrackerANDROID.createInfo
adalah pointer ke struktur XrSceneMeshSnapshotCreateInfoANDROID yang berisi informasi yang diperlukan untuk membuat snapshot mesh adegan.outSnapshotCreationResult
adalah pointer ke objek XrSceneMeshSnapshotCreationResultANDROID yang diisi oleh runtime dengan hasil pembuatan snapshot.
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
adalahNULL
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 panjangsubmeshStates
.submeshStateCountOutput
adalah jumlah elemen dalamsubmeshStates
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
adalahNULL
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 panjangvertexPositions
,vertexNormals
, danvertexSemantics
.vertexCountOutput
adalah jumlah elemen dalamvertexPositions
,vertexNormals
, danvertexSemantics
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 dibiarkanNULL
jika aplikasi membuat pelacak dengan normal dinonaktifkan.vertexSemantics
adalah arrayuint8_t
yang akan digunakan runtime untuk menampilkan semantik verteks submesh. Kolom ini dapat dibiarkanNULL
jika aplikasi membuat pelacak dengan setelanXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
label semantik.indexCapacityInput
adalah panjangindices
.indexCountOutput
adalah jumlah elemen dalamindices
yang telah diubah oleh runtime mulai dari awal array.indices
adalah arrayuint32_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
snapshot
adalah handle XrSceneMeshSnapshotANDROID yang sebelumnya dibuat dengan xrCreateSceneMeshSnapshotANDROID.submeshDataCount
adalah panjanginoutSubmeshData
.inoutSubmeshData
adalah array XrSceneSubmeshDataANDROID di mana setiap elemen akan diisi dengan data mesh oleh runtime berdasarkan ID submesh.
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
snapshot
adalah handle XrSceneMeshSnapshotANDROID yang sebelumnya dibuat dengan xrCreateSceneMeshSnapshotANDROID yang akan dihancurkan oleh fungsi ini.
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
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
Fungsi Baru
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
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.