XR_ANDROID_geospatial
Name String
XR_ANDROID_geospatial
ประเภทส่วนขยาย
ส่วนขยายอินสแตนซ์
หมายเลขต่อที่ลงทะเบียน
790
การแก้ไข
1
สถานะการให้สัตยาบัน
ยังไม่ให้สัตยาบัน
การขึ้นต่อกันของส่วนขยายและเวอร์ชัน
XR_EXT_future
วันที่แก้ไขล่าสุด
2025-12-18
สถานะ IP
ไม่มีการอ้างสิทธิ์ใน IP ที่ทราบ
ผู้เขียน
John Ullman, Google
Ben King, Google
Nihav Jain, Google
Jared Finder, Google
ภาพรวม
ส่วนขยายนี้ให้การติดตามภูมิสารสนเทศเชิงพื้นที่สำหรับ Geospatial API ของ Google ซึ่งให้ตำแหน่งทางภูมิศาสตร์และการวางแนวที่แม่นยำ และช่วยให้แอปพลิเคชันวางเนื้อหาที่เกี่ยวข้องกับโลกได้ โดยจะใช้การติดตามการเคลื่อนไหว, GPS และเซ็นเซอร์อื่นๆ รวมถึงระบบกำหนดตำแหน่งด้วยภาพ (VPS) ของ Google VPS จะเปรียบเทียบรูปภาพจากกล้องของอุปกรณ์กับภาพ Street View เพื่อระบุตำแหน่งที่แน่นอนและทิศทาง Geospatial API มักจะให้ความแม่นยำของตำแหน่งในระดับต่ำกว่า 1 เมตร (ดีกว่า GPS หลายเท่า) และความแม่นยำของทิศทางในระดับต่ำกว่า 1 องศา
หากต้องการใช้ API ในส่วนขยายนี้ให้สำเร็จ (นอกเหนือจากการตรวจสอบการรองรับส่วนขยาย) แอปพลิเคชันต้องตั้งค่าข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์ให้สำเร็จผ่านกลไกบางอย่าง เช่น XR_ANDROID_google_cloud_auth ดูรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าและผลลัพธ์ข้อผิดพลาดในเอกสารประกอบของส่วนขยายการตรวจสอบสิทธิ์
สิทธิ์
แอปพลิเคชัน Android ต้องมีสิทธิ์ android.permission.ACCESS_FINE_LOCATION แสดงอยู่ในไฟล์ Manifest เพื่อใช้ส่วนขยายนี้ สิทธิ์ android.permission.ACCESS_FINE_LOCATION ถือเป็นสิทธิ์ที่เป็นอันตราย แอปพลิเคชันต้องขอสิทธิ์ขณะรันไทม์เพื่อใช้ฟังก์ชันต่อไปนี้
(ระดับการป้องกัน: อันตราย)
ตรวจสอบความสามารถของระบบ
โครงสร้าง XrSystemGeospatialPropertiesANDROID มีคำจำกัดความดังนี้
typedef struct XrSystemGeospatialPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsGeospatial;
} XrSystemGeospatialPropertiesANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้supportsGeospatialคือXrBool32ที่ระบุว่าระบบปัจจุบันรองรับฟีเจอร์เชิงพื้นที่หรือไม่
แอปพลิเคชันสามารถตรวจสอบว่าระบบรองรับฟีเจอร์เชิงพื้นที่หรือไม่โดยการเชื่อมต่อโครงสร้าง XrSystemGeospatialPropertiesANDROID กับ XrSystemProperties เมื่อเรียกใช้ xrGetSystemProperties
หากรันไทม์แสดงผล XR_FALSE สำหรับ supportsGeospatial ระบบจะไม่รองรับฟีเจอร์เชิงพื้นที่ ดังนั้นจึงต้องแสดงผล XR_ERROR_FEATURE_UNSUPPORTED จาก xrCreateGeospatialTrackerANDROID แอปพลิเคชันควรหลีกเลี่ยงการใช้ฟังก์ชันการทำงานด้านข้อมูลเชิงพื้นที่เมื่อ supportsGeospatial เป็น XR_FALSE
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนใช้ XrSystemGeospatialPropertiesANDROID -
typeต้องเป็นXR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
สร้างแฮนเดิล Geospatial Tracker
XR_DEFINE_HANDLE(XrGeospatialTrackerANDROID)
ฟังก์ชัน xrCreateGeospatialTrackerANDROID มีคำจำกัดความดังนี้
XrResult xrCreateGeospatialTrackerANDROID(
XrSession session,
const XrGeospatialTrackerCreateInfoANDROID* createInfo,
XrGeospatialTrackerANDROID* geospatialTrackerOutput);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่ตัวติดตามตำแหน่งทางภูมิศาสตร์จะทำงานcreateInfoคือตัวชี้ไปยังโครงสร้าง XrGeospatialTrackerCreateInfoANDROID ที่ระบุพารามิเตอร์เริ่มต้นของเครื่องมือติดตามตำแหน่งทางภูมิศาสตร์geospatialTrackerOutputคือตัวชี้ไปยังแฮนเดิลที่ส่งคืน XrGeospatialTrackerANDROID ที่สร้างขึ้น
แอปพลิเคชันสามารถสร้างแฮนเดิล XrGeospatialTrackerANDROID ได้โดยการเรียกใช้ xrCreateGeospatialTrackerANDROID จากนั้นXrGeospatialTrackerANDROID แฮนเดิลที่ส่งคืนจะใช้ในการเรียก API ได้ หากแอปพลิเคชันไม่ได้รับสิทธิ์ที่จำเป็น รันไทม์ต้องแสดงผล XR_ERROR_PERMISSION_INSUFFICIENT XrGeospatialTrackerANDROID can มีได้ครั้งละ 1 รายการเท่านั้นสำหรับ XrSession ที่เฉพาะเจาะจง แอปพลิเคชันต้องตรวจสอบว่าออบเจ็กต์ XrGeospatialTrackerANDROID ก่อนหน้าถูกทำลายแล้วก่อนที่จะเรียกใช้ฟังก์ชันนี้อีกครั้ง ไม่เช่นนั้นรันไทม์ต้องส่งคืน XR_ERROR_LIMIT_REACHED หากสร้างเครื่องมือติดตามสำเร็จ เครื่องมือติดตามจะเข้าสู่สถานะ XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID ในตอนแรก และแอปพลิเคชันต้องรอจนกว่าสถานะจะเปลี่ยนเป็น XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID ก่อนจึงจะใช้เครื่องมือติดตามได้ ดู XrEventDataGeospatialTrackerStateChangedANDROID หากแอปพลิเคชันส่ง XrGeospatialTrackerANDROID ที่ไม่ได้อยู่ในสถานะ XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID ไปยังฟังก์ชันที่ต้องใช้รันไทม์ ต้องแสดงผล XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
ในที่สุดจะต้องปล่อยแฮนเดิล XrGeospatialTrackerANDROID ผ่านฟังก์ชัน xrDestroyGeospatialTrackerANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนที่จะเรียกใช้ xrCreateGeospatialTrackerANDROID -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
createInfoต้องเป็นตัวชี้ไปยังโครงสร้าง XrGeospatialTrackerCreateInfoANDROID ที่ถูกต้อง -
geospatialTrackerOutputต้องเป็นตัวชี้ไปยังแฮนเดิล XrGeospatialTrackerANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrGeospatialTrackerCreateInfoANDROID มีคำจำกัดความดังนี้
typedef struct XrGeospatialTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrGeospatialTrackerCreateInfoANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนจึงจะใช้ XrGeospatialTrackerCreateInfoANDROID ได้ -
typeต้องเป็นXR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROID -
nextต้องเป็นNULLหรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง ดูเพิ่มเติม: XrGeospatialTrackerAnchorTrackingInfoANDROID
ฟังก์ชัน xrDestroyGeospatialTrackerANDROID มีคำจำกัดความดังนี้
XrResult xrDestroyGeospatialTrackerANDROID(
XrGeospatialTrackerANDROID geospatialTracker);
คำอธิบายพารามิเตอร์
geospatialTrackerคือ XrGeospatialTrackerANDROID ที่จะทำลาย
แอปพลิเคชันสามารถใช้ฟังก์ชัน xrDestroyGeospatialTrackerANDROID เพื่อปล่อยเครื่องมือติดตามตำแหน่งทางภูมิศาสตร์และทรัพยากรพื้นฐานได้
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนที่จะเรียกใช้ xrDestroyGeospatialTrackerANDROID -
geospatialTrackerต้องเป็นแฮนเดิล XrGeospatialTrackerANDROID ที่ถูกต้อง
ความปลอดภัยของเธรด
- การเข้าถึง
geospatialTrackerและแฮนเดิลย่อยทั้งหมดต้องซิงค์ภายนอก
รหัสการคืนสินค้า
XR_SUCCESS
XR_ERROR_CALL_ORDER_INVALIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
สถานะเครื่องมือติดตามภูมิสารสนเทศ
การแจงนับ XrGeospatialTrackerStateANDROID มีคำจำกัดความดังนี้
typedef enum XrGeospatialTrackerStateANDROID {
XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID = 0,
XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID = 1,
XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID = 2,
XR_GEOSPATIAL_TRACKER_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrGeospatialTrackerStateANDROID;
การแจงนับ XrGeospatialTrackerStateANDROID จะระบุสถานะต่างๆ ของเครื่องมือติดตามตำแหน่งทางภูมิศาสตร์
ตัวแจงนับมีค่าดังนี้
คำอธิบาย Enum
XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID
Geospatial Tracker ไม่ทำงาน
XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID
เครื่องมือติดตามทางภูมิศาสตร์ทำงานอยู่และใช้งานได้
XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID
เริ่มต้น Geospatial Tracker ไม่สำเร็จและจะใช้ไม่ได้
โครงสร้าง XrEventDataGeospatialTrackerStateChangedANDROID มีคำจำกัดความดังนี้
typedef struct XrEventDataGeospatialTrackerStateChangedANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrGeospatialTrackerStateANDROID state;
XrResult initializationResult;
XrTime time;
} XrEventDataGeospatialTrackerStateChangedANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างgeospatialTrackerคือ XrGeospatialTrackerANDROID ที่มีการเปลี่ยนแปลงสถานะstateคือ XrGeospatialTrackerStateANDROID ใหม่initializationResultคือผลลัพธ์ข้อผิดพลาดหากstateเป็นXR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROIDหรือXR_SUCCESSในกรณีอื่นๆtimeคือXrTimeที่เกิดการเปลี่ยนแปลงสถานะ
ระบบจะส่งโครงสร้าง XrEventDataGeospatialTrackerStateChangedANDROID เมื่อสถานะของเครื่องมือติดตามตำแหน่งเชิงพื้นที่เปลี่ยนแปลง หากแอปพลิเคชันมี XrGeospatialTrackerANDROID ที่ถูกต้อง ควรสำรวจเหตุการณ์นี้ เหตุการณ์แรกที่ได้รับสําหรับเครื่องมือติดตามจะมี state XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID หลังจากผ่านไปเป็นระยะเวลาตามที่กำหนดในรันไทม์ สถานะต้องเปลี่ยนเป็น XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID หรือ XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID การเปลี่ยนผ่านนี้จะใช้เวลาตามที่กำหนด หาก state เปลี่ยนเป็น XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID ต้องเป็นเหตุการณ์สุดท้ายที่ได้รับสำหรับเครื่องมือติดตามนี้ และฟิลด์ initializationResult จะมีรหัสข้อผิดพลาด ข้อผิดพลาดอาจใช้เวลาหลายวินาทีจึงจะเกิดขึ้น แอปพลิเคชันควรทำลายเครื่องมือติดตามในกรณีนี้ หาก state เปลี่ยนเป็น XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID สมอแบบอิงตามพื้นที่ทางภูมิศาสตร์ทั้งหมดที่สร้างไว้ก่อนหน้านี้ต้องหยุดการติดตามอย่างถาวรและแอปพลิเคชันควรทำลายสมอเหล่านั้น สถานะอาจเปลี่ยนไปมาระหว่าง XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID กับ XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID หลายครั้งโดยไม่มีลำดับที่แน่นอน
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_geospatialส่วนขยายก่อนจึงจะใช้ XrEventDataGeospatialTrackerStateChangedANDROID ได้ -
typeต้องเป็นXR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
ท่าทางภูมิสารสนเทศ
โครงสร้าง XrGeospatialPoseANDROID มีคำจำกัดความดังนี้
typedef struct XrGeospatialPoseANDROID {
XrQuaternionf eastUpSouthOrientation;
double latitude;
double longitude;
double altitude;
} XrGeospatialPoseANDROID;
คำอธิบายสมาชิก
eastUpSouthOrientationคือ XrQuaternionf ที่กำหนดการวางแนวเทียบกับระบบพิกัดที่ +X=ตะวันออก, +Y=ขึ้น และ +Z=ใต้latitudeคือละติจูดในหน่วยองศา ซึ่งอยู่ระหว่าง -90 ถึง +90longitudeคือลองจิจูดในหน่วยองศา ซึ่งอยู่ระหว่าง -180 ถึง +180altitudeคือระดับความสูงเป็นเมตรเหนือรูปทรงรี WGS84
โครงสร้าง XrGeospatialPoseANDROID แสดงถึงตำแหน่งและการวางแนวที่สัมพันธ์กับโลกโดยใช้รูปทรงรี WGS84
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_geospatialส่วนขยายก่อนจึงจะใช้ XrGeospatialPoseANDROID ได้ -
latitudeต้องเป็นค่าdoubleที่ถูกต้อง -
longitudeต้องเป็นค่าdoubleที่ถูกต้อง -
altitudeต้องเป็นค่าdoubleที่ถูกต้อง
การแจงนับ XrGeospatialPoseFlagBitsANDROID มีการกำหนดไว้ดังนี้
// Flag bits for XrGeospatialPoseFlagsANDROID
static const XrGeospatialPoseFlagsANDROID XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID = 0x00000001;
static const XrGeospatialPoseFlagsANDROID XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID = 0x00000002;
การแจงนับ XrGeospatialPoseFlagBitsANDROID จะระบุแฟล็กสำหรับท่าทางเชิงพื้นที่
บิตของแฟล็กมีความหมายดังนี้
คำอธิบายของแฟล็ก
XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID— ระบุว่าสมาชิกการวางแนวมีข้อมูลที่ถูกต้องXR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID— ระบุว่าสมาชิกตำแหน่งมีข้อมูลที่ถูกต้อง
ประเภท XrGeospatialPoseFlagsANDROID คือบิตมาสก์ของ XrGeospatialPoseFlagBitsANDROID
typedef XrFlags64 XrGeospatialPoseFlagsANDROID;
การแปลง XrPosef เป็นท่าทางภูมิสารสนเทศ
ฟังก์ชัน xrLocateGeospatialPoseFromPoseANDROID มีคำจำกัดความดังนี้
XrResult xrLocateGeospatialPoseFromPoseANDROID(
XrGeospatialTrackerANDROID geospatialTracker,
const XrGeospatialPoseFromPoseLocateInfoANDROID* locateInfo,
XrGeospatialPoseResultANDROID* geospatialPoseResult);
คำอธิบายพารามิเตอร์
geospatialTrackerคือ XrGeospatialTrackerANDROID ที่ใช้สำหรับการแปลงlocateInfoเป็น Pointer ไปยัง XrGeospatialPoseFromPoseLocateInfoANDROID ที่มีพารามิเตอร์การค้นหาgeospatialPoseResultคือตัวชี้ไปยัง XrGeospatialPoseResultANDROID ที่รับผลลัพธ์
ฟังก์ชัน xrLocateGeospatialPoseFromPoseANDROID จะแปลงท่าทางใน XrGeospatialPoseFromPoseLocateInfoANDROID :: space เป็นท่าทางเชิงพื้นที่ หากสถานะของ geospatialTracker ไม่ใช่ XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID รันไทม์ต้องแสดงผล XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID หากฟังก์ชันแสดงผล XR_SUCCESS ฟิลด์ XrGeospatialPoseResultANDROID :: poseFlags ของ geospatialPoseResult จะกำหนดว่าฟิลด์เอาต์พุตใดที่ถูกต้อง หากไม่ได้ตั้งค่า XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID ใน XrGeospatialPoseResultANDROID :: poseFlags แอปพลิเคชันต้องไม่อ่านฟิลด์ XrGeospatialPoseANDROID :: latitude, XrGeospatialPoseANDROID :: longitude, XrGeospatialPoseANDROID :: altitude, XrGeospatialPoseResultANDROID :: horizontalAccuracy หรือ XrGeospatialPoseResultANDROID :: verticalAccuracy ใน XrGeospatialPoseResultANDROID หากไม่ได้ตั้งค่า XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID ใน XrGeospatialPoseResultANDROID :: poseFlags แอปพลิเคชันต้องไม่อ่าน XrGeospatialPoseANDROID :: eastUpSouthOrientation หรือ XrGeospatialPoseResultANDROID :: orientationYawAccuracy หากไม่ได้ตั้งค่า XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID ก็ต้องไม่ได้ตั้งค่า XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID ด้วย
หากความแม่นยำต่ำกว่าที่คาดไว้ อาจเป็นสัญญาณบ่งบอกว่าอุปกรณ์ไม่ได้ใช้การแปลเป็นภาษาท้องถิ่นของ VPS แอปพลิเคชันสามารถสั่งให้ผู้ใช้เล็งอุปกรณ์ไปที่ป้ายและอาคารเพื่อปรับปรุงการแปล
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนที่จะเรียกใช้ xrLocateGeospatialPoseFromPoseANDROID -
geospatialTrackerต้องเป็นแฮนเดิล XrGeospatialTrackerANDROID ที่ถูกต้อง -
locateInfoต้องเป็น Pointer ไปยังโครงสร้าง XrGeospatialPoseFromPoseLocateInfoANDROID ที่ถูกต้อง -
geospatialPoseResultต้องเป็นตัวชี้ไปยังโครงสร้าง XrGeospatialPoseResultANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrGeospatialPoseFromPoseLocateInfoANDROID มีคำจำกัดความดังนี้
typedef struct XrGeospatialPoseFromPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrPosef pose;
} XrGeospatialPoseFromPoseLocateInfoANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างspaceคือ XrSpace ที่กำหนดposetimeคือXrTimeที่ใช้ประเมินposeposeคือ XrPosef ในspaceที่จะแปลงเป็นท่าทางเชิงพื้นที่
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนใช้ XrGeospatialPoseFromPoseLocateInfoANDROID -
typeต้องเป็นXR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
spaceต้องเป็นแฮนเดิล XrSpace ที่ถูกต้อง
โครงสร้าง XrGeospatialPoseResultANDROID มีคำจำกัดความดังนี้
typedef struct XrGeospatialPoseResultANDROID {
XrStructureType type;
void* next;
XrGeospatialPoseFlagsANDROID poseFlags;
XrGeospatialPoseANDROID geospatialPose;
double horizontalAccuracy;
double verticalAccuracy;
double orientationYawAccuracy;
} XrGeospatialPoseResultANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างposeFlagsคือบิตมาสก์ของ XrGeospatialPoseFlagsANDROID ที่ระบุความถูกต้องของคอมโพเนนต์ท่าทางgeospatialPoseคือ XrGeospatialPoseANDROID ที่ได้horizontalAccuracyคือความแม่นยำในแนวนอนโดยประมาณของตำแหน่งท่าทางเชิงพื้นที่ ซึ่งกำหนดเป็นรัศมีในหน่วยเมตรของวงกลมที่มีระดับความเชื่อมั่น 68% รอบละติจูดและลองจิจูดที่ระบุverticalAccuracyคือความแม่นยำในแนวตั้งโดยประมาณของตำแหน่งท่าทางเชิงพื้นที่ ซึ่งกำหนดเป็นระยะทางในหน่วยเมตรที่ระดับความเชื่อมั่น 68% รอบระดับความสูงที่กำหนด กล่าวคือ มีโอกาส 68% ที่ระดับความสูงจริงจะอยู่ในช่วง [ XrGeospatialPoseANDROID ::altitude-verticalAccuracy, XrGeospatialPoseANDROID ::altitude\+verticalAccuracy]orientationYawAccuracyคือความแม่นยำของท่าทางเชิงพื้นที่ที่ประมาณค่าไว้ ซึ่งกำหนดเป็นรัศมีในหน่วยองศาของระดับความเชื่อมั่น 68% รอบๆ ท่าทางที่กำหนด
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้
XR_ANDROID_geospatialส่วนขยายก่อนจึงจะใช้ XrGeospatialPoseResultANDROID ได้ -
typeต้องเป็นXR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง
การแปลงท่าทางของภูมิสารสนเทศเป็น XrPosef
ฟังก์ชัน xrLocateGeospatialPoseANDROID มีคำจำกัดความดังนี้
XrResult xrLocateGeospatialPoseANDROID(
XrGeospatialTrackerANDROID geospatialTracker,
const XrGeospatialPoseLocateInfoANDROID* locateInfo,
XrSpaceLocation* location);
คำอธิบายพารามิเตอร์
geospatialTrackerคือ XrGeospatialTrackerANDROID ที่ใช้สำหรับการแปลงlocateInfoเป็น Pointer ไปยัง XrGeospatialPoseLocateInfoANDROID ที่มีพารามิเตอร์การค้นหาlocationคือ Pointer ไปยัง XrSpaceLocation ที่ได้รับท่าทางที่ได้
ฟังก์ชัน xrLocateGeospatialPoseANDROID จะแปลงท่าทางเชิงพื้นที่เป็น XrSpaceLocation หาก XrGeospatialTrackerANDROID ไม่ได้ทำงาน รันไทม์ต้องแสดงผล XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID หากฟังก์ชันแสดงผล XR_SUCCESS ฟิลด์ XrSpaceLocation :: locationFlags ของ location จะกำหนดว่าฟิลด์เอาต์พุตใดที่ถูกต้อง
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนที่จะเรียกใช้ xrLocateGeospatialPoseANDROID -
geospatialTrackerต้องเป็นแฮนเดิล XrGeospatialTrackerANDROID ที่ถูกต้อง -
locateInfoต้องเป็นตัวชี้ไปยังโครงสร้าง XrGeospatialPoseLocateInfoANDROID ที่ถูกต้อง -
locationต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpaceLocation
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrGeospatialPoseLocateInfoANDROID มีคำจำกัดความดังนี้
typedef struct XrGeospatialPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrGeospatialPoseANDROID geospatialPose;
} XrGeospatialPoseLocateInfoANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างspaceคือ XrSpace ที่จะใช้แสดงท่าทางที่ได้timeคือXrTimeที่ใช้ระบุตำแหน่งท่าทางgeospatialPoseคือ XrGeospatialPoseANDROID ที่จะแปลง
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้
XR_ANDROID_geospatialส่วนขยายก่อนใช้ XrGeospatialPoseLocateInfoANDROID -
typeต้องเป็นXR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
spaceต้องเป็นแฮนเดิล XrSpace ที่ถูกต้อง -
geospatialPoseต้องเป็นโครงสร้าง XrGeospatialPoseANDROID ที่ถูกต้อง
ความพร้อมใช้งานของ VPS
การแจงนับ XrVPSAvailabilityANDROID มีคำจำกัดความดังนี้
typedef enum XrVPSAvailabilityANDROID {
XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID = 1,
XR_VPS_AVAILABILITY_AVAILABLE_ANDROID = 2,
XR_VPSAVAILABILITY_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrVPSAvailabilityANDROID;
การแจงนับ XrVPSAvailabilityANDROID จะระบุความพร้อมใช้งานของ VPS
ตัวแจงนับมีค่าดังนี้
คำอธิบาย Enum
XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID
VPS ไม่พร้อมให้บริการใกล้ตำแหน่งที่ระบุ
XR_VPS_AVAILABILITY_AVAILABLE_ANDROID
VPS พร้อมให้บริการในบริเวณใกล้เคียงกับสถานที่ที่ระบุ
ฟังก์ชัน xrCheckVpsAvailabilityAsyncANDROID มีคำจำกัดความดังนี้
XrResult xrCheckVpsAvailabilityAsyncANDROID(
XrSession session,
double latitude,
double longitude,
XrFutureEXT* future);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่จะใช้ในการตรวจสอบlatitudeคือละติจูดในหน่วยองศาlongitudeคือลองจิจูดในหน่วยองศาfutureเป็นตัวชี้ไปยังXrFutureEXTซึ่งจะเก็บผลลัพธ์ของการดำเนินการแบบอะซิงโครนัส
ความพร้อมใช้งานของบริการกำหนดตำแหน่งด้วยภาพ (VPS) จะระบุว่าใช้ VPS เพื่อปรับปรุงความแม่นยำทางภูมิศาสตร์เชิงพื้นที่ในสถานที่ที่กำหนดได้หรือไม่
ฟังก์ชัน xrCheckVpsAvailabilityAsyncANDROID จะเริ่มการตรวจสอบแบบไม่พร้อมกันเพื่อดูความพร้อมให้บริการของ VPS ในตำแหน่งที่ระบุ แอปพลิเคชันไม่จำเป็นต้องมี XrGeospatialTrackerANDROID เพื่อเรียกใช้ฟังก์ชันนี้ และสามารถใช้ผลลัพธ์ของการดำเนินการนี้เพื่อตัดสินใจว่าจะสร้างหรือไม่ หากแอปพลิเคชันไม่ได้รับสิทธิ์ที่จำเป็น รันไทม์ต้องแสดงผล XR_ERROR_PERMISSION_INSUFFICIENT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนที่จะเรียกใช้ xrCheckVpsAvailabilityAsyncANDROID -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
latitudeต้องเป็นค่าdoubleที่ถูกต้อง -
longitudeต้องเป็นค่าdoubleที่ถูกต้อง -
futureต้องเป็นตัวชี้ไปยังค่าXrFutureEXT
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
ฟังก์ชัน xrCheckVpsAvailabilityCompleteANDROID มีคำจำกัดความดังนี้
XrResult xrCheckVpsAvailabilityCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrVPSAvailabilityCheckCompletionANDROID* completion);
คำอธิบายพารามิเตอร์
sessionคือ XrSession ที่ใช้สำหรับการตรวจสอบfutureคือXrFutureEXTที่ส่งคืนโดย xrCheckVpsAvailabilityAsyncANDROIDcompletionเป็น Pointer ไปยัง XrVPSAvailabilityCheckCompletionANDROID ที่รับผลลัพธ์
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้งานส่วนขยาย
XR_ANDROID_geospatialก่อนที่จะเรียกใช้ xrCheckVpsAvailabilityCompleteANDROID -
sessionต้องเป็นแฮนเดิล XrSession ที่ถูกต้อง -
completionต้องเป็นตัวชี้ไปยังโครงสร้าง XrVPSAvailabilityCheckCompletionANDROID
รหัสการคืนสินค้า
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
โครงสร้าง XrVPSAvailabilityCheckCompletionANDROID มีคำจำกัดความดังนี้
typedef struct XrVPSAvailabilityCheckCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrVPSAvailabilityANDROID availability;
} XrVPSAvailabilityCheckCompletionANDROID;
คำอธิบายสมาชิก
typeคือ XrStructureType ของโครงสร้างนี้nextคือNULLหรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้างfutureResultคือ XrResult ของการดำเนินการตรวจสอบ หากfutureResultเป็นXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROIDโครงสร้างในเชนnextอาจให้ข้อมูลเพิ่มเติมเกี่ยวกับความล้มเหลวavailabilityคือ XrVPSAvailabilityANDROID ที่ได้ แอปพลิเคชันต้องไม่อ่านฟิลด์นี้ เว้นแต่futureResultจะเป็นXR_SUCCESS
รหัสการแสดงผลในอนาคต
ค่า futureResult
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID
การใช้งานที่ถูกต้อง (โดยนัย)
- คุณต้องเปิดใช้ส่วนขยาย
XR_ANDROID_geospatialก่อนจึงจะใช้ XrVPSAvailabilityCheckCompletionANDROID ได้ -
typeต้องเป็นXR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID -
nextต้องเป็นNULLหรือ Pointer ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
futureResultต้องเป็นค่า XrResult ที่ถูกต้อง -
availabilityต้องเป็นค่า XrVPSAvailabilityANDROID ที่ถูกต้อง
ตัวอย่าง
ตั้งค่า Geospatial Tracker
PFN_xrCheckVpsAvailabilityAsyncANDROID xrCheckVpsAvailabilityAsyncANDROID;
PFN_xrPollFutureEXT xrPollFutureEXT;
PFN_xrCheckVpsAvailabilityCompleteANDROID xrCheckVpsAvailabilityCompleteANDROID;
PFN_xrCreateGeospatialTrackerANDROID xrCreateGeospatialTrackerANDROID;
XrInstance instance = XR_NULL_HANDLE;
XrSystemId systemId = XR_NULL_SYSTEM_ID;
XrSession session = XR_NULL_HANDLE;
double lat = 37.422, lng = -122.084;
// Check for support.
XrSystemGeospatialPropertiesANDROID geospatialSystemProperties{
XR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{XR_TYPE_SYSTEM_PROPERTIES,
&geospatialSystemProperties};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!geospatialSystemProperties.supportsGeospatial) {
return;
}
// Check VPS Availability.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
CHK_XR(xrCheckVpsAvailabilityAsyncANDROID(session, lat, lng, &future));
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
pollResult.state = XR_FUTURE_STATE_PENDING_EXT;
while (pollResult.state == XR_FUTURE_STATE_PENDING_EXT) {
// Do in render loop/state loop.
CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
}
XrVPSAvailabilityCheckCompletionANDROID vpsCompletion{
XR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID};
CHK_XR(xrCheckVpsAvailabilityCompleteANDROID(session, future, &vpsCompletion));
if (vpsCompletion.futureResult == XR_SUCCESS) {
if (vpsCompletion.availability == XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID) {
// Visual Positioning Service is not available. Accuracy of positions and
// orientations from Geospatial APIs are expected to be lower at this location.
} else {
// Visual Positioning Service is available. Higher accuracy of position and
// orientation is achievable at this location.
}
}
// Create Geospatial Tracker.
XrGeospatialTrackerCreateInfoANDROID createInfo{
XR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROID};
XrGeospatialTrackerANDROID geospatialTracker = XR_NULL_HANDLE;
CHK_XR(xrCreateGeospatialTrackerANDROID(session, &createInfo, &geospatialTracker));
// In application main event loop:
while (true) {
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
if (xrPollEvent(instance, &event) != XR_SUCCESS) {
continue;
}
switch (event.type) {
case XR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROID:
const XrEventDataGeospatialTrackerStateChangedANDROID& eventData =
*reinterpret_cast<XrEventDataGeospatialTrackerStateChangedANDROID*>(&event);
switch (eventData.state) {
case XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID:
// Destroy existing anchors, if any.
break;
case XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID:
// Start adding content.
break;
case XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID:
// Handle eventData.initializationResult error result.
break;
}
}
}
เรียกใช้ Geospatial Pose API
PFN_xrLocateGeospatialPoseFromPoseANDROID xrLocateGeospatialPoseFromPoseANDROID;
PFN_xrLocateGeospatialPoseANDROID xrLocateGeospatialPoseANDROID;
XrGeospatialTrackerANDROID geospatialTracker;
// Get pose from view space.
XrSpace viewSpace;
XrPosef identityPose = {{0,0,0,1},{0,0,0}};
XrGeospatialPoseFromPoseLocateInfoANDROID poseGetInfo{
XR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROID};
XrGeospatialPoseResultANDROID poseResult{
XR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROID};
poseGetInfo.space = viewSpace;
poseGetInfo.pose = identityPose;
poseGetInfo.time = 0; // Next frame timestamp.
CHK_XR(xrLocateGeospatialPoseFromPoseANDROID(geospatialTracker, &poseGetInfo, &poseResult));
if ((poseResult.poseFlags & XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID) &&
(poseResult.poseFlags & XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID)) {
// poseResult.geospatialPose is valid.
}
// Convert Geospatial pose to an XrSpaceLocation.
XrGeospatialPoseLocateInfoANDROID poseLocateInfo{
XR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROID};
XrSpaceLocation location{XR_TYPE_SPACE_LOCATION};
poseLocateInfo.space = viewSpace;
poseLocateInfo.geospatialPose = poseResult.geospatialPose;
poseLocateInfo.time = 0; // Next frame timestamp.
CHK_XR(xrLocateGeospatialPoseANDROID(geospatialTracker, &poseLocateInfo, &location));
if ((location.locationFlags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) &&
(location.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT)) {
// location.pose is valid.
}
ประเภทออบเจ็กต์ใหม่
คำสั่งใหม่
- xrCheckVpsAvailabilityAsyncANDROID
- xrCheckVpsAvailabilityCompleteANDROID
- xrCreateGeospatialTrackerANDROID
- xrDestroyGeospatialTrackerANDROID
- xrLocateGeospatialPoseANDROID
- xrLocateGeospatialPoseFromPoseANDROID
โครงสร้างใหม่
- XrEventDataGeospatialTrackerStateChangedANDROID
- XrGeospatialPoseANDROID
- XrGeospatialPoseFromPoseLocateInfoANDROID
- XrGeospatialPoseLocateInfoANDROID
- XrGeospatialPoseResultANDROID
- XrGeospatialTrackerCreateInfoANDROID
- XrVPSAvailabilityCheckCompletionANDROID
การขยาย XrSystemProperties :
Enum ใหม่
บิตแมสก์ใหม่
ค่าคงที่ Enum ใหม่
XR_ANDROID_GEOSPATIAL_EXTENSION_NAMEXR_ANDROID_geospatial_SPEC_VERSIONการขยาย XrObjectType :
XR_OBJECT_TYPE_GEOSPATIAL_TRACKER_ANDROID
การขยาย XrResult :
XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROIDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
การขยาย XrStructureType :
XR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROIDXR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROIDXR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROIDXR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROIDXR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROIDXR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID
ปัญหา
ประวัติเวอร์ชัน
การแก้ไขครั้งที่ 1, 2025-12-18 (Ben King)
- คำอธิบายส่วนขยายเริ่มต้น