이름 문자열
XR_ANDROID_face_tracking
확장 프로그램 유형
인스턴스 확장
등록된 내선 번호
459
버전
3
확장 프로그램 및 버전 종속 항목
최종 수정일
2025-06-04
IP 상태
알려진 IP 소유권 주장이 없습니다.
도움을 주신 분들
스펜서 퀸, Google
Jared Finder, Google
레바나 첸, Google
개요
이 확장 프로그램을 사용하면 애플리케이션이 블렌드 셰이프의 가중치를 가져와 XR 환경에서 얼굴 표정을 렌더링할 수 있습니다.
이 확장 프로그램은 가상 공간에서 사실적인 아바타와 표현력 있는 사용자 표현을 만드는 데 필요한 정보를 제공하기 위한 것입니다. 애플리케이션은 블렌드 셰이프의 가중치를 가져오기 전에 얼굴 보정 활성화를 확인할 수 있습니다.
얼굴 추적기
얼굴 추적기는 사용자 쪽 이미지 스트림과 카메라 보정을 통해 얼굴 표정을 추적하는 감지 기기입니다. 이 확장 프로그램의 주요 목적은 가상 장면에서 사용자 얼굴 표정을 아바타에 매핑하는 것입니다.
얼굴 추적 데이터는 민감한 개인 정보이며 개인 정보 보호 및 무결성과 밀접하게 연결되어 있습니다. 얼굴 추적 데이터를 저장하거나 전송하는 애플리케이션은 항상 사용자에게 이를 수행할 수 있는 적극적이고 구체적인 수락을 요청하는 것이 좋습니다.
- 애플리케이션이 얼굴 추적기에 대한 액세스가 허용될 때까지 활성 얼굴 추적기를 만들 때 애플리케이션은
XR_ERROR_PERMISSION_INSUFFICIENT를 수신합니다. - xrGetFaceStateANDROID를 사용하여 얼굴 상태를 가져올 때 애플리케이션 액세스가 허용되지 않으면 XrFaceStateANDROID::isValid가
XR_TRUE를 반환하지 않습니다.
시스템 기능 검사
XrSystemFaceTrackingPropertiesANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSystemFaceTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsFaceTracking;
} XrSystemFaceTrackingPropertiesANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다.supportsFaceTracking는 현재 시스템이 얼굴 추적을 지원하는지 나타내는 XrBool32입니다.
애플리케이션은 xrGetSystemProperties를 호출할 때 XrSystemFaceTrackingPropertiesANDROID 구조로 XrSystemProperties를 확장하여 시스템이 얼굴 추적을 지원하는지 검사할 수 있습니다.
런타임이 supportsFaceTracking에 대해 XR_FALSE을 반환하는 경우에만 런타임은 xrCreateFaceTrackerANDROID에서 XR_ERROR_FEATURE_UNSUPPORTED을 반환해야 합니다.
얼굴 추적기 핸들 만들기
XR_DEFINE_HANDLE(XrFaceTrackerANDROID)
XrFaceTrackerANDROID 핸들은 얼굴 추적을 위한 얼굴 추적기를 나타냅니다.
이 핸들은 이 확장 프로그램의 다른 함수를 사용하여 얼굴 추적 데이터에 액세스하는 데 사용할 수 있습니다.
xrCreateFaceTrackerANDROID 함수는 다음과 같이 정의됩니다.
XrResult xrCreateFaceTrackerANDROID(
XrSession session,
const XrFaceTrackerCreateInfoANDROID* createInfo,
XrFaceTrackerANDROID* faceTracker);
매개변수 설명
session은 얼굴 추적기가 활성화될 XrSession 핸들입니다.createInfo는 얼굴 추적기를 지정하는 데 사용되는 XrFaceTrackerCreateInfoANDROID입니다.faceTracker는 반환된 XrFaceTrackerANDROID 핸들입니다.
애플리케이션은 xrCreateFaceTrackerANDROID 함수를 사용하여 XrFaceTrackerANDROID 핸들을 만들 수 있습니다.
시스템에서 얼굴 추적을 지원하지 않으면 xrCreateFaceTrackerANDROID가 XR_ERROR_FEATURE_UNSUPPORTED를 반환합니다.
유효한 사용 (암시적)
XR_ANDROID_face_tracking확장 프로그램은 xrCreateFaceTrackerANDROID를 호출하기 전에 사용 설정해야 합니다.session은 유효한 XrSession 핸들이어야 합니다.createInfo는 유효한 XrFaceTrackerCreateInfoANDROID 구조체를 가리키는 포인터여야 합니다.faceTracker은 XrFaceTrackerANDROID 핸들에 대한 포인터여야 합니다.
반환 코드
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHED
XrFaceTrackerCreateInfoANDROID 구조는 다음과 같이 설명됩니다.
typedef struct XrFaceTrackerCreateInfoANDROID {
XrStructureType type;
void* next;
} XrFaceTrackerCreateInfoANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.
XrFaceTrackerCreateInfoANDROID 구조체는 XrFaceTrackerANDROID 핸들을 생성하기 위한 정보를 설명합니다.
유효한 사용 (암시적)
XR_ANDROID_face_tracking확장 프로그램은 XrFaceTrackerCreateInfoANDROID를 사용하기 전에 사용 설정해야 합니다.type은XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID이어야 합니다.next은NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
xrDestroyFaceTrackerANDROID 함수는 다음과 같이 정의됩니다.
XrResult xrDestroyFaceTrackerANDROID(
XrFaceTrackerANDROID faceTracker);
매개변수 설명
faceTracker은 이전에 xrCreateFaceTrackerANDROID로 만든 XrFaceTrackerANDROID입니다.
xrDestroyFaceTrackerANDROID 함수는 얼굴 추적 환경이 종료되면 faceTracker 및 기본 리소스를 해제합니다.
유효한 사용 (암시적)
XR_ANDROID_face_tracking확장 프로그램은 xrDestroyFaceTrackerANDROID를 호출하기 전에 사용 설정해야 합니다.faceTracker은 유효한 XrFaceTrackerANDROID 핸들이어야 합니다.
스레드 안전
faceTracker및 모든 하위 핸들에 대한 액세스는 외부적으로 동기화되어야 합니다.
반환 코드
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
얼굴 보정 확인
xrGetFaceCalibrationStateANDROID 함수는 다음과 같이 정의됩니다.
XrResult xrGetFaceCalibrationStateANDROID(
XrFaceTrackerANDROID faceTracker,
XrBool32* faceIsCalibratedOutput);
매개변수 설명
faceTracker은 이전에 xrCreateFaceTrackerANDROID로 만든 XrFaceTrackerANDROID입니다.faceIsCalibratedOutput는 얼굴 추적기가 보정되었는지 여부를 나타냅니다.
애플리케이션은 xrGetFaceCalibrationStateANDROID 함수를 사용하여 얼굴 보정 상태를 확인할 수있습니다.
추적 서비스가 아직 초기화 중인 경우 런타임은 xrGetFaceCalibrationStateANDROID에서 XR_ERROR_SERVICE_NOT_READY_ANDROID를 반환하여 애플리케이션이 나중에 다시 시도할 수 있음을 나타낼 수 있습니다.
시스템에서 얼굴 보정을 지원하지 않으면 xrGetFaceCalibrationStateANDROID가 XR_ERROR_FEATURE_UNSUPPORTED를 반환합니다. 그렇지 않으면 얼굴 보정 상태를 반영하기 위해 faceIsCalibratedOutput가 XR_TRUE로 설정될 수 있습니다.
유효한 사용 (암시적)
- xrGetFaceCalibrationStateANDROID를 호출하기 전에
XR_ANDROID_face_tracking확장 프로그램을 사용 설정해야 합니다. faceTracker은 유효한 XrFaceTrackerANDROID 핸들이어야 합니다.faceIsCalibratedOutput은(는)XrBool32값에 대한 포인터여야 합니다.
반환 코드
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_SERVICE_NOT_READY_ANDROID
얼굴 표정 가져오기
xrGetFaceStateANDROID 함수는 지정된 시간의 얼굴 표정 블렌드 셰이프를 반환합니다.
XrResult xrGetFaceStateANDROID(
XrFaceTrackerANDROID faceTracker,
const XrFaceStateGetInfoANDROID* getInfo,
XrFaceStateANDROID* faceStateOutput);
매개변수 설명
faceTracker은 이전에 xrCreateFaceTrackerANDROID로 만든 XrFaceTrackerANDROID입니다.getInfo은 얼굴 표정을 가져오는 정보를 설명하는 XrFaceStateGetInfoANDROID에 대한 포인터입니다.faceStateOutput는 반환된 얼굴 추적 상태와 표정을 수신하는 XrFaceStateANDROID 포인터입니다.
유효한 사용 (암시적)
- xrGetFaceStateANDROID를 호출하기 전에
XR_ANDROID_face_tracking확장 프로그램을 사용 설정해야 합니다. faceTracker은 유효한 XrFaceTrackerANDROID 핸들이어야 합니다.getInfo는 유효한 XrFaceStateGetInfoANDROID 구조체에 대한 포인터여야 합니다.faceStateOutput은(는) XrFaceStateANDROID 구조체에 대한 포인터여야 합니다.
반환 코드
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_TIME_INVALID
XrFaceStateGetInfoANDROID 구조는 얼굴 표정을 가져오는 정보를 설명합니다.
typedef struct XrFaceStateGetInfoANDROID {
XrStructureType type;
void* next;
XrTime time;
} XrFaceStateGetInfoANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.time는 얼굴 표정이 요청되는XrTime입니다.
애플리케이션은 렌더링된 프레임의 예측 디스플레이 시간과 동일한 시간을 요청해야 합니다.
유효한 사용 (암시적)
- XrFaceStateGetInfoANDROID를 사용하기 전에
XR_ANDROID_face_tracking확장 프로그램을 사용 설정해야 합니다. type은XR_TYPE_FACE_STATE_GET_INFO_ANDROID이어야 합니다.next은NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.
XrFaceStateANDROID 구조는 얼굴 추적 상태와 얼굴 표정을 반환합니다.
typedef struct XrFaceStateANDROID {
XrStructureType type;
void* next;
uint32_t parametersCapacityInput;
uint32_t parametersCountOutput;
float* parameters;
XrFaceTrackingStateANDROID faceTrackingState;
XrTime sampleTime;
XrBool32 isValid;
uint32_t regionConfidencesCapacityInput;
uint32_t regionConfidencesCountOutput;
float* regionConfidences;
} XrFaceStateANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조체 체인의 다음 구조체에 대한 포인터입니다. 이러한 구조는 핵심 OpenXR이나 이 확장 프로그램에 정의되어 있지 않습니다.parametersCapacityInput는parameters배열의 용량을 설명하는uint32_t이거나 필요한 용량을 가져오는 요청을 나타내는 0입니다.parametersCountOutput은parameters의 수를 설명하는uint32_t이거나parametersCapacityInput이 부족한 경우 필요한 용량입니다.parameters은 얼굴 표정 블렌드 셰이프의 가중치로 채워질 애플리케이션 할당float배열의 포인터입니다.faceTrackingState는 얼굴 추적의 유효성 상태의XrFaceTrackingStateANDROID입니다.sampleTime는 반환된 표현식이 추적되거나 추정되는XrTime시간입니다. 이 값은 해당 시점의 외삽이 성공한 경우 표현식 가중치가 요청된 시간과 같습니다.isValid는 데이터가 현재 프레임에서 가져온 것이 아니더라도 유효한지 여부를 나타냅니다.regionConfidencesCapacityInput는regionConfidences배열의 용량을 설명하는uint32_t이거나 필요한 용량을 가져오는 요청을 나타내는 0입니다.regionConfidencesCountOutput은regionConfidences의 수를 설명하는uint32_t이거나regionConfidencesCapacityInput이 부족한 경우 필요한 용량입니다.regionConfidences는 각 얼굴 영역의 신뢰도 값으로 채워질 애플리케이션 할당float배열에 대한 포인터입니다.- 필요한
parameters및regionConfidences크기를 가져오는 방법에 관한 자세한 설명은 버퍼 크기 매개변수 섹션을 참고하세요.
애플리케이션은 parametersCapacityInput을 XR_FACE_PARAMETER_COUNT_ANDROID로 설정하여 XrFaceParameterIndicesANDROID로 색인이 생성된 얼굴 표정을 가져올 수 있습니다.
반환된 parameters는 현재 얼굴 표정의 블렌드 셰이프 가중치를 나타냅니다.
parameters 배열 업데이트는 애플리케이션이 해당 얼굴 표정 enum (예: XrFaceParameterIndicesANDROID)을 사용하여 요소를 색인화할 수 있도록 정렬됩니다.
유효한 사용 (암시적)
- XrFaceStateANDROID를 사용하기 전에
XR_ANDROID_face_tracking확장 프로그램을 사용 설정해야 합니다. type은XR_TYPE_FACE_STATE_ANDROID이어야 합니다.next은NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다.parametersCapacityInput이 아닌 경우0, parameters은parametersCapacityInput float값의 배열을 가리키는 포인터여야 합니다.regionConfidencesCapacityInput이 아닌 경우0, regionConfidences은regionConfidencesCapacityInput float값의 배열을 가리키는 포인터여야 합니다.faceTrackingState은(는) 유효한 XrFaceTrackingStateANDROID 값이어야 합니다.
XrFaceTrackingStateANDROID 열거형은 얼굴 추적기의 다양한 상태를 식별합니다.
typedef enum XrFaceTrackingStateANDROID {
XR_FACE_TRACKING_STATE_PAUSED_ANDROID = 0,
XR_FACE_TRACKING_STATE_STOPPED_ANDROID = 1,
XR_FACE_TRACKING_STATE_TRACKING_ANDROID = 2
} XrFaceTrackingStateANDROID;
열거형은 다음과 같은 의미를 갖습니다.
Enum |
설명 |
|
얼굴 추적이 일시중지되었지만 나중에 재개될 수 있음을 나타냅니다. |
|
추적이 중지되었지만 클라이언트에는 여전히 활성 얼굴 추적기가 있습니다. |
|
얼굴이 추적되고 포즈가 현재입니다. |
신뢰도 영역
XR_ANDROID_face_tracking 확장 프로그램은 왼쪽 눈, 오른쪽 눈, 아래쪽 얼굴의 세 얼굴 영역에 대한 신뢰도 값도 제공합니다. 이 값은 0 (신뢰도 없음)에서 1 (신뢰도 가장 높음)까지의 범위로, 각 영역의 얼굴 추적 정확도를 나타냅니다.
이러한 신뢰도 값을 사용하여 블렌드 셰이프를 점진적으로 사용 중지하거나 흐리게 처리와 같은 시각적 필터를 해당 얼굴 영역에 적용할 수 있습니다. 기본적인 켜기/끄기 제어의 경우 0.3의 임곗값을 사용하여 해당 얼굴 영역의 블렌드 셰이프를 완전히 비활성화하는 것이 좋습니다.
'하안면' 영역은 입, 턱, 뺨, 코를 비롯해 눈 아래의 모든 부분을 나타냅니다. 눈 영역에는 눈과 눈썹 영역이 포함됩니다.
다음 표에서는 각 신뢰도 영역과 연결된 블렌드 셰이프를 설명합니다.
| 신뢰도 영역 | 블렌드 셰이프 |
|---|---|
| 하반부 | `XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID`, `XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID`, `XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID`, `XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID`, `XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID` |
| 왼쪽/오른쪽 상단 얼굴 | `XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID`, `XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID`, `XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID` |
블렌드 셰이프 규칙
이 확장 프로그램은 축소된 G-Nome 형식을 위해 XR_FACE_PARAMETER_COUNT_ANDROID를 통해 68개의 블렌드 셰이프를 정의합니다. 이 열거형의 각 매개변수는 값이 float 유형이고 런타임이 1~0으로 정규화되는 혼합 모양 배열의 색인입니다.
typedef enum XrFaceParameterIndicesANDROID {
XR_FACE_PARAMETER_INDICES_BROW_LOWERER_L_ANDROID = 0,
XR_FACE_PARAMETER_INDICES_BROW_LOWERER_R_ANDROID = 1,
XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_L_ANDROID = 2,
XR_FACE_PARAMETER_INDICES_CHEEK_PUFF_R_ANDROID = 3,
XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_L_ANDROID = 4,
XR_FACE_PARAMETER_INDICES_CHEEK_RAISER_R_ANDROID = 5,
XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_L_ANDROID = 6,
XR_FACE_PARAMETER_INDICES_CHEEK_SUCK_R_ANDROID = 7,
XR_FACE_PARAMETER_INDICES_CHIN_RAISER_B_ANDROID = 8,
XR_FACE_PARAMETER_INDICES_CHIN_RAISER_T_ANDROID = 9,
XR_FACE_PARAMETER_INDICES_DIMPLER_L_ANDROID = 10,
XR_FACE_PARAMETER_INDICES_DIMPLER_R_ANDROID = 11,
XR_FACE_PARAMETER_INDICES_EYES_CLOSED_L_ANDROID = 12,
XR_FACE_PARAMETER_INDICES_EYES_CLOSED_R_ANDROID = 13,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_L_ANDROID = 14,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_DOWN_R_ANDROID = 15,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_L_ANDROID = 16,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_LEFT_R_ANDROID = 17,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_L_ANDROID = 18,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_RIGHT_R_ANDROID = 19,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_L_ANDROID = 20,
XR_FACE_PARAMETER_INDICES_EYES_LOOK_UP_R_ANDROID = 21,
XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_L_ANDROID = 22,
XR_FACE_PARAMETER_INDICES_INNER_BROW_RAISER_R_ANDROID = 23,
XR_FACE_PARAMETER_INDICES_JAW_DROP_ANDROID = 24,
XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_LEFT_ANDROID = 25,
XR_FACE_PARAMETER_INDICES_JAW_SIDEWAYS_RIGHT_ANDROID = 26,
XR_FACE_PARAMETER_INDICES_JAW_THRUST_ANDROID = 27,
XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_L_ANDROID = 28,
XR_FACE_PARAMETER_INDICES_LID_TIGHTENER_R_ANDROID = 29,
XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_L_ANDROID = 30,
XR_FACE_PARAMETER_INDICES_LIP_CORNER_DEPRESSOR_R_ANDROID = 31,
XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_L_ANDROID = 32,
XR_FACE_PARAMETER_INDICES_LIP_CORNER_PULLER_R_ANDROID = 33,
XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LB_ANDROID = 34,
XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_LT_ANDROID = 35,
XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RB_ANDROID = 36,
XR_FACE_PARAMETER_INDICES_LIP_FUNNELER_RT_ANDROID = 37,
XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_L_ANDROID = 38,
XR_FACE_PARAMETER_INDICES_LIP_PRESSOR_R_ANDROID = 39,
XR_FACE_PARAMETER_INDICES_LIP_PUCKER_L_ANDROID = 40,
XR_FACE_PARAMETER_INDICES_LIP_PUCKER_R_ANDROID = 41,
XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_L_ANDROID = 42,
XR_FACE_PARAMETER_INDICES_LIP_STRETCHER_R_ANDROID = 43,
XR_FACE_PARAMETER_INDICES_LIP_SUCK_LB_ANDROID = 44,
XR_FACE_PARAMETER_INDICES_LIP_SUCK_LT_ANDROID = 45,
XR_FACE_PARAMETER_INDICES_LIP_SUCK_RB_ANDROID = 46,
XR_FACE_PARAMETER_INDICES_LIP_SUCK_RT_ANDROID = 47,
XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_L_ANDROID = 48,
XR_FACE_PARAMETER_INDICES_LIP_TIGHTENER_R_ANDROID = 49,
XR_FACE_PARAMETER_INDICES_LIPS_TOWARD_ANDROID = 50,
XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_L_ANDROID = 51,
XR_FACE_PARAMETER_INDICES_LOWER_LIP_DEPRESSOR_R_ANDROID = 52,
XR_FACE_PARAMETER_INDICES_MOUTH_LEFT_ANDROID = 53,
XR_FACE_PARAMETER_INDICES_MOUTH_RIGHT_ANDROID = 54,
XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_L_ANDROID = 55,
XR_FACE_PARAMETER_INDICES_NOSE_WRINKLER_R_ANDROID = 56,
XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_L_ANDROID = 57,
XR_FACE_PARAMETER_INDICES_OUTER_BROW_RAISER_R_ANDROID = 58,
XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_L_ANDROID = 59,
XR_FACE_PARAMETER_INDICES_UPPER_LID_RAISER_R_ANDROID = 60,
XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_L_ANDROID = 61,
XR_FACE_PARAMETER_INDICES_UPPER_LIP_RAISER_R_ANDROID = 62,
XR_FACE_PARAMETER_INDICES_TONGUE_OUT_ANDROID = 63,
XR_FACE_PARAMETER_INDICES_TONGUE_LEFT_ANDROID = 64,
XR_FACE_PARAMETER_INDICES_TONGUE_RIGHT_ANDROID = 65,
XR_FACE_PARAMETER_INDICES_TONGUE_UP_ANDROID = 66,
XR_FACE_PARAMETER_INDICES_TONGUE_DOWN_ANDROID = 67
} XrFaceParameterIndicesANDROID;
| 색인 | 이름 | 참조 이미지 | |
|---|---|---|---|
| 0 | BROW_LOWERER_L |
|
|
| 1 | BROW_LOWERER_R |
|
|
| 2 | CHEEK_PUFF_L |
|
|
| 3 | CHEEK_PUFF_R |
|
|
| 4 | CHEEK_RAISER_L |
|
|
| 5 | CHEEK_RAISER_R |
|
|
| 6 | CHEEK_SUCK_L |
|
|
| 7 | CHEEK_SUCK_R |
|
|
| 8 | CHIN_RAISER_B |
|
|
| 9 | CHIN_RAISER_T |
|
|
| 10 | DIMPLER_L |
|
|
| 11 | DIMPLER_R |
|
|
| 12 | EYES_CLOSED_L |
|
|
| 13 | EYES_CLOSED_R |
|
|
| 14 | EYES_LOOK_DOWN_L |
|
|
| 15 | EYES_LOOK_DOWN_R |
|
|
| 16 | EYES_LOOK_LEFT_L |
|
|
| 17 | EYES_LOOK_LEFT_R |
|
|
| 18 | EYES_LOOK_RIGHT_L |
|
|
| 19 | EYES_LOOK_RIGHT_R |
|
|
| 20 | EYES_LOOK_UP_L |
|
|
| 21 | EYES_LOOK_UP_R |
|
|
| 22 | INNER_BROW_RAISER_L |
|
|
| 23 | INNER_BROW_RAISER_R |
|
|
| 24 | JAW_DROP |
|
|
| 25 | JAW_SIDEWAYS_LEFT |
|
|
| 26 | JAW_SIDEWAYS_RIGHT |
|
|
| 27 | 턱 밀기 |
|
|
| 28 | LID_TIGHTENER_L |
|
|
| 29 | LID_TIGHTENER_R |
|
|
| 30 | LIP_CORNER_DEPRESSOR_L |
|
|
| 31 | LIP_CORNER_DEPRESSOR_R |
|
|
| 32 | LIP_CORNER_PULLER_L |
|
|
| 33 | LIP_CORNER_PULLER_R |
|
|
| 34 | LIP_FUNNELER_LB |
|
|
| 35 | LIP_FUNNELER_LT |
|
|
| 36 | LIP_FUNNELER_RB |
|
|
| 37 | LIP_FUNNELER_RT |
|
|
| 38 | LIP_PRESSOR_L |
|
|
| 39 | LIP_PRESSOR_R |
|
|
| 40 | LIP_PUCKER_L |
|
|
| 41 | LIP_PUCKER_R |
|
|
| 42 | LIP_STRETCHER_L |
|
|
| 43 | LIP_STRETCHER_R |
|
|
| 44 | LIP_SUCK_LB |
|
|
| 45 | LIP_SUCK_LT |
|
|
| 46 | LIP_SUCK_RB |
|
|
| 47 | LIP_SUCK_RT |
|
|
| 48 | LIP_TIGHTENER_L |
|
|
| 49 | LIP_TIGHTENER_R |
|
|
| 50 | LIPS_TOWARD |
|
|
| 51 | LOWER_LIP_DEPRESSOR_L |
|
|
| 52 | LOWER_LIP_DEPRESSOR_R |
|
|
| 53 | MOUTH_LEFT |
|
|
| 54 | MOUTH_RIGHT |
|
|
| 55 | NOSE_WRINKLER_L |
|
|
| 56 | NOSE_WRINKLER_R |
|
|
| 57 | OUTER_BROW_RAISER_L |
|
|
| 58 | OUTER_BROW_RAISER_R |
|
|
| 59 | UPPER_LID_RAISER_L |
|
|
| 60 | UPPER_LID_RAISER_R |
|
|
| 61 | UPPER_LIP_RAISER_L |
|
|
| 62 | UPPER_LIP_RAISER_R |
|
|
| 63 | TONGUE_OUT |
|
|
| 64 | TONGUE_LEFT |
|
|
| 65 | TONGUE_RIGHT |
|
|
| 66 | TONGUE_UP |
|
|
| 67 | TONGUE_DOWN |
|
|
얼굴 추적 예시 코드
다음 예제 코드는 얼굴 표정 블렌드 셰이프의 모든 가중치를 가져오는 방법을 보여줍니다.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized, e.g. created at app startup.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateFaceTrackerANDROID xrCreateFaceTrackerANDROID; // previously initialized
PFN_xrDestroyFaceTrackerANDROID xrDestroyFaceTrackerANDROID; // previously initialized
PFN_xrGetFaceStateANDROID xrGetFaceStateANDROID; // previously initialized
PFN_xrGetFaceCalibrationStateANDROID xrGetFaceCalibrationStateANDROID; // previously initialized
// Inspect system capability
XrSystemProperties properties{XR_TYPE_SYSTEM_PROPERTIES};
XrSystemFaceTrackingPropertiesANDROID faceTrackingProperties{XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID};
properties.next = &faceTrackingProperties;
CHK_XR(xrGetSystemProperties(instance, systemId, &properties));
if (!faceTrackingProperties.supportsFaceTracking) {
// face tracking is not supported.
return;
}
XrFaceTrackerANDROID faceTracker;
XrFaceTrackerCreateInfoANDROID
createInfo{.type = XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID,
.next = nullptr};
CHK_XR(xrCreateFaceTrackerANDROID(session, &createInfo, &faceTracker));
// If the system supports face calibration:
XrBool32 isCalibrated;
CHK_XR(xrGetFaceCalibrationStateANDROID(faceTracker, &isCalibrated));
if (!isCalibrated) {
// Redirect the user to system calibration setting.
}
XrFaceStateANDROID faceState;
float faceExpressionParameters[XR_FACE_PARAMETER_COUNT_ANDROID];
faceState.type = XR_TYPE_FACE_STATE_ANDROID;
faceState.next = nullptr;
faceState.parametersCapacityInput = XR_FACE_PARAMETER_COUNT_ANDROID;
faceState.parameters = faceExpressionParameters;
float regionConfidences[XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID];
faceState.regionConfidencesCapacityInput = XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID;
faceState.regionConfidences = regionConfidences;
while (1) {
// ...
// For every frame in the frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
XrFaceStateGetInfoANDROID faceGetInfo{
.type = XR_TYPE_FACE_STATE_GET_INFO_ANDROID,
.next = nullptr,
.time = frameState.predictedDisplayTime,
};
CHK_XR(xrGetFaceStateANDROID(faceTracker, &faceGetInfo, &faceState));
if (faceState.isValid) {
for (uint32_t i = 0; i < XR_FACE_PARAMETER_COUNT_ANDROID; ++i) {
// parameters[i] contains a weight of specific blend shape
}
for (uint32_t i = 0; i < XR_FACE_REGION_CONFIDENCE_COUNT_ANDROID; ++i) {
// regionConfidences[i] contains a confidence value of a specific region
}
}
}
// after usage
CHK_XR(xrDestroyFaceTrackerANDROID(faceTracker));
새 객체 유형
새 열거형 상수
XR_FACE_PARAMETER_COUNT_ANDROID
XrObjectType 열거형은 다음으로 확장됩니다.
XR_OBJECT_TYPE_FACE_TRACKER_ANDROID
XrStructureType 열거형은 다음으로 확장됩니다.
XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_FACE_STATE_GET_INFO_ANDROIDXR_TYPE_FACE_STATE_ANDROIDXR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_ANDROID
새 열거형
새 구조
- XrFaceTrackerCreateInfoANDROID
- XrFaceStateGetInfoANDROID
- XrFaceStateANDROID
- XrSystemFaceTrackingPropertiesANDROID
새로운 함수
- xrCreateFaceTrackerANDROID
- xrDestroyFaceTrackerANDROID
- xrGetFaceStateANDROID
- xrGetFaceCalibrationStateANDROID
문제
버전 기록
- 버전 1, 2024-09-05 (레바나 첸)
- 초기 확장 프로그램 설명
- 버전 2, 2025-04-01 (케니 베르카에머)
- 얼굴 신뢰도 영역 추가
- 버전 3, 2025년 6월 4일 (레바나 첸)
- 새 오류 코드가 추가되었습니다.
OpenXR™ 및 OpenXR 로고는 The Khronos Group Inc. 소유의 상표이며 중국, 유럽 연합, 일본, 영국에 상표로 등록되어 있습니다.