XR_ANDROID_eye_tracking OpenXR 확장 프로그램

이름 문자열

XR_ANDROID_eye_tracking

확장 프로그램 유형

인스턴스 확장

등록된 내선 번호

457

버전

1

확장 프로그램 및 버전 종속 항목

OpenXR 1.0

최종 수정일

2025-01-17

IP 상태

알려진 IP 소유권 주장이 없습니다.

도움을 주신 분들

스펜서 퀸, Google

Jared Finder, Google

레바나 첸, Google

케니 베르카에머, Google

Prasanthi Gurumurthy, Google

Nihav Jain, Google

개요

이 확장 프로그램을 사용하면 애플리케이션이 사용자의 눈의 위치와 방향은 물론 눈 추적 상태도 획득할 수 있습니다.

시선 추적 데이터는 대략적인 모드와 세부적인 모드라는 두 가지 모드로 제공됩니다. 대략적인 추적은 사용자의 눈에 대한 대략적인 추정치를 제공하고, 세부 추적은 더 정확한 추정치를 제공합니다. 대략적인 추적은 기본적인 아바타와 같은 표현을 제공하려는 애플리케이션을 위한 것이고, 세부 추적은 더 정확한 애플리케이션을 위한 것입니다.

상호작용의 경우 XR_EXT_eye_gaze_interaction사용해야 합니다.

시스템 기능 검사

XrSystemEyeTrackingPropertiesANDROID 구조는 다음과 같이 정의됩니다.

typedef struct XrSystemEyeTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsEyeTracking;
} XrSystemEyeTrackingPropertiesANDROID;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • supportsEyeTracking는 현재 시스템이 시선 추적을 지원하는지 나타내는 XrBool32입니다.

애플리케이션은 xrGetSystemProperties 호출 시 XrSystemEyeTrackingPropertiesANDROID 구조를 XrSystemProperties에 연결하여 시스템이 시선 추적을 지원하는지 검사할 수 있습니다. supportsEyeTrackingXR_FALSE를 반환하면 애플리케이션은 xrCreateEyeTrackerANDROID에서 XR_ERROR_FEATURE_UNSUPPORTED를 수신합니다.

유효한 사용 (암시적)

시선 추적기 핸들 만들기

XR_DEFINE_HANDLE(XrEyeTrackerANDROID)

XrEyeTrackerANDROID 핸들은 눈을 추적하고 사용자가 보고 있는 대상을 정확하게 매핑하는 시선 추적기를 나타냅니다.

시선 추적 데이터는 민감한 개인 정보일 수 있으며 개인 정보 보호 및 무결성과 밀접하게 연결되어 있습니다. 시선 추적 데이터를 저장하거나 전송하는 애플리케이션은 항상 사용자에게 이를 수행할 수 있는 명시적이고 구체적인 수락을 요청하는 것이 좋습니다.

이 핸들은 이 확장 프로그램의 다른 함수를 사용하여 시선 추적 데이터에 액세스하는 데 사용할 수 있습니다.

시선 추적은 장면에서 눈의 자세와 상태를 나타냅니다.

xrCreateEyeTrackerANDROID 함수는 다음과 같이 정의됩니다.

XrResult xrCreateEyeTrackerANDROID(
    XrSession                                   session,
    const XrEyeTrackerCreateInfoANDROID*        createInfo,
    XrEyeTrackerANDROID*                        eyeTracker);

매개변수 설명

애플리케이션은 xrCreateEyeTrackerANDROID 함수를 사용하여 XrEyeTrackerANDROID 핸들을 만들 수 있습니다.

시스템에서 시선 추적을 지원하지 않으면 xrCreateEyeTrackerANDROID에서 XR_ERROR_FEATURE_UNSUPPORTED가 반환됩니다.

유효한 사용 (암시적)

반환 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_FEATURE_UNSUPPORTED

XrEyeTrackerCreateInfoANDROID 구조는 다음과 같이 정의됩니다.

typedef struct XrEyeTrackerCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrEyeTrackerCreateInfoANDROID;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.

XrEyeTrackerCreateInfoANDROID 구조는 XrEyeTrackerANDROID 핸들을 생성하기 위한 정보를 설명합니다.

유효한 사용 (암시적)

  • XrEyeTrackerCreateInfoANDROID를 사용하기 전에 XR_ANDROID_eye_tracking 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.

xrDestroyEyeTrackerANDROID 함수는 다음과 같이 정의됩니다.

XrResult xrDestroyEyeTrackerANDROID(
    XrEyeTrackerANDROID                         eyeTracker);

매개변수 설명

xrDestroyEyeTrackerANDROID 함수는 시선 추적 환경이 완료되면 eyeTracker 및 기본 리소스를 해제합니다.

유효한 사용 (암시적)

스레드 안전

  • eyeTracker 및 모든 하위 핸들에 대한 액세스는 외부적으로 동기화되어야 합니다.

반환 코드

성공

  • XR_SUCCESS

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

눈 정보 가져오기

xrGetCoarseTrackingEyesInfoANDROID 함수는 다음과 같이 정의됩니다.

XrResult xrGetCoarseTrackingEyesInfoANDROID(
    XrEyeTrackerANDROID                         eyeTracker,
    const XrEyesGetInfoANDROID*                 getInfo,
    XrEyesANDROID*                              eyesOutput);

매개변수 설명

xrGetCoarseTrackingEyesInfoANDROID 함수는 사용자 개인 정보를 보호하는 방식으로 눈 상태와 포즈에 관한 정보를 가져옵니다.

애플리케이션에 android.permission.EYE_TRACKING_COARSE 권한이 없으면 런타임은 XR_ERROR_PERMISSION_INSUFFICIENT를 반환해야 합니다.

눈 정보는 XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace를 사용하여 xrGetCoarseTrackingEyesInfoANDROID 호출 시점의 기본 공간을 기준으로 확인됩니다.

언제든지 시선 포즈의 위치와 방향이 추적되거나 추적되지 않습니다. 즉, 애플리케이션은 제공된 XrEyesANDROID::eyes에서 XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT가 모두 설정되거나 삭제되고 XrEyesANDROID::mode가 추적 상태를 나타낼 것으로 예상할 수 있습니다.

유효한 사용 (암시적)

반환 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_PERMISSION_INSUFFICIENT

xrGetFineTrackingEyesInfoANDROID 함수는 다음과 같이 정의됩니다.

XrResult xrGetFineTrackingEyesInfoANDROID(
    XrEyeTrackerANDROID                         eyeTracker,
    const XrEyesGetInfoANDROID*                 getInfo,
    XrEyesANDROID*                              eyesOutput);

매개변수 설명

애플리케이션에 android.permission.EYE_TRACKING_FINE 권한이 없으면 런타임은 XR_ERROR_PERMISSION_INSUFFICIENT를 반환해야 합니다.

눈 정보는 XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace를 사용하여 xrGetFineTrackingEyesInfoANDROID 호출 시점의 기본 공간을 기준으로 확인됩니다.

언제든지 시선 포즈의 위치와 방향이 추적되거나 추적되지 않습니다. 즉, 애플리케이션은 제공된 XrEyesANDROID::eyes에서 XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT가 모두 설정되거나 삭제되고 XrEyesANDROID::mode가 추적 상태를 나타낼 것으로 예상할 수 있습니다.

유효한 사용 (암시적)

반환 코드

성공

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

실패

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_PERMISSION_INSUFFICIENT

XrEyesGetInfoANDROID 구조에는 시선 포즈와 상태를 가져오는 데 필요한 정보가 포함되어 있습니다.

typedef struct XrEyesGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrTime             time;
    XrSpace            baseSpace;
} XrEyesGetInfoANDROID;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • timebaseSpace을 기준으로 좌표를 평가할 XrTime입니다.
  • baseSpace 눈 자세는 time에서 이 XrSpace를 기준으로 합니다.

유효한 사용 (암시적)

  • XrEyesGetInfoANDROID를 사용하기 전에 XR_ANDROID_eye_tracking 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_EYES_GET_INFO_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
  • baseSpace은 유효한 XrSpace 핸들이어야 합니다.

XrEyesANDROID 구조에는 추적된 눈에 관한 정보가 포함됩니다.

typedef struct XrEyesANDROID {
    XrStructureType             type;
    void*                       next;
    XrEyeANDROID                eyes[XR_EYE_MAX_ANDROID];
    XrEyeTrackingModeANDROID    mode;
} XrEyesANDROID;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
  • eyes은(는) XrEyeIndexANDROID로 색인이 지정된 왼쪽 및 오른쪽 눈의 XrEyeANDROID 배열입니다.
  • mode은 눈이 추적 중인지, 추적 중이라면 어느 눈인지 나타내는 XrEyeTrackingModeANDROID입니다.

유효한 사용 (암시적)

  • XrEyesANDROID를 사용하기 전에 XR_ANDROID_eye_tracking 확장 프로그램을 사용 설정해야 합니다.
  • typeXR_TYPE_EYES_ANDROID이어야 합니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
  • eyes의 모든 요소는 유효한 XrEyeANDROID 구조여야 합니다.
  • mode은(는) 유효한 XrEyeTrackingModeANDROID 값이어야 합니다.

XrEyeANDROID 구조는 눈의 상태, 위치, 방향을 설명합니다.

typedef struct XrEyeANDROID {
    XrEyeStateANDROID    eyeState;
    XrPosef              eyePose;
} XrEyeANDROID;

회원 설명

  • eyeState은 눈의 XrEyeStateANDROID입니다.
  • pose는 해당 XrEyesGetInfoANDROID::baseSpace의 참조 프레임 내에서 눈의 원점 위치와 방향을 정의하는 XrPosef입니다. 여기서 ID 방향은 +Z가 사용자의 눈을 향하고 +X가 오른쪽을 향하며 +Y가 위쪽을 향하는 좌표 축을 나타냅니다.

유효한 사용 (암시적)

  • XrEyeANDROID를 사용하기 전에 XR_ANDROID_eye_tracking 확장 프로그램을 사용 설정해야 합니다.
  • eyeState은(는) 유효한 XrEyeStateANDROID 값이어야 합니다.

XrEyeStateANDROID 열거형은 추적된 눈의 다양한 상태를 식별합니다.

typedef enum XrEyeStateANDROID {
    XR_EYE_STATE_INVALID_ANDROID = 0,
    XR_EYE_STATE_GAZING_ANDROID = 1,
    XR_EYE_STATE_SHUT_ANDROID = 2
} XrEyeStateANDROID;

열거형의 의미는 다음과 같습니다.

Enum

설명

XR_EYE_STATE_INVALID_ANDROID

눈이 오류 상태이거나 존재하지 않음을 나타냅니다.

XR_EYE_STATE_GAZING_ANDROID

눈이 응시하고 있음을 나타냅니다.

XR_EYE_STATE_SHUT_ANDROID

눈을 깜박이거나 윙크하여 눈이 감겨 있음을 나타냅니다.

XrEyeIndexANDROID 열거형은 왼쪽 또는 오른쪽 눈의 색인을 식별합니다.

typedef enum XrEyeIndexANDROID {
    XR_EYE_INDEX_LEFT_ANDROID = 0,
    XR_EYE_INDEX_RIGHT_ANDROID = 1
} XrEyeIndexANDROID;

열거형의 의미는 다음과 같습니다.

Enum

설명

XR_EYE_INDEX_LEFT_ANDROID

왼쪽 눈

XR_EYE_INDEX_RIGHT_ANDROID

오른쪽 눈입니다.

XrEyeTrackingModeANDROID 열거형은 추적된 눈의 다양한 모드를 식별합니다.

typedef enum XrEyeTrackingModeANDROID {
    XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID = 0,
    XR_EYE_TRACKING_MODE_RIGHT_ANDROID = 1,
    XR_EYE_TRACKING_MODE_LEFT_ANDROID = 2,
    XR_EYE_TRACKING_MODE_BOTH_ANDROID = 3
} XrEyeTrackingModeANDROID;

열거형의 의미는 다음과 같습니다.

Enum

설명

XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID

시선 추적이 활성화되어 있지 않음을 나타냅니다.

XR_EYE_TRACKING_MODE_RIGHT_ANDROID

오른쪽 눈만 추적 중임을 나타냅니다.

XR_EYE_TRACKING_MODE_LEFT_ANDROID

왼쪽 눈만 추적 중임을 나타냅니다.

XR_EYE_TRACKING_MODE_BOTH_ANDROID

왼쪽 눈과 오른쪽 눈이 모두 추적되고 있음을 나타냅니다.

눈 추적 예시 코드

다음 예시 코드는 뷰 공간과 관련된 눈 정보를 가져오는 방법을 보여줍니다.

XrSession session; // previously initialized, e.g. created at app startup.
XrSpace viewSpace; // space created for XR_REFERENCE_SPACE_TYPE_VIEW.

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateEyeTrackerANDROID xrCreateEyeTrackerANDROID; // previously initialized
PFN_xrDestroyEyeTrackerANDROID xrDestroyEyeTrackerANDROID; // previously initialized
PFN_xrGetCoarseTrackingEyesInfoANDROID xrGetCoarseTrackingEyesInfoANDROID; // previously initialized
PFN_xrGetFineTrackingEyesInfoANDROID xrGetFineTrackingEyesInfoANDROID; // previously initialized

// This will use the XrSession that is bound to the eye tracker done at time of creation.
XrEyeTrackerANDROID eyeTracker;
XrEyeTrackerCreateInfoANDROID createInfo{
    .type = XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID,
    .next = nullptr};
CHK_XR(xrCreateEyeTrackerANDROID(session, &createInfo, &eyeTracker));

while (1) {
    // ...
    // For every frame in frame loop
    // ...

    XrFrameState frameState;  // previously returned from xrWaitFrame
    const XrTime time = frameState.predictedDisplayTime;
    XrEyesANDROID fineEyesInfo{.type = XR_TYPE_EYES_ANDROID,
                               .next = nullptr,
                               .mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
    XrEyesANDROID coarseEyesInfo{.type = XR_TYPE_EYES_ANDROID,
                                 .next = nullptr,
                                 .mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
    XrEyesGetInfoANDROID eyesGetInfo{.type = XR_TYPE_EYES_GET_INFO_ANDROID,
                                     .next = nullptr,
                                     .time = time,
                                     .baseSpace = viewSpace};
    CHK_XR(xrGetCoarseTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &coarseEyesInfo));
    CHK_XR(xrGetFineTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &fineEyesInfo));

    // eyes tracking information is now available:
    // drawLeftEye(eyesInfo.eyes[XR_EYE_INDEX_LEFT_ANDROID].eyePose);
    // drawRightEye(eyesInfo.eyes[XR_EYE_INDEX_RIGHT_ANDROID].eyePose);

    // ...
    // Finish frame loop
    // ...
}

// after usage
CHK_XR(xrDestroyEyeTrackerANDROID(eyeTracker));

새 객체 유형

새 열거형 상수

  • XR_EYE_MAX_ANDROID

XrObjectType 열거형이 다음으로 확장됩니다.

  • XR_OBJECT_TYPE_EYE_TRACKER_ANDROID

XrStructureType 열거형이 다음으로 확장됩니다.

  • XR_TYPE_EYES_ANDROID
  • XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_EYES_GET_INFO_ANDROID
  • XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID

새 열거형

새 구조

새 함수

문제

버전 기록

  • 버전 1, 2025-01-17 (케니 베르카에머)
    • 초기 확장 프로그램 설명

OpenXR™ 및 OpenXR 로고는 The Khronos Group Inc. 소유의 상표이며 중국, 유럽 연합, 일본, 영국에 상표로 등록되어 있습니다.