1. 소개
가상현실(VR) 및 증강현실(AR) 애플리케이션을 가능하게 하는 하드웨어가 이제 광범위하게 소비자에게 제공되어, 새로운 기회와 도전이 있는 몰입형 컴퓨팅 플랫폼을 제공합니다. 몰입형 하드웨어와 직접적으로 상호작용하는 기능은 웹이 이 환경에서 중요한 역할을 할 수 있도록 하는 데 필수적입니다. WebXR 게임패드 모듈은 WebXR 디바이스 API 및 게임패드 API에 인터페이스와 동작을 추가하여, 다양한 WebXR 호환 장치에서 입력 소스로 사용할 수 있는 버튼, 트리거, 썸스틱, 터치패드의 상태를 쿼리할 수 있도록 합니다.
이 모듈은 WebXR 디바이스 API에 대한 추가 기능입니다.
1.1. 용어정의
이 문서에서는 XR이라는 약어를 사용하여 가상현실, 증강현실 및 기타 관련 기술에 사용되는 하드웨어, 애플리케이션, 기법 전반을 지칭합니다. 예를 들면, 다음과 같습니다:
-
불투명, 투명 또는 비디오 패스스루를 사용하는 헤드 마운트 디스플레이
-
위치 추적이 가능한 모바일 장치
-
헤드 트래킹 기능이 있는 고정 디스플레이
이들 사이의 중요한 공통점은 가상 콘텐츠의 보기를 시뮬레이션하기 위한 공간 추적 기능을 제공한다는 점입니다.
"XR 디바이스", "XR 애플리케이션" 등의 용어는 일반적으로 위에 언급된 모든 장치에 적용됩니다. 일부 장치에만 적용되는 문서의 부분에는 해당 여부가 명시됩니다.
XR 디바이스는 종종 버튼, 트리거, 썸스틱, 터치패드 입력으로 몰입형 경험과 상호작용할 수 있도록 추가 컨트롤러 하드웨어를 가지고 있습니다. 이러한 장치는 자주 공간 추적도 가능하며 "모션 컨트롤러", "핸드헬드 컨트롤러", "트래킹 컨트롤러"로 불립니다.
2. WebXR 디바이스 API 통합
WebXR 디바이스 API API에서 정의된 대로,XRInputSource
는 XR 입력 소스를 나타내며, 사용자가 뷰어와
동일한 가상 공간에서 타겟 동작을 수행할 수 있는 모든 입력 메커니즘을 의미합니다.
예시 XR 입력 소스에는 핸드헬드 컨트롤러, 광학 기반
손 추적, 뷰어의
자세에서 동작하는 응시 기반 입력 방식 등이 포함되지만 이에 국한하지 않습니다.
이 문서는 XRInputSource
가 버튼, 트리거, 썸스틱 또는 터치패드 데이터를 보고해야 할 때의 동작을 설명합니다. 이는 일반적으로 모션 컨트롤러이지만, XR
디바이스에 버튼, 트리거, 썸스틱 또는 터치패드가 있는 헤드셋일 수도 있습니다.
WebXR 디바이스 API에서 명시된 바와 같이, XR
디바이스와 명확하게 연결되지 않은 기존 게임패드와 같은 입력 메커니즘은 XR 입력 소스로 간주되어서는 안 됩니다.
2.1. XRInputSource
버튼, 트리거, 썸스틱, 터치패드 데이터는 연결된 Gamepad
객체를 통해 XRInputSource
에서 보고됩니다.
partial interface XRInputSource { [SameObject ]readonly attribute Gamepad ?gamepad ; };
gamepad 속성은 XR 입력 소스의 모든 버튼과 축의 상태를 나타내는 Gamepad
객체입니다.
XR 입력 소스가 다음 중 하나 이상의 속성을
갖지 않은 경우, gamepad 속성은 null이어야 합니다:
-
단일 버튼과 gripSpace
-
2개 이상의 버튼
-
하나 이상의 축
2.2. XRSession
XRInputSource
는
연결 및 해제될 때 inputSources
배열에서 보고됩니다. gamepad의
존재가 inputSources
배열의 어떤 항목에서든 변경될 때,
User Agent는 WebXR 디바이스 API의 입력
소스 속성 변경 처리 알고리즘을 호출해야 합니다.
프레임 업데이트 목록이 gamepad 프레임 업데이트 적용을 포함하도록 업데이트됩니다.
XRFrame
frame에 대해 gamepad 프레임 업데이트 적용을 하려면, User Agent는 다음 단계를 수행해야 합니다:
-
XRInputSource중gamepadgamepad가 frame의session에 연결되어 있는 각XRInputSource에 대해, 다음 단계를 수행합니다:-
gamepad를 frame의 time에서의 gamepad 데이터로 업데이트합니다.
-
참고: gamepad
객체는 "라이브"이며, 모든 내부 상태가 매 프레임 인플레이스 업데이트된다는 의미입니다. 또한, 어떤 프레임에서 XRInputSource의
gamepad에 대한 참조를 저장하고 이후 프레임에서 동일한 XRInputSource의
gamepad 와 비교하여 상태 변화를 테스트하는 것은 동작하지 않습니다. 두
객체는 동일한 객체이기 때문입니다. 따라서 프레임별로 입력 상태를 비교하려면, 개발자는 비교할 상태를 캐시해야 합니다.
3. 게임패드 API 통합
Gamepad
인스턴스는 XRInputSource의
gamepad
속성에서 반환되며,
게임패드 API에서 설명된 대로 동작하되, 몇 가지 추가적인 동작 제한이 있습니다.
XRInputSource에
연결된
Gamepad는
활성 XR 세션이 없어도 사용자 에이전트의 선택으로 navigator.getGamepads()를
통해 노출될 수 있습니다.
이를 통해 사용자가 원하는 경우 XR 장치를 "일반" 게임패드로 사용할 수 있습니다.
참고: [WEBXR-HAND-INPUT-1]에
설명된 대로, 손 추적 XRInputSource에도
user agent가 허용하는 경우 gamepad 기반 콘텐츠와 연동될 수 있도록 Gamepad를
가질 수 있습니다.
3.1. Navigator
게임패드 API는 Gamepad
데이터의 스냅샷은 navigator.getGamepads()
함수를 호출하여 가져올 수 있다고 명시합니다. 단, Gamepad
인스턴스가
XRInputSource의
gamepad
속성에서 반환된 경우, navigator.getGamepads()에서
반환되는 배열에 포함되어서는 안 됩니다.
3.2. Gamepad
아래의 Gamepad
속성은 XRInputSource의
gamepad
속성에서 반환된 경우 다음과 같은 동작 제약이 있어야 합니다.
-
gamepad의index속성은-1이어야 하며,navigator.getGamepads()를 통해 노출되지 않는 경우에만 그렇고, 그렇지 않으면 미사용 게임패드 인덱스 선택에 따라 할당되어야 합니다. -
gamepad의connected속성은XRInputSource가 활성 XR 입력 소스 목록 또는XRSession이 종료될 때까지true이어야 합니다. -
만약
gamepad의axes배열에 보고되는 축이 터치패드의 축을 나타내는 경우, 관련된GamepadButton의touched값이false일 때, 해당 축의 값은0이어야 합니다.
3.3. "xr-standard" 게임패드 매핑
"xr-standard"
매핑은 게임패드 API에서 정의되며 이 명세에서 사용하도록 예약되어
있습니다. 이는 gamepad의
버튼과 축 레이아웃이 아래 표와 최대한 일치함을 의미합니다.
mapping이
"xr-standard"로
보고되기 위해서는,
장치는 targetRayMode가
"tracked-pointer"여야
하며,
gripSpace가
null이 아니어야 합니다.
최소 하나 이상의 기본 트리거가 있어야
하며, 이는 터치패드 또는 썸스틱과는 별개여야 합니다. 기본 트리거는 입력 소스의 기본
동작을 트리거해야 합니다.
장치는 기본 스퀴즈 버튼을
추가로 가질 수 있으며, 있는 경우에는 입력 소스의 기본
스퀴즈 동작을 트리거해야 합니다.
만약 장치가 "xr-standard"
매핑 요건을 충족하지 않더라도,
gamepad에
대해 매핑을 "" (빈 문자열)로 노출할 수 있습니다.
"xr-standard"
매핑은 오직
Gamepad
인스턴스가 XRInputSource에서
보고될 때만 사용해야 합니다.
| 버튼 | xr-standard 매핑
| 필수여부 |
|---|---|---|
| buttons[0] | 기본 트리거 | 예 |
| buttons[1] | 기본 스퀴즈 버튼 | 아니오 |
| buttons[2] | 기본 터치패드 | 아니오 |
| buttons[3] | 기본 썸스틱 | 아니오 |
| 축 | xr-standard 매핑
| 필수여부 |
|---|---|---|
| axes[0] | 기본 터치패드 X | 아니오 |
| axes[1] | 기본 터치패드 Y | 아니오 |
| axes[2] | 기본 썸스틱 X | 아니오 |
| axes[3] | 기본 썸스틱 Y | 아니오 |
위 표에 나와 있는 선택적 입력 중 일부가 없는 장치는 buttons
또는
axes
배열에서 해당 인덱스를 유지해야 하며, 각각 자리표시 버튼 또는 자리표시 축을 보고해야 합니다. 자리표시 버튼은
value에
대해 0을,
pressed,
touched에
대해 각각 false를 보고해야 합니다.
자리표시 축은 반드시
0을 보고해야 합니다.
자리표시 버튼과 자리표시 축은
배열의 마지막 요소이거나 이후 모든 요소도 자리표시 버튼 또는 자리표시 축이라면 생략해야 합니다.
이 외에 추가 버튼이나 축이 노출될 수 있으며, 이는 중요도 순으로 정렬되어야 합니다. 관련 축(예: 썸스틱의 두 축)은 반드시 함께 그룹화되고 가능하다면 X, Y, Z 순서로 배치해야 합니다.
3.4. UA/플랫폼 예약 버튼
User Agent는 가능한 경우, 신뢰된 UI에서 스푸핑이 불가능한 동작을 수행하기 위해 최소 1개 이상의 물리 버튼을 예약해야 합니다. 예를 들어, User Agent는 다수 컨트롤러에 존재하는 "메뉴" 또는 "앱" 버튼을 몰입형 프레젠테이션 종료용 전용 버튼으로 지정할 수 있습니다.추가로, 많은 XR 플랫폼에서도 홈 환경 복귀와 같은 플랫폼별 동작을 위한 버튼을 예약합니다.
UA나 플랫폼에 의해 예약된 버튼은 Gamepad에
노출되어서는 안 됩니다.
또한, User Agent는 각 XR 플랫폼별로 어떤 버튼이 예약되는지 조정하기 위해 노력해야 합니다.
WebXR 입력 프로필
레지스트리는 버튼 예약을 조정하는 권장 위치입니다.
3.5. 예시 매핑
"xr-standard"
매핑으로 어떻게 노출되는지 보여줍니다. 이미지는 특정 장치를 나타내려는 목적이 아니며 참조용으로만 사용됩니다. 4. 보안 및 프라이버시
WebXR 디바이스 API는 User Agent가 반드시 완화 조치를 취해야 할 여러 고유한 프라이버시, 보안 및 편안성 리스크와 함께 강력한 새로운 기능들을 제공합니다. 이 주제는 WebXR 디바이스 API에서 자세히 다루고 있습니다. 이 모듈은 추가적인 고려사항을 더하지만, WebXR 보안 및 프라이버시의 기본 원칙은 변경하지 않습니다.
4.1. 지문채취
API가 사용자에게 이용 가능한 하드웨어와 그 기능을 설명하기 때문에 지문채취 표면적이 필연적으로 추가됩니다. 이를 완전히 방지하는 것은 불가능하지만, User Agent는 문제를 완화하기 위한
조치를 취해야 합니다. WebXR 디바이스 API에서 정의된 바대로, XRInputSource는
XRSession이
생성된 후에만 보고되며, 이는 노출될 민감한 정보에 대해 추가 보호가 필요함을 의미합니다.
또한, 이 모듈에서는 XRInputSource의
gamepad.id이
문자열 식별자를 보고하지 않도록 요구합니다.
변경사항
2019년 10월 10일 첫 퍼블릭 워킹드래프트 이후 변경점
-
게임패드 API 통합은 명확히 User Agent에 맡기도록 명시함 (GitHub #49)
-
예약 버튼이 노출되지 않음을 명시하는 명세 텍스트 추가 (GitHub #48)
-
gamepad.index의 정의 완화 (GitHub #46, GitHub #47)
-
기본 트리거와 연결 버튼 정의 및 링크 추가 (GitHub #24)
-
게임패드 상태가 업데이트될 때의 동작 명확화 (GitHub #22)
5. 감사의 글
다음 분들은 WebXR 디바이스 API 명세 설계에 기여하셨습니다:
그리고 이 모든 여정의 시작에 특별히 감사의 말씀을 전합니다: Vladimir Vukicevic (Unity)!