XR_ANDROID_scene_meshing OpenXR uzantısı

Name String XR_ANDROID_scene_meshing

Uzantı Türü Örnek uzantısı

Kayıtlı Uzantı Numarası 464

Düzeltme 3

Uzantı ve Sürüm Bağımlılıkları OpenXR 1.0

Son Değiştirilme Tarihi 2025-05-15

IP Durumu Bilinen herhangi bir IP hak talebi yok.

Katkıda bulunanlar 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

Genel Bakış

Bu uzantı, ortamınızdaki fiziksel nesneleri yaklaşık olarak temsil eden ağlar için ağ verileri sağlamayı amaçlar. Sahnenizi sürükleyici bir uygulamada görselleştirmek ve sanal nesnelerin çarpışma gibi fiziksel nesnelerle etkileşime girmesine izin vermek için kullanılabilir.

Sahne ağı verileri hassas kişisel bilgiler olabilir ve kişisel gizlilik ile bütünlükle yakından bağlantılıdır. Sahne ağı verilerini depolayan veya aktaran uygulamaların, bu işlemi yapabilmek için her zaman kullanıcıdan aktif ve spesifik bir kabul istemesi önemle tavsiye edilir.

İzinler

Android uygulamalarının manifestlerinde android.permission.SCENE_UNDERSTANDING_FINE iznilistelenmelidir. android.permission.SCENE_UNDERSTANDING_FINE izni, çalışma zamanının kullanıcı ortamını incelemesine olanak tanıdığı için hassas bir izin olarak kabul edilir.

Uygulama, bu işlevleri kullanmak için çalışma zamanında izin istemelidir:

(Koruma düzeyi: tehlikeli)

Sistem kapasitesini inceleme

Bir uygulama, xrGetSystemProperties çağrılırken XrSystemSceneMeshingPropertiesANDROID yapısını XrSystemProperties'e zincirleyerek sistemin sahne ağ oluşturma özelliğine sahip olup olmadığını inceleyebilir.

XrSystemSceneMeshingPropertiesANDROID

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

Üye açıklamaları

  • type, bu yapının XrStructureType'ıdır.
  • next, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • supportsSceneMeshing, sistemin sahne birleştirme özelliğini destekleyip desteklemediğini belirten bir XrBool32 değeridir.

supportsSceneMeshing, XR_FALSE ise sistem, sahne birleştirmeyi desteklemez. Uygulama, supportsSceneMeshing değeri XR_FALSE olduğunda sahne ağı oluşturma işlevini kullanmaktan kaçınmalıdır. Aksi takdirde xrCreateSceneMeshingTrackerANDROID çağrıları başarısız olur.

supportsSceneMeshing XR_TRUE ise sistem, sahne birleştirmeyi destekler.

Geçerli Kullanım (Örtülü)

XrSceneMeshSemanticLabelSetANDROID

XrSceneMeshSemanticLabelSetANDROID numaralandırması, sahne ağ oluşturma için anlamsal etiket kümelerini açıklar. Bu enum'daki her değer, anlamsal etiketleri içeren başka bir enum'u temsil eder. Örneğin, XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID değeri XrSceneMeshSemanticLabelANDROID kümesini temsil eder.

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

Uygulama, xrEnumerateSupportedSemanticLabelSetsANDROID işlevini kullanarak sistem tarafından desteklenen semantik etiket kümelerini alabilir.

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

Parametre Açıklamaları

  • instance, uygulama tarafından oluşturulan bir XrInstance'tır.
  • systemId, xrGetSystem işlevinden yeniden denenmiş bir XrSystemId'dir.
  • supportedSemanticLabelSetsInputCapacity, supportedSemanticLabelSets uzunluğundadır.
  • supportedSemanticLabelSetsOutputCount, dizinin başından itibaren çalışma zamanı tarafından değiştirilen supportedSemanticLabelSets içindeki öğelerin sayısıdır.
  • supportedSemanticLabelSets, desteklenen semantik etiket kümelerinin çalışma zamanı tarafından yazıldığı bir XrSceneMeshSemanticLabelSetANDROID dizisidir.

Her sistemin en azından XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID değerini desteklemesi beklenir. Çünkü bu enum değeri, anlamsal etiket kümesi olmadığını gösterir ve uygulamanın köşe semantiğine ihtiyacı olmadığı durumlarda kullanılabilir.

Sahne ağı izleyici kolu oluşturma

XrSceneMeshingTrackerANDROID

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

XrSceneMeshingTrackerANDROID işleyici, sahne meshing için bir sahne meshing izleyiciyi ve ilgili kaynakları yönetmeyi temsil eder.

Bu tutma yeri, bu uzantıda xrCreateSceneMeshSnapshotANDROID kullanılarak sahne ağı anlık görüntüsü oluşturmak için kullanılabilir.

xrCreateSceneMeshingTrackerANDROID

Bir uygulama, xrCreateSceneMeshingTrackerANDROID işlevini kullanarak XrSceneMeshingTrackerANDROID tutacağı oluşturabilir.

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

Parametre Açıklamaları

Sistem, sahne ağı oluşturmayı desteklemiyorsa xrCreateSceneMeshingTrackerANDROID, XR_ERROR_FEATURE_UNSUPPORTED değerini döndürür. Uygulama, xrGetSystemProperties işlevini XrSystemSceneMeshingPropertiesANDROID yapısıyla çağırarak sistem desteğini kontrol edebilir.

Sahne örgü izleyici oluştururken XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet içinde yalnızca sistem tarafından desteklenen semantik etiket kümeleri kullanılabilir. Desteklenen anlamsal etiket kümelerinin listesini almak için xrEnumerateSupportedSemanticLabelSetsANDROID işlevi kullanılabilir.

Uygulama desteklenmeyen bir semanticLabelSet isterse xrCreateSceneMeshingTrackerANDROID, XR_ERROR_FEATURE_UNSUPPORTED değerini döndürür.

xrCreateSceneMeshingTrackerANDROID işleyeni, sahne ağ oluşturma için tüm kaynaklara sahiptir. Sahne ağı oluşturma deneyimi tamamlandığında uygulama, xrDestroySceneMeshingTrackerANDROID işlevi aracılığıyla tutma yerini yok etmelidir.

XrSceneMeshingTrackerCreateInfoANDROID

XrSceneMeshingTrackerCreateInfoANDROID yapısı, XrSceneMeshingTrackerANDROID tutacını oluşturmak için gereken bilgileri açıklar.

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

Üye açıklamaları

  • type, bu yapının XrStructureType'ıdır.
  • next, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • semanticLabelSet, sahne ağ oluşturma için kullanılacak semantik etiket grubunu belirtmek üzere kullanılan bir XrSceneMeshSemanticLabelSetANDROID'dir. Bu değer XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID olarak ayarlanırsa çalışma zamanı, XrSceneSubmeshDataANDROID::vertexSemantics arabellek alanını yoksayar.
  • enableNormals, sahne ağı verileri alınırken sahne ağı arabelleğindeki ağ köşeleri için köşe normallerinin dahil edilip edilmeyeceğini belirtmek üzere kullanılan bir XrBool32 değeridir.

xrDestroySceneMeshingTrackerANDROID

xrDestroySceneMeshingTrackerANDROID işlevi, sahne ağı oluşturma deneyimleri tamamlandığında tracker ve temel kaynakları serbest bırakır.

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID          tracker);

Parametre Açıklamaları

Sahne ağı anlık görüntüsü herkese açık kullanıcı adı oluşturma

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

XrSceneMeshSnapshotANDROID işleyici, sahne ağı anlık görüntüsünü temsil eder. Bu, xrCreateSceneMeshSnapshotANDROID kullanılarak oluşturulur. Bu işlev, işlev çağrısı sırasında sahne ağı verilerinin anlık görüntüsünü alır.

Bu işleyici, xrGetAllSubmeshStatesANDROID ve xrGetSubmeshDataANDROID kullanılarak alt ağ bilgileri ve verilerini almak için kullanılabilir.

XrSceneMeshSnapshotCreateInfoANDROID

XrSceneMeshSnapshotCreateInfoANDROID yapısı, XrSceneMeshSnapshotANDROID tutacını oluşturmak için gereken bilgileri açıklar.

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

Üye açıklamaları

  • type, bu yapının XrStructureType'ıdır.
  • next, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • baseSpace, sahne alt ağlarının poz bilgilerinin gösterilmesi gereken referans alanını tanımlamak için kullanılan bir XrSpace'tir.
  • time, sahne ağı işlenirken veya görüntülenirken geçen süreyi açıklayan XrTime'dır.
  • boundingBox, sahne ağının elde edileceği sınırlayıcı kutuyu açıklayan bir XrBoxf'dir.

XrSceneMeshTrackingStateANDROID

XrSceneMeshTrackingStateANDROID numaralandırması, sahne ağı izleyicisinin izleme durumunu açıklar. Bu numaralandırmadaki her değer, sahne ağı izleyicinin bir durumunu temsil eder. xrCreateSceneMeshSnapshotANDROID işlevinden döndürülen XrSceneMeshSnapshotCreationResultANDROID yapısı içinde sarmalanmış bu enum.

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 yapısı, xrCreateSceneMeshSnapshotANDROID'den döndürülen bir sahne ağı anlık görüntüsü oluşturma işleminin sonucunu saklar. Sonuç, anlık görüntü oluşturulduğu sırada anlık görüntü tutamacını ve sahne ağı izleyicinin izleme durumunu içerir.

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

Üye açıklamaları

  • type, bu yapının XrStructureType'ıdır.
  • next, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • snapshot, çalışma zamanı tarafından oluşturulan bir XrSceneMeshSnapshotANDROID tutma yeridir.
  • trackingState, anlık görüntü oluşturma sırasında sahne ağı izleyicinin durumunu açıklayan bir XrSceneMeshTrackingStateANDROID'dir.

xrCreateSceneMeshSnapshotANDROID

Uygulama, sahne ağı izleyicisinden sahne ağı anlık görüntüsü oluşturmak için xrCreateSceneMeshSnapshotANDROID işlevini kullanabilir. Bu işlev, XrSceneMeshSnapshotANDROID işleyicisini ve XrSceneMeshTrackingStateANDROID işleyicisini XrSceneMeshSnapshotCreationResultANDROID yapısı içinde sarmalanmış olarak döndürür. Tutma yeri, teknik olarak oluşturma sırasında sahne ağı verilerinin anlık görüntüsüdür. Bu işleyici, sırasıyla xrGetAllSubmeshStatesANDROID ve xrGetSubmeshDataANDROID kullanılarak sahne ağı bilgilerini ve verilerini sorgulamak için kullanılabilir.

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

Parametre Açıklamaları

Sahne ağı anlık görüntüsünden sahne ağı verilerini edinme

XrSceneSubmeshStateANDROID

XrSceneSubmeshStateANDROID, bir alt ağı tanımlar. Alt ağ hakkında temel bilgileri (kimlik, poz, sınırlar, son güncelleme zamanı) içerir.

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

Üye açıklamaları

  • type, bu yapının XrStructureType'ıdır.
  • next, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • submeshId, alt ağı tanımlayan bir XrUuid'dir.
  • lastUpdatedTime, alt ağın en son güncellendiği zamanı temsil eden bir XrTime'dır.
  • submeshPoseInBaseSpace, sahne ağı anlık görüntüsünü oluşturmak için kullanılan temel alandaki alt ağın pozunu temsil eden bir XrPosef'dir. Bu, alt ağ sınırlayıcı kutusunun merkezinin duruşudur.
  • bounds, alt ağı çevreleyen sınırlayıcı kutunun boyutlarını açıklayan bir XrExtent3Df'dir. Bu sınırlar, sahne ağı tutacını oluşturmak için kullanılan temel alandadır.

xrGetAllSubmeshStatesANDROID

Uygulama, sahne ağındaki tüm alt ağların durumunu almak için xrGetAllSubmeshStatesANDROID işlevini kullanabilir. Bu, uygulamanın veri istediği alt ağları seçmesine olanak tanıyan temel bilgileri içerir. Bu işlev, 2 çağrılı bir deyimde kullanılabilir.

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

Parametre Açıklamaları

  • snapshot, daha önce xrCreateSceneMeshSnapshotANDROID ile oluşturulmuş bir XrSceneMeshSnapshotANDROID tutamacıdır.
  • submeshStateCapacityInput, submeshStates uzunluğundadır.
  • submeshStateCountOutput, dizinin başından itibaren çalışma zamanı tarafından değiştirilen submeshStates içindeki öğelerin sayısıdır.
  • submeshStates, çalışma zamanının sahne ağındaki tüm alt ağların durumunu çıkış olarak vereceği XrSceneSubmeshStateANDROID yapıları dizisidir.

XrSceneSubmeshDataANDROID

XrSceneSubmeshDataANDROID, bir alt ağın üçgen verilerini ve alt ağ kimliğini içerir. Bu yapı, alt ağ verilerini almak için xrGetSubmeshDataANDROID içinde kullanılır. Uygulama, bu yapının alt ağ kimliğini ve arabellek işaretçilerini, ayrılan arabelleklerde alt ağ için döndürülen veriler doldurulabilecek şekilde ayarlamalıdır. Uygulama, xrGetSubmeshDataANDROID'i 2 çağrılı bir deyim olarak kullanabilir. İlk çağrı, uygulamanın alt ağ kimliğini ayarlamasını ve alt ağ verileri için gereken arabelleklerin boyutlarını almasını gerektirir. Ardından uygulama, arabellekleri ayırabilir ve ikinci çağrıda verileri alabilir.

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;

Üye açıklamaları

  • type, bu yapının XrStructureType'ıdır.
  • next, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.
  • submeshId, alt ağı tanımlayan bir XrUuid'dir.
  • vertexCapacityInput, vertexPositions, vertexNormals ve vertexSemantics uzunluğundadır.
  • vertexCountOutput, vertexPositions, vertexNormals ve vertexSemantics dizilerinde, dizinin başından itibaren çalışma zamanı tarafından değiştirilen öğelerin sayısıdır.
  • vertexPositions, çalışma zamanının alt ağın köşe konumlarını çıkış olarak vereceği bir XrVector3f dizisidir.
  • vertexNormals, çalışma zamanının alt ağın köşe normallerini çıkış olarak vereceği bir XrVector3f dizisidir. Uygulama, normal değerleri devre dışı bırakılmış bir izleyici oluşturduysa bu alan boş bırakılabilir.NULL
  • vertexSemantics, çalışma zamanının alt ağın köşe anlamlarını çıkış olarak vereceği uint8_t dizisidir. Uygulama, XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID semantik etiketi ayarlanmış bir izleyici oluşturduysa bu alan boş bırakılabilir (NULL).
  • indexCapacityInput, indices uzunluğundadır.
  • indexCountOutput, indices dizisinde, dizinin başından itibaren çalışma zamanı tarafından değiştirilen öğelerin sayısıdır.
  • indices, çalışma zamanının alt ağın dizinlerini çıkış olarak vereceği bir uint32_t dizisidir.

xrGetSubmeshDataANDROID

Uygulama, seçili bir alt ağ listesinin verilerini almak için xrGetSubmeshDataANDROID işlevini kullanabilir. Bu işlev, 2 çağrılı bir deyimde kullanılabilir. İlk çağrıda, uygulama alt ağ verileri için gereken arabelleklerin boyutlarını almak üzere seçilen alt ağ listesindeki her öğe için geçerli bir alt ağ kimliği (ör.aynı sahne ağı anlık görüntüsüyle xrGetAllSubmeshStatesANDROID'den alınabilir) ve sıfır kapasite ayarlamalıdır. İkinci çağrıda, uygulama, alt ağların verilerini almak için arabelleklerin kapasitesiyle birlikte, seçilen alt ağ listesindeki her öğe için arabellek işaretçilerini ayrılmış bir arabelleğe ayarlamalıdır.

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

Parametre Açıklamaları

XrSceneMeshSemanticLabelANDROID

XrSceneMeshSemanticLabelANDROID numaralandırması, örgü köşelerini hangi fiziksel ortam yüzeyinde olduklarını açıklayacak şekilde etiketlemek için kullanılabilecek varsayılan semantik etiket kümesidir. Bu enum kümesi, XrSceneMeshSemanticLabelSetANDROID içindeki XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID değeriyle temsil edilir.

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;

Sahne ağı anlık görüntüsünü silme

xrDestroySceneMeshSnapshotANDROID

Uygulama, sahne ağı anlık görüntüsünü silmek için xrDestroySceneMeshSnapshotANDROID işlevini kullanabilir. İşleyici yok edildikten sonra uygulama, alt ağ bilgisi veya verilerini almak için artık işleyiciyi kullanamaz. İzleyici tutacağı, sahne ağı anlık görüntüsü tutacağının üst öğesi olduğundan izleyici yok edildiğinde tutacak otomatik olarak yok edilir.

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID            snapshot);

Parametre Açıklamaları

Sahne ağı oluşturma için örnek kod

Aşağıdaki örnek kod, oluşturma için sahne ağı verilerine nasıl erişileceğini gösterir.

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

Yeni Nesne Türleri

Yeni Enum Sabitleri

XrObjectType numaralandırması şu öğelerle genişletildi:

  • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

XrStructureType numaralandırması şu değerlerle genişletildi:

  • 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

Yeni sıralamalar

Yeni Yapılar

Yeni İşlevler

Sorunlar

Sürüm Geçmişi

  • Sürüm 3, 15.05.2025 (Salar Khan) ** İlk uzantı açıklaması

OpenXR™ ve OpenXR logosu, The Khronos Group Inc. şirketinin ticari markalarıdır ve Çin, Avrupa Birliği, Japonya ve Birleşik Krallık'ta ticari marka olarak tescillidir.