이름 문자열
XR_ANDROID_scene_meshing
확장 프로그램 유형 인스턴스 확장 프로그램
등록된 확장 프로그램 번호 464
버전 3
확장 프로그램 및 버전 종속 항목 OpenXR 1.0
최종 수정일 2025년 5월 15일
IP 상태 알려진 IP 소유권 주장이 없습니다.
기여자 스펜서 퀸, Google 제러드 파인더, Google 안토니오 폰탄, Google 케언 오버터프, Google 니하브 제인, Google 살라르 칸, Google 세바스티안 클로제, Google 위르겐 슈트룸, Google 비니 다실바, Google 리카르도 캠벨, Google
개요
이 확장 프로그램은 환경의 실제 객체를 대략적으로 나타내는 메시의 메시 데이터를 제공하기 위한 것입니다. 몰입형 애플리케이션에서 장면을 시각화하고 가상 객체가 충돌과 같은 실제 객체와 상호작용하도록 허용하는 데 사용할 수 있습니다.
장면 메싱 데이터는 민감한 개인 정보일 수 있으며 개인 정보 보호 및 무결성과 밀접하게 연결되어 있습니다. 장면 메시 데이터 저장 또는 전송 애플리케이션은 항상 사용자에게 이를 수행하기 위한 적극적이고 구체적인 수락을 요청하는 것이 좋습니다.
권한
Android 애플리케이션은 매니페스트에 android.permission.SCENE_UNDERSTANDING_FINE
권한이 나열되어 있어야 합니다.
android.permission.SCENE_UNDERSTANDING_FINE
권한은 런타임이 사용자 환경을 학습할 수 있도록 허용하므로 민감한 권한으로 간주됩니다.
애플리케이션은 다음 기능을 사용하기 위해 런타임에 권한을 요청해야 합니다.
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(보호 수준: 위험)
시스템 기능 검사
애플리케이션은 xrGetSystemProperties를 호출할 때 XrSystemSceneMeshingPropertiesANDROID 구조를 XrSystemProperties에 연결하여 시스템이 장면 메시를 지원하는지 검사할 수 있습니다.
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
이면 시스템은 장면 메시를 지원합니다.
유효한 사용 (암시적)
XR_ANDROID_scene_meshing
확장 프로그램은 XrSystemSceneMeshingPropertiesANDROID를 사용하기 전에 사용 설정해야 합니다.type
은XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
이어야 합니다.next
는NULL
이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
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
는 xrGetSystem에서 다시 시도된 XrSystemId입니다.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
를 반환합니다.
애플리케이션은 XrSystemSceneMeshingPropertiesANDROID 구조체로 xrGetSystemProperties를 호출하여 시스템 지원을 확인할 수 있습니다.
장면 메싱 추적기를 생성할 때 시스템에서 지원하는 시맨틱 라벨 세트만 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);
매개변수 설명
tracker
은 이전에 xrCreateSceneMeshingTrackerANDROID로 생성된 XrSceneMeshingTrackerANDROID입니다.
장면 메시 스냅샷 핸들 만들기
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의 각 값은 장면 메싱 추적기의 상태를 나타냅니다. 이 열거형은 xrCreateSceneMeshSnapshotANDROID에서 반환되는 XrSceneMeshSnapshotCreationResultANDROID 구조로 래핑됩니다.
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 함수를 사용하여 장면 메싱 추적기에서 장면 메시 스냅샷을 만들 수 있습니다. 이 함수는 XrSceneMeshSnapshotCreationResultANDROID 구조로 래핑된 XrSceneMeshTrackingStateANDROID와 함께 XrSceneMeshSnapshotANDROID 핸들을 반환합니다. 핸들은 생성 시점의 장면 메시 데이터의 스냅샷입니다. 이 핸들은 각각 xrGetAllSubmeshStatesANDROID 및 xrGetSubmeshDataANDROID를 사용하여 장면 메시 정보와 데이터를 쿼리하는 데 사용할 수 있습니다.
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
매개변수 설명
tracker
은 이전에 xrCreateSceneMeshingTrackerANDROID로 생성된 XrSceneMeshingTrackerANDROID 핸들입니다.createInfo
는 장면 메시 스냅샷을 만드는 데 필요한 필수 정보가 포함된 XrSceneMeshSnapshotCreateInfoANDROID 구조체에 대한 포인터입니다.outSnapshotCreationResult
는 런타임에서 스냅샷 생성 결과로 채워지는 XrSceneMeshSnapshotCreationResultANDROID 객체에 대한 포인터입니다.
장면 메시 스냅샷에서 장면 메시 데이터 획득
XrSceneSubmeshStateANDROID
XrSceneSubmeshStateANDROID는 서브메시를 설명합니다. 여기에는 하위 메시의 기본 정보 (ID, 포즈, 경계, 마지막 업데이트 시간)가 포함됩니다.
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
은 이전에 xrCreateSceneMeshSnapshotANDROID로 생성된 XrSceneMeshSnapshotANDROID 핸들입니다.submeshStateCapacityInput
은submeshStates
의 길이입니다.submeshStateCountOutput
는 배열의 시작부터 런타임에 의해 수정된submeshStates
의 요소 수입니다.submeshStates
는 런타임이 장면 메시의 모든 하위 메시 상태를 출력할 XrSceneSubmeshStateANDROID 구조체의 배열입니다.
XrSceneSubmeshDataANDROID
XrSceneSubmeshDataANDROID에는 하위 메시의 삼각형 데이터와 하위 메시 ID가 포함됩니다. 이 구조는 xrGetSubmeshDataANDROID에서 하위 메시의 데이터를 가져오는 데 사용됩니다. 애플리케이션은 할당된 버퍼에 하위 메시의 반환된 데이터를 채울 수 있도록 이 구조체의 하위 메시 ID와 할당된 버퍼의 버퍼 포인터를 설정해야 합니다. 애플리케이션은 첫 번째 호출에서 애플리케이션이 서브메시 ID를 설정하고 서브메시 데이터에 필요한 버퍼 크기를 가져와야 하는 2호출 관용구로 xrGetSubmeshDataANDROID를 사용할 수 있습니다. 그러면 애플리케이션이 두 번째 호출에서 버퍼를 할당하고 데이터를 가져올 수 있습니다.
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통화 관용구에서 사용할 수 있습니다. 첫 번째 호출에서 애플리케이션은 선택한 하위 메시 목록의 각 요소에 유효한 하위 메시 ID (즉, 동일한 장면 메시 스냅샷으로 xrGetAllSubmeshStatesANDROID에서 검색 가능)와 용량 0을 설정하여 하위 메시 데이터에 필요한 버퍼 크기를 가져와야 합니다. 두 번째 호출에서 애플리케이션은 선택한 하위 메시 목록의 각 요소에 할당된 버퍼에 버퍼 포인터를 설정하고 하위 메시의 데이터를 가져오기 위해 버퍼의 용량을 설정해야 합니다.
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
매개변수 설명
snapshot
은 이전에 xrCreateSceneMeshSnapshotANDROID로 생성된 XrSceneMeshSnapshotANDROID 핸들입니다.submeshDataCount
은inoutSubmeshData
의 길이입니다.inoutSubmeshData
는 XrSceneSubmeshDataANDROID의 배열로, 각 요소는 런타임에서 하위 메시 ID를 기반으로 메시 데이터로 채워집니다.
XrSceneMeshSemanticLabelANDROID
XrSceneMeshSemanticLabelANDROID 열거형은 메시 꼭짓점에 라벨을 지정하여 메시 꼭짓점이 있는 실제 환경 표면을 설명하는 데 사용할 수 있는 기본 시맨틱 라벨 집합입니다.
이 열거형 세트는 XrSceneMeshSemanticLabelSetANDROID의 XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
값으로 표시됩니다.
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 함수를 사용하여 장면 메시 스냅샷을 소멸할 수 있습니다. 핸들이 소멸되면 애플리케이션에서 더 이상 이를 사용하여 하위 메시 정보나 데이터를 가져올 수 있습니다. 트래커 핸들은 장면 메시 스냅샷 핸들의 상위 요소이므로 트래커가 소멸되면 핸들이 자동으로 소멸됩니다.
XrResult xrDestroySceneMeshSnapshotANDROID(
XrSceneMeshSnapshotANDROID snapshot);
매개변수 설명
snapshot
는 이 함수에 의해 소멸되는 xrCreateSceneMeshSnapshotANDROID로 이전에 생성된 XrSceneMeshSnapshotANDROID 핸들입니다.
장면 메시의 예시 코드
다음 예시 코드는 렌더링을 위해 장면 메시 데이터에 액세스하는 방법을 보여줍니다.
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));
새 객체 유형
새 열거형 상수
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
새 열거형
새 구조
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
새 함수
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
문제
버전 기록
- 버전 3, 2025년 5월 15일 (살라르 칸) ** 초기 확장 프로그램 설명
OpenXR™ 및 OpenXR 로고는 The Khronos Group Inc. 소유의 상표이며 중국, 유럽 연합, 일본, 영국에 상표로 등록되어 있습니다.