WebXR 핸드 입력 모듈 - 레벨 1

W3C 워킹 드래프트,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2024/WD-webxr-hand-input-1-20240605/
최신 공개 버전:
https://www.w3.org/TR/webxr-hand-input-1/
에디터스 드래프트:
https://immersive-web.github.io/webxr-hand-input/
이전 버전:
히스토리:
https://www.w3.org/standards/history/webxr-hand-input-1/
피드백:
깃허브
스펙 내 인라인
에디터:
(구글 [2020년까지 모질라])
참여:
이슈 등록 (오픈 이슈)
메일링 리스트 아카이브
W3C의 #immersive-web IRC

요약

WebXR Hand Input 모듈은 WebXR Device API에 관절 손 자세 추적 기능을 확장합니다.

이 문서의 상태

이 섹션은 본 문서가 출판될 당시의 상태를 설명합니다. 현재 W3C 발행물 목록 및 이 기술 보고서의 최신 버전은 W3C 기술 보고서 색인 https://www.w3.org/TR/ 에서 확인할 수 있습니다.

Immersive Web Working Group은 그룹에서 아직 해결하지 않은 모든 버그 리포트 목록을 관리합니다. 이 초안은 워킹 그룹에서 논의해야 하는 미해결 이슈 중 일부를 강조합니다. 이러한 이슈의 결과(유효성 포함)에 대한 결정은 내려지지 않았습니다. 미해결 이슈에 대한 명세 제안 텍스트를 포함한 풀 리퀘스트를 적극 권장합니다.

이 문서는 Immersive Web Working Group에 의해 Recommendation 트랙을 사용하여 Working Draft로 발행되었습니다. 이 문서는 W3C 권고안이 되는 것을 목표로 하고 있습니다.

Working Draft로서의 발행은 W3C 및 그 회원사의 지지를 의미하지 않습니다. 이 문서는 초안으로, 언제든 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업으로서 본 문서를 인용하는 것은 바람직하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹 결과물과 관련하여 특허 공개 내역의 공개 목록을 관리합니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 특허에 필수 권리 청구가 포함되어 있다고 인지한 사람은 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

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

이 WebXR 증강현실 모듈은 WebXR Device API 외에도 구현되는 모듈로 설계되었으며, 원래는 WebXR Device API에 포함되어 있다가 코어와 모듈로 분리되었습니다.

1. 소개

일부 XR 장치에서는 손을 입력 소스로 사용할 때 사용자의 손에 대한 관절별 자세 정보를 완전히 얻을 수 있습니다。

이 API는 사용자의 손 각 골격 관절의 자세를 노출합니다。 이는 제스처 감지 또는 VR 시나리오에서 손 모델을 렌더링하는 데 사용할 수 있습니다。

2. 초기화

애플리케이션이 세션 동안 관절화된 손 자세 정보를 확인하려면, 세션은 적절한 기능 서술자로 요청되어야 합니다。 문자열 "hand-tracking"은 이 모듈에 의해 관절화된 손 추적을 위한 새로운 유효한 기능 서술자로 도입됩니다。

"hand-tracking" 기능 서술자는 해당 XRSessionXR 장치물리적 손 입력 소스를 가지고 있고 그것이 손 추적을 지원할 때에만 부여되어야 합니다。

사용자 에이전트는 이 기능 서술자에 기반하여 손 기반 XRInputSources에 대한 지원을 제한할 수 있습니다。

참고: 이는 XRSession가 "hand-tracking" 기능 서술자를 요청하지 않는 경우, 사용자 에이전트가 손 기반 입력 컨트롤러에 대한 지원을 하지 않기로 선택할 수 있음을 의미합니다。

3. 물리적 손 입력 소스

An XRInputSource is a physical hand input source if it tracks a physical hand. A physical hand input source supports hand tracking if it supports reporting the poses of one or more skeleton joints defined in this specification.

Physical hand input sources MUST include the input profile name of "generic-hand-select" in their profiles.

많은 물리적 손 입력 소스에서는 주요 동작에 사용되는 제스처와 스퀴즈 동작이 겹칠 수 있습니다。예를 들어, 핀치 제스처는 가까운 객체와 상호 작용할 때는 "select"를, 먼 객체와 상호 작용할 때는 "squeeze" 이벤트를 나타낼 수 있습니다。컨텐츠가 이들을 독립적인 이벤트로 가정할 수 있기 때문에, 사용자 에이전트는 스퀴즈 동작을 기본 스퀴즈 동작으로 노출하는 대신 추가적인 "grasp 버튼"으로 노출하고 "generic-hand-select-grasp" 프로필에서 파생된 입력 프로필을 사용할 수 있습니다。

3.1. XRInputSource

partial interface XRInputSource {
   [SameObject] readonly attribute XRHand? hand;
};

The hand attribute on a physical hand input source that supports hand tracking will be an XRHand object giving access to the underlying hand-tracking capabilities。 hand will have its input source set to this

If the XRInputSource belongs to an XRSession that has not been requested with the "hand-tracking" feature descriptor, hand MUST be null.

3.2. 골격 관절

물리적 손 입력 소스는 여러 개의 골격 관절로 구성됩니다。

골격 관절은 특정 손에 대해 골격 관절 이름으로 고유하게 식별할 수 있으며, 이는 XRHandJoint 타입의 열거형입니다。

골격 관절에는 그 이름을 따서 명명되고 그 -Z 축을 정렬하는 데 사용되는 연관 뼈(associated bone)이 있을 수 있습니다。연관 뼈는 손끝을 향해 이동할 때 관절 다음에 오는 뼈입니다。끝 관절과 손목 관절은 연관 뼈가 없습니다。

골격 관절에는 그 중심에 배치된 구의 반지름인 반지름이 있으며, 이는 손 양측의 피부에 대략적으로 닿도록 합니다。“끝(tip)” 관절은 끝부분과의 충돌이 작동하도록 적절한 0이 아닌 반지름을 가져야 합니다。구현체는 끝 관절이 0이 아닌 반지름을 가지도록 원점을 오프셋할 수 있습니다。

관절 목록은 다음의 골격 관절과 그 순서를 정의합니다:

골격 관절 골격 관절 이름 인덱스
손목 wrist 0
엄지 중수골 thumb-metacarpal 1
근위 지골 thumb-phalanx-proximal 2
원위 지골 thumb-phalanx-distal 3
thumb-tip 4
검지 중수골 index-finger-metacarpal 5
근위 지골 index-finger-phalanx-proximal 6
중간 지골 index-finger-phalanx-intermediate 7
원위 지골 index-finger-phalanx-distal 8
index-finger-tip 9
중지 중수골 middle-finger-metacarpal 10
근위 지골 middle-finger-phalanx-proximal 11
중간 지골 middle-finger-phalanx-intermediate 12
원위 지골 middle-finger-phalanx-distal 13
middle-finger-tip 14
약지 중수골 ring-finger-metacarpal 15
근위 지골 ring-finger-phalanx-proximal 16
중간 지골 ring-finger-phalanx-intermediate 17
원위 지골 ring-finger-phalanx-distal 18
ring-finger-tip 19
새끼손가락 중수골 pinky-finger-metacarpal 20
근위 지골 pinky-finger-phalanx-proximal 21
중간 지골 pinky-finger-phalanx-intermediate 22
원위 지골 pinky-finger-phalanx-distal 23
pinky-finger-tip 24

관절 배치를 보여주는 시각적 도움

3.3. XRHand

enum XRHandJoint {
  "wrist",

  "thumb-metacarpal",
  "thumb-phalanx-proximal",
  "thumb-phalanx-distal",
  "thumb-tip",

  "index-finger-metacarpal",
  "index-finger-phalanx-proximal",
  "index-finger-phalanx-intermediate",
  "index-finger-phalanx-distal",
  "index-finger-tip",

  "middle-finger-metacarpal",
  "middle-finger-phalanx-proximal",
  "middle-finger-phalanx-intermediate",
  "middle-finger-phalanx-distal",
  "middle-finger-tip",

  "ring-finger-metacarpal",
  "ring-finger-phalanx-proximal",
  "ring-finger-phalanx-intermediate",
  "ring-finger-phalanx-distal",
  "ring-finger-tip",

  "pinky-finger-metacarpal",
  "pinky-finger-phalanx-proximal",
  "pinky-finger-phalanx-intermediate",
  "pinky-finger-phalanx-distal",
  "pinky-finger-tip"
};

[Exposed=Window]
interface XRHand {
    iterable<XRHandJoint, XRJointSpace>;

    readonly attribute unsigned long size;
    XRJointSpace get(XRHandJoint key);
};

The XRHandJoint enum defines the various joints that each XRHand MUST contain。

모든 XRHand에는 그것이 추적하는 입력 소스가 연결되어 있습니다。

참고: handedness 속성은 XRInputSource가 어떤 손과 연결되어 있는지를 설명합니다(있는 경우)。

XRHand 객체는 [[joints]] 내부 슬롯을 가지며, 이는 키가 XRHandJoint 타입이고 값이 XRJointSpace 타입인 쌍들의 정렬된 맵입니다。

내부 슬롯 [[joints]]의 순서는 관절 목록에 의해 주어집니다。

[[joints]]는 세션 동안 변경되어서는 안 됩니다。

반복할 값 쌍XRHand 객체에 대해 키가 XRHandJoint이고 값이 해당 XRJointSpace값 쌍들의 목록이며, 그 순서는 관절 목록에 따릅니다。

개별 장치가 이 명세서에 정의된 관절을 지원하지 않는 경우에도, 그것을 에뮬레이트해야 합니다。

The size attribute MUST return the number 25

get(jointName) 메서드는 XRHandthis에서 호출될 때 다음 단계를 실행해야 합니다:
  1. jointsthis[[joints]] 내부 슬롯의 값으로 둡니다。

  2. joints[jointName]를 반환합니다。(알 수 없는 jointName의 경우 undefined를 반환함을 의미합니다。)

3.4. XRJointSpace

[Exposed=Window]
interface XRJointSpace: XRSpace {
  readonly attribute XRHandJoint jointName;
};

XRJointSpace네이티브 원점은 해당 관절의 위치 및 방향이다.

XRJointSpace네이티브 원점은 동일 의 모든 XRJointSpace네이티브 원점이 보고되는 경우에만 보고될 수 있다. 손이 부분적으로 가려질 때는, UA는 가려진 관절을 에뮬레이션하거나 모든 관절에 null 포즈를 리포트해야 한다.

참고: 포즈를 얻을 때 손 전체를 얻거나 아무것도 얻지 못하게 됨을 의미한다.

이로 인해 다지/소지 손을 충실히 표현할 수 없으나, 핑거프린팅 우려로 인해 별도 opt-in이 필요할 수 있다. 더 자세한 사항은 Issue 11 참조.

네이티브 원점-Y 방향은 손바닥에서 바깥쪽 피부에 수직, -Z 방향은 손목에서 손 끝 방향 뼈를 따라가야 한다.

끝(tip) 골격 관절의 경우 연관 뼈가 없으므로, -Z 방향은 연결된 원위(distal) 관절과 같아야 한다. 즉, 직전 뼈 방향과 같다. 손목 골격 관절-Z 방향은 손바닥 중심을 향해야 한다.

모든 XRJointSpace는 자신을 생성한 XRHand와 연결된 hand를 가진다.

jointName은 추적하는 관절의 이름을 반환한다.

모든 XRJointSpace는 대응되는 골격 관절과 연결된 joint를 가진다. 이 joint는 jointName에 해당하는 골격 관절이다.

4. 프레임 루프

4.1. XR프레임(XRFrame)

partial interface XRFrame {
    XRJointPose? getJointPose(XRJointSpace joint, XRSpace baseSpace);
    boolean fillJointRadii(sequence<XRJointSpace> jointSpaces, Float32Array radii);

    boolean fillPoses(sequence<XRSpace> spaces, XRSpace baseSpace, Float32Array transforms);
};

getJointPose(XRJointSpace joint, XRSpace baseSpace) 메서드는 해당 jointbaseSpace에 대한 포즈를 XRJointPose로 반환하며, XRFrame시간을 기준으로 한다.

이 메서드가 호출될 때, UA는 다음을 실행해야 한다:

  1. framethis로 한다.

  2. sessionframesession 객체로 한다.

  3. frameactivefalseInvalidStateError 발생 후 종료한다.

  4. baseSpacejointsessionthis session과 다르면 InvalidStateError 발생 후 종료한다.

  5. posesessionrelevant realm새로운 XRJointPose 객체로 생성한다.

  6. frame이 나타내는 시점에서 jointbaseSpace에서의 포즈 초기화pose에 force emulation=false로 해서 채운다.

  7. posenull이면 null을 리턴한다.

  8. poseradiusjoint반지름 값으로 하며 필요시 에뮬레이션한다.

  9. pose를 반환한다.

fillJointRadii(sequence<XRJointSpace> jointSpaces, Float32Array radii) 메서드는 jointSpaces에 해당하는 radii에 반지름 값을 쓰며, 모든 공간이 유효한 포즈를 갖는지 boolean으로 반환한다.

이 메서드가 XRFrame frame에서 호출될 때 UA는 다음을 반드시 수행해야 한다:

  1. framethis로 한다.

  2. sessionframesession 객체로 한다.

  3. frameactivefalseInvalidStateError 발생 후 종료.

  4. jointSpaces 내 각 joint에 대해:

    1. jointsessionsession과 다르면 InvalidStateError 발생 후 종료.

  5. jointSpaces 길이가 radii의 요소 개수보다 크면 TypeError 발생 후 종료.

  6. offset0으로 하는 새 숫자 변수로 둔다.

  7. allValidtrue로 한다.

  8. jointSpaces 내 모든 joint에 대해:

    1. offsetradii 값을 다음과 같이 설정함:

      UA가 jointhand의 모든 관절 포즈를 얻을 수 있으면:
      offsetradii에 해당 반지름을 설정.
      아니면
      offsetradiiNaN을 설정.
      allValidfalse를 대입.
    2. offset1 증가.

  9. allValid을 반환.

참고: UA가 동일 XRHand에 속한 공간 중 어느 하나도 포즈 결정을 못하면, 그 XRHand의 모든 공간은 포즈를 못 가져야 한다.

fillPoses(sequence<XRSpace> spaces, XRSpace baseSpace, Float32Array transforms) 메서드는 spaces 각각의 baseSpace 기준 포즈 행렬을 transforms에 채우고, 모든 공간이 유효한 포즈를 가지는지 boolean으로 반환한다.

이 메서드가 XRFrame frame에서 호출되면, UA는 다음을 수행해야 한다:

  1. framethis로 한다.

  2. sessionframesession 객체로 한다.

  3. frameactivefalseInvalidStateError 발생 후 종료.

  4. spaces 시퀀스 내 각 space에 대해:

    1. spacesessionsession과 다르면 InvalidStateError 발생 후 종료.

  5. baseSpacesessionsession과 다르면 InvalidStateError 발생 후 종료.

  6. spaces 길이 * 16transforms의 요소 개수보다 크면 TypeError 발생 후 종료.

  7. offset0으로 하는 새 숫자 변수로 둠.

  8. pose를 다음 기준으로 초기화:

    fillPoses()가 이전에 호출된 적 있으면 UA가 객체 재사용 허용
    pose는 앞서 호출에 사용된 객체 동일하게 둔다.
    아니면
    posesessionrelevant realm새로운 XRPose 객체로 생성.
  9. allValidtrue로 한다.

  10. spaces 내 각 space에 대해:

    1. frame이 나타내는 시점에서 spacebaseSpace 기준 포즈 초기화pose에 채운다.

    2. posenull이면 아래 실행:

    3. offset부터 16개의 transforms 요소를 NaN으로 설정.

    4. allValidfalse로 한다.

    5. posenull 아니면 posematrix 멤버 요소 전체를 offset부터 transforms에 복사한다.

    6. offset16 증가.

  11. allValid을 반환.

참고: 동일 XRHand 소속 공간 중 어떤 것이든 포즈 초기화null을 반환하면, 해당 XRHand의 모든 공간이 포즈 초기화null을 반환해야 한다.

4.2. XR관절포즈(XRJointPose)

XRJointPoseXRPose이며, 표현하는 골격 관절의 크기 추가 정보를 가진다.

[Exposed=Window]
interface XRJointPose: XRPose {
    readonly attribute float radius;
};

radius 속성은 해당 골격 관절의 반지름을 미터 단위로 반환한다.

UA는 XR 장치가 이 값을 일반적으로, 또는 현재 애니메이션 프레임에서(예: 해당 골격 관절이 일부 가려짐) 판별이 불가할 때 radius를 반드시 에뮬레이션 값으로 설정해야 한다.

5. 프라이버시 및 보안 고려사항

WebXR Hand Input API는 중요한 프라이버시 리스크를 수반하는 강력한 기능이다.

이 기능이 새로운 센서 데이터를 반환하므로, UA는 세션 생성 시점에 반드시 사용자에게 명시적 동의를 구해야 한다.

이 API로부터 반환되는 데이터는 개인을 식별할 수 있을 정도로 구체적이어서는 안 된다. 하드웨어가 너무 정밀한 데이터를 리턴할 경우, UA는 WebXR Hand Input API를 통해 이 데이터를 노출하기 전 반드시 익명화해야 한다.

이 API는 "immersive-vr" 또는 "immersive-ar" XRSessionMode로 생성된 XRSession에서만 지원되어야 한다. "inline" 세션은 이 API를 지원해서는 안 된다.

손 데이터의 익명화를 위해 UA는 아래 지침을 따를 수 있다:

변경 사항

2020년 10월 22일 첫 공개 워킹드래프트에서의 변경 사항

적합성

문서 규약

적합성 요구사항은 서술적 단언과 RFC 2119 용어의 조합으로 표현됩니다. 본 문서의 규범적 부분에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"과 같은 주요 키워드는 RFC 2119에 서술된 대로 해석되어야 합니다. 단, 가독성을 위해, 이 명세서에서는 이러한 용어가 모두 대문자로 표기되어 있지 않습니다.

이 명세서의 모든 본문은 명시적으로 비규범적(non-normative)으로 표시된 섹션, 예시, 주석을 제외하면 모두 규범적입니다. [RFC2119]

이 명세서의 예시는 “예를 들어(for example)”라는 단어와 함께 소개되거나, class="example"로 구분되어 규범적 본문과 분리됩니다. 예:

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

정보성 노트(Informative note)는 “참고(Note)”라는 단어로 시작하며, class="note"로 규범적 본문과 구분됩니다. 예:

참고, 이것은 정보 제공용 노트입니다.

적합한 알고리즘

알고리즘에서 명령문 형태로 표현된 요구사항(예: "선행 공백 문자를 모두 제거한다" 또는 "false를 반환하고 단계를 중단한다")은 도입부에서 사용된 핵심 용어("must", "should", "may" 등)의 의미로 해석되어야 합니다.

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

색인

이 명세서에서 정의하는 용어

외부 명세에서 정의된 용어

참고 문헌

규범적 참고문헌

[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SERVICE-WORKERS]
Jake Archibald; Marijn Kruisselbrink. Service Workers. 12 July 2022. CR. URL: https://www.w3.org/TR/service-workers/
[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. 16 April 2024. CR. URL: https://www.w3.org/TR/webxr/
[WEBXR-AR-MODULE-1]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Augmented Reality Module - Level 1. 2 November 2022. CR. URL: https://www.w3.org/TR/webxr-ar-module-1/

IDL 색인

partial interface XRInputSource {
   [SameObject] readonly attribute XRHand? hand;
};

enum XRHandJoint {
  "wrist",

  "thumb-metacarpal",
  "thumb-phalanx-proximal",
  "thumb-phalanx-distal",
  "thumb-tip",

  "index-finger-metacarpal",
  "index-finger-phalanx-proximal",
  "index-finger-phalanx-intermediate",
  "index-finger-phalanx-distal",
  "index-finger-tip",

  "middle-finger-metacarpal",
  "middle-finger-phalanx-proximal",
  "middle-finger-phalanx-intermediate",
  "middle-finger-phalanx-distal",
  "middle-finger-tip",

  "ring-finger-metacarpal",
  "ring-finger-phalanx-proximal",
  "ring-finger-phalanx-intermediate",
  "ring-finger-phalanx-distal",
  "ring-finger-tip",

  "pinky-finger-metacarpal",
  "pinky-finger-phalanx-proximal",
  "pinky-finger-phalanx-intermediate",
  "pinky-finger-phalanx-distal",
  "pinky-finger-tip"
};

[Exposed=Window]
interface XRHand {
    iterable<XRHandJoint, XRJointSpace>;

    readonly attribute unsigned long size;
    XRJointSpace get(XRHandJoint key);
};

[Exposed=Window]
interface XRJointSpace: XRSpace {
  readonly attribute XRHandJoint jointName;
};

partial interface XRFrame {
    XRJointPose? getJointPose(XRJointSpace joint, XRSpace baseSpace);
    boolean fillJointRadii(sequence<XRJointSpace> jointSpaces, Float32Array radii);

    boolean fillPoses(sequence<XRSpace> spaces, XRSpace baseSpace, Float32Array transforms);
};

[Exposed=Window]
interface XRJointPose: XRPose {
    readonly attribute float radius;
};

이슈 색인

이로 인해 기본적으로 다지증/소지증 손을 충실히 노출하는 것이 불가능하지만, 지문 추적 우려로 인해 별도의 opt-in이 필요할 수 있습니다. 자세한 내용은 이슈 11을 참고하세요.
MDN

XRFrame/fillJointRadii

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRFrame/fillPoses

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRFrame/getJointPose

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRHand

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

XRJointSpace

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRInputSource/hand

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRJointPose/radius

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRJointPose

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XRJointSpace/jointName

In no current engines.

FirefoxNoneSafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?