WebXR 게임패드 모듈 - 레벨 1

W3C 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/WD-webxr-gamepads-module-1-20250707/
최신 게시 버전:
https://www.w3.org/TR/webxr-gamepads-module-1/
에디터 초안:
https://immersive-web.github.io/webxr-gamepads-module/
이전 버전:
히스토리:
https://www.w3.org/standards/history/webxr-gamepads-module-1/
피드백:
GitHub
에디터:
(Google)
(Google [Mozilla ~2020년까지])
(Meta)
이전 에디터:
(Amazon [Microsoft ~2018년까지])
참여하기:
이슈 제출 (오픈 이슈)
메일링 리스트 아카이브
W3C의 #immersive-web IRC

개요

이 명세 모듈은 웹에서 가상현실(VR) 및 증강현실(AR) 장치와 연관된 버튼, 트리거, 썸스틱, 터치패드 데이터 접근 지원을 설명합니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점에서의 상태를 설명합니다. 현재 W3C 출판 목록과 최신 개정 기술 보고서는 W3C 표준 및 초안 인덱스에서 확인할 수 있습니다.

Immersive Web 워킹 그룹은 그룹에서 아직 처리하지 않은 모든 버그 리포트 목록을 관리합니다. 이 초안은 아직 워킹 그룹 내에서 논의될 예정인 일부 보류 중인 이슈들을 강조합니다. 이러한 이슈들의 유효성을 포함한 결과에 대한 결정은 내려지지 않았습니다. 미해결 이슈에 대한 명세 텍스트가 제안된 풀 리퀘스트 제출을 적극 권장합니다.

이 문서는 Immersive Web 워킹 그룹에서 권고안 경로를 통해 워킹 드래프트로 발행되었습니다. 이 문서는 W3C 권고가 되는 것을 목표로 합니다.

워킹 드래프트로 공개된다고 해서 W3C 및 그 회원들의 지지를 의미하지는 않습니다. 이 문서는 초안이므로 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 이 문서는 진행 중인 작업 외의 공식 문서로 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 제작되었습니다. W3C는 그룹의 산출물과 관련하여 이루어진 공개 특허 공지 목록을 유지합니다. 해당 페이지에는 특허 공개 방법 안내도 포함되어 있습니다. 특정 특허에 대해 실제로 알고 있으며, 그 특허가 필수 클레임을 포함한다고 믿는 개인은 반드시 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받습니다.

이 WebXR 게임패드 모듈은 WebXR 디바이스 API에 추가로 구현되는 모듈로 설계되었으며, 원래 WebXR 디바이스 API에 포함되어 있다가 핵심과 모듈로 나뉘었습니다.

1. 소개

가상현실(VR) 및 증강현실(AR) 애플리케이션을 가능하게 하는 하드웨어가 이제 광범위하게 소비자에게 제공되어, 새로운 기회와 도전이 있는 몰입형 컴퓨팅 플랫폼을 제공합니다. 몰입형 하드웨어와 직접적으로 상호작용하는 기능은 웹이 이 환경에서 중요한 역할을 할 수 있도록 하는 데 필수적입니다. WebXR 게임패드 모듈은 WebXR 디바이스 API 및 게임패드 API에 인터페이스와 동작을 추가하여, 다양한 WebXR 호환 장치에서 입력 소스로 사용할 수 있는 버튼, 트리거, 썸스틱, 터치패드의 상태를 쿼리할 수 있도록 합니다.

이 모듈은 WebXR 디바이스 API에 대한 추가 기능입니다.

1.1. 용어정의

이 문서에서는 XR이라는 약어를 사용하여 가상현실, 증강현실 및 기타 관련 기술에 사용되는 하드웨어, 애플리케이션, 기법 전반을 지칭합니다. 예를 들면, 다음과 같습니다:

이들 사이의 중요한 공통점은 가상 콘텐츠의 보기를 시뮬레이션하기 위한 공간 추적 기능을 제공한다는 점입니다.

"XR 디바이스", "XR 애플리케이션" 등의 용어는 일반적으로 위에 언급된 모든 장치에 적용됩니다. 일부 장치에만 적용되는 문서의 부분에는 해당 여부가 명시됩니다.

XR 디바이스는 종종 버튼, 트리거, 썸스틱, 터치패드 입력으로 몰입형 경험과 상호작용할 수 있도록 추가 컨트롤러 하드웨어를 가지고 있습니다. 이러한 장치는 자주 공간 추적도 가능하며 "모션 컨트롤러", "핸드헬드 컨트롤러", "트래킹 컨트롤러"로 불립니다.

2. WebXR 디바이스 API 통합

WebXR 디바이스 API API에서 정의된 대로, XRInputSourceXR 입력 소스를 나타내며, 사용자가 뷰어와 동일한 가상 공간에서 타겟 동작을 수행할 수 있는 모든 입력 메커니즘을 의미합니다. 예시 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이어야 합니다:

2.2. XRSession

XRInputSource 는 연결 및 해제될 때 inputSources 배열에서 보고됩니다. gamepad의 존재가 inputSources 배열의 어떤 항목에서든 변경될 때, User Agent는 WebXR 디바이스 API의 입력 소스 속성 변경 처리 알고리즘을 호출해야 합니다.

프레임 업데이트 목록gamepad 프레임 업데이트 적용을 포함하도록 업데이트됩니다.

XRFrame frame에 대해 gamepad 프레임 업데이트 적용을 하려면, User Agent는 다음 단계를 수행해야 합니다:

  1. XRInputSourcegamepad gamepadframesession에 연결되어 있는 각 XRInputSource에 대해, 다음 단계를 수행합니다:

    1. gamepadframetime에서의 gamepad 데이터로 업데이트합니다.

참고: gamepad 객체는 "라이브"이며, 모든 내부 상태가 매 프레임 인플레이스 업데이트된다는 의미입니다. 또한, 어떤 프레임에서 XRInputSourcegamepad에 대한 참조를 저장하고 이후 프레임에서 동일한 XRInputSourcegamepad 와 비교하여 상태 변화를 테스트하는 것은 동작하지 않습니다. 두 객체는 동일한 객체이기 때문입니다. 따라서 프레임별로 입력 상태를 비교하려면, 개발자는 비교할 상태를 캐시해야 합니다.

3. 게임패드 API 통합

Gamepad 인스턴스는 XRInputSourcegamepad 속성에서 반환되며, 게임패드 API에서 설명된 대로 동작하되, 몇 가지 추가적인 동작 제한이 있습니다.

XRInputSource에 연결된 Gamepad는 활성 XR 세션이 없어도 사용자 에이전트의 선택으로 navigator.getGamepads()를 통해 노출될 수 있습니다. 이를 통해 사용자가 원하는 경우 XR 장치를 "일반" 게임패드로 사용할 수 있습니다.

참고: [WEBXR-HAND-INPUT-1]에 설명된 대로, 손 추적 XRInputSource에도 user agent가 허용하는 경우 gamepad 기반 콘텐츠와 연동될 수 있도록 Gamepad를 가질 수 있습니다.

게임패드 APIGamepad 데이터의 스냅샷은 navigator.getGamepads() 함수를 호출하여 가져올 수 있다고 명시합니다. 단, Gamepad 인스턴스가 XRInputSourcegamepad 속성에서 반환된 경우, navigator.getGamepads()에서 반환되는 배열에 포함되어서는 안 됩니다.

3.2. Gamepad

아래의 Gamepad 속성은 XRInputSourcegamepad 속성에서 반환된 경우 다음과 같은 동작 제약이 있어야 합니다.

3.3. "xr-standard" 게임패드 매핑

"xr-standard" 매핑은 게임패드 API에서 정의되며 이 명세에서 사용하도록 예약되어 있습니다. 이는 gamepad의 버튼과 축 레이아웃이 아래 표와 최대한 일치함을 의미합니다.

mapping"xr-standard"로 보고되기 위해서는, 장치는 targetRayMode"tracked-pointer"여야 하며, gripSpacenull이 아니어야 합니다. 최소 하나 이상의 기본 트리거가 있어야 하며, 이는 터치패드 또는 썸스틱과는 별개여야 합니다. 기본 트리거는 입력 소스의 기본 동작을 트리거해야 합니다. 장치는 기본 스퀴즈 버튼을 추가로 가질 수 있으며, 있는 경우에는 입력 소스의 기본 스퀴즈 동작을 트리거해야 합니다. 만약 장치가 "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" 매핑으로 어떻게 노출되는지 보여줍니다. 이미지는 특정 장치를 나타내려는 목적이 아니며 참조용으로만 사용됩니다. Simple 'xr-standard' controller and Advanced 'xr-standard' controller

4. 보안 및 프라이버시

WebXR 디바이스 API는 User Agent가 반드시 완화 조치를 취해야 할 여러 고유한 프라이버시, 보안 및 편안성 리스크와 함께 강력한 새로운 기능들을 제공합니다. 이 주제는 WebXR 디바이스 API에서 자세히 다루고 있습니다. 이 모듈은 추가적인 고려사항을 더하지만, WebXR 보안 및 프라이버시의 기본 원칙은 변경하지 않습니다.

4.1. 지문채취

API가 사용자에게 이용 가능한 하드웨어와 그 기능을 설명하기 때문에 지문채취 표면적이 필연적으로 추가됩니다. 이를 완전히 방지하는 것은 불가능하지만, User Agent는 문제를 완화하기 위한 조치를 취해야 합니다. WebXR 디바이스 API에서 정의된 바대로, XRInputSourceXRSession이 생성된 후에만 보고되며, 이는 노출될 민감한 정보에 대해 추가 보호가 필요함을 의미합니다. 또한, 이 모듈에서는 XRInputSourcegamepad.id이 문자열 식별자를 보고하지 않도록 요구합니다.

변경사항

2019년 10월 10일 첫 퍼블릭 워킹드래프트 이후 변경점

5. 감사의 글

다음 분들은 WebXR 디바이스 API 명세 설계에 기여하셨습니다:

그리고 이 모든 여정의 시작에 특별히 감사의 말씀을 전합니다: Vladimir Vukicevic (Unity)!

적합성

문서 관례

적합성 요구사항은 설명적 단언문과 RFC 2119 용어를 조합하여 표현된다. “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”과 같은 핵심 단어는 본 문서의 규범적 부분에서 RFC 2119에 명시된 대로 해석되어야 한다. 단, 가독성을 위해 본 명세에서는 이 단어들이 모두 대문자로 표기되지는 않는다.

명확히 비규범적인 부분, 예시 및 주석으로 표시된 섹션을 제외하고, 본 명세의 모든 텍스트는 규범적이다. [RFC2119]

본 명세의 예시는 “예를 들어”라는 표현으로 소개되거나, class="example"과 같이 규범적 텍스트와 구분되어 표시된다.

이것은 정보 제공용 예시다.

정보 제공용 주석은 “참고”라는 단어로 시작하며, class="note"와 같이 규범적 텍스트와 구분되어 표시된다.

참고, 이것은 정보 제공용 주석입니다.

적합 알고리즘

알고리즘의 일부로 명령형 어구("선두 공백 문자를 모두 제거하라" 혹은 "false를 반환하고 이 단계를 중단하라" 등)로 표현된 요구사항은 그 알고리즘에서 사용된 핵심 단어("must", "should", "may" 등)의 의미로 해석한다.

알고리즘이나 구체적 단계로 표현된 적합성 요구사항은 최종 결과가 동등한 한 어떤 방식으로든 구현될 수 있다. 특히 본 명세에서 정의한 알고리즘은 이해하기 쉽도록 설계된 것이며, 성능을 위해 설계된 것은 아니다. 구현자는 최적화를 권장한다.

색인

본 명세에서 정의한 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[GAMEPAD]
Steve Agoston; Matthew Reynolds. Gamepad. 2025년 6월 12일. WD. URL: https://www.w3.org/TR/gamepad/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. 2025년 4월 17일. CRD. URL: https://www.w3.org/TR/webxr/

정보성 참고 문헌

[WEBXR-HAND-INPUT-1]
Manish Goregaokar. WebXR Hand Input Module - Level 1. 2024년 6월 5일. WD. URL: https://www.w3.org/TR/webxr-hand-input-1/

IDL 색인

partial interface XRInputSource {
  [SameObject] readonly attribute Gamepad? gamepad;
};