WebXR 메시 감지 모듈

커뮤니티 그룹 보고서 초안,

이 문서에 대한 자세한 정보
이 버전:
https://github.com/immersive-web/real-world-meshing/
이슈 추적:
GitHub
편집자:
(Meta)
참여:
이슈 제출 (열린 이슈)
메일링 리스트 보관소
W3C의 #immersive-web IRC

초록

이 문서의 상태

1. 소개

2. 초기화

2.1. 기능 설명자

애플리케이션이 세션 중 메시 감지를 사용하는 데 관심이 있음을 알리려면, 적절한 기능 설명자를 사용하여 세션을 요청해야 한다. 문자열 mesh-detection은 이 모듈에서 메시 감지 기능을 위한 새로운 유효한 기능 설명자로 도입된다.

기기의 추적 시스템이 네이티브 메시 감지 기능을 노출하는 경우, 기기는 메시 감지 기능을 지원할 수 있다. 인라인 XR 기기는 메시 감지 기능을 지원할 수 있는 것으로 간주해서는 안 된다.

메시 감지 기능이 활성화된 상태로 세션이 생성되면, 메시 업데이트 알고리즘을 해당 세션의 프레임 업데이트 목록에 추가해야 한다.

다음 코드는 메시 감지가 필요한 세션을 요청하는 방법을 보여 준다:
const session = await navigator.xr.requestSession("immersive-ar", {
  requiredFeatures: ["mesh-detection"]
});

3. 메시

3.1. XRMesh

[Exposed=Window] interface XRMesh {
    [SameObject] readonly attribute XRSpace meshSpace;

    readonly attribute Float32Array vertices;
    readonly attribute Uint32Array indices;
    readonly attribute DOMHighResTimeStamp lastChangedTime;
    readonly attribute DOMString? semanticLabel;
};

XRMesh는 기반 XR 시스템이 감지한 3D 기하 도형의 단일 인스턴스를 나타낸다.

meshSpace는 메시의 좌표계를 설정하는 XRSpace이다. meshSpace네이티브 원점은 메시의 중심을 추적한다. 기반 XR 시스템은 메시 중심의 정확한 의미를 정의한다. meshSpace가 정의하는 좌표계의 Y축은 메시의 법선 벡터를 나타내야 한다.

XRMesh에는 연관된 네이티브 엔터티가 있다.

XRMesh에는 연관된 프레임이 있다.

vertices는 메시의 형태를 설명하는 정점 배열이다. 정점은 meshSpace가 정의하는 좌표계로 표현된다.

indices는 메시의 각 정점 색인을 설명하는 색인 배열이다.

lastChangedTime은 메시 속성 중 일부가 마지막으로 변경된 시간이다.

참고: 메시의 자세는 메시 속성으로 간주되지 않으므로 메시 자세를 업데이트해도 lastChangedTime이 변경되지 않는다. 이는 메시 자세가 서로 다른 두 엔터티인 meshSpaceXRSpace로부터 파생되는 속성이며, 이 자세는 getPose() 함수를 통해 해당 XRSpace를 기준으로 계산되기 때문이다.

4. 감지된 메시 가져오기

4.1. XRMeshSet

[Exposed=Window] interface XRMeshSet {
  readonly setlike<XRMesh>;
};

XRMeshSetXRMesh의 모음이다. 이는 XRFrame에서 감지된 메시 모음을 가져오는 기본 메커니즘이다.

partial interface XRFrame {
  readonly attribute XRMeshSet detectedMeshes;
};

XRFrame은 프레임에서 여전히 추적 중인 모든 메시를 포함하는 detectedMeshes 속성을 포함하도록 확장된다. 집합은 처음에는 비어 있으며 메시 업데이트 알고리즘으로 채워진다. 프레임이 활성 상태가 아닐 때 이 속성에 접근하면 사용자 에이전트는 InvalidStateError를 발생시켜야 한다.

XRSession도 연관된 추적 중인 메시 집합을 포함하도록 확장되며, 이 집합은 처음에는 비어 있다. 집합의 요소는 XRMesh 유형이다.

frame에 대한 메시를 업데이트하기 위해 사용자 에이전트는 다음 단계를 실행해야 한다:
  1. sessionframe세션으로 둔다.

  2. devicesessionXR 기기로 둔다.

  3. trackedMeshsframe시간에 추적 중인 메시를 가져오기 위해 device네이티브 메시 감지 기능을 호출한 결과로 둔다.

  4. trackedMeshs의 각 native mesh에 대해 다음을 실행한다:

    1. 필요한 경우 native meshtrackedMeshs에 존재하지 않는 것처럼 처리하고 다음 항목으로 계속한다. 이러한 방식으로 항목을 무시할지 결정하는 데 사용할 수 있는 기준은 § 6 개인정보 보호 및 보안 고려사항을 참조한다.

    2. session추적 중인 메시 집합native mesh대응하는 객체 mesh가 포함되어 있으면, mesh, native mesh, frame을 사용하여 메시 객체 업데이트 알고리즘을 호출하고 다음 항목으로 계속한다.

    3. meshnative meshframe을 사용하여 메시 객체 생성 알고리즘을 호출한 결과로 둔다.

    4. meshsession추적 중인 메시 집합에 추가한다.

  5. 이 알고리즘을 호출하는 동안 생성되거나 업데이트되지 않은 session추적 중인 메시 집합의 각 객체를 제거한다.

  6. framedetectedMeshes추적 중인 메시 집합으로 설정한다.

네이티브 메시 객체 native meshXRFrame frame으로부터 메시 객체를 생성하기 위해 사용자 에이전트는 다음 단계를 실행해야 한다:
  1. resultXRMesh의 새로운 인스턴스로 둔다.

  2. result네이티브 엔터티native mesh로 설정한다.

  3. resultmeshSpace세션framesession으로 설정되고 네이티브 원점native mesh의 네이티브 원점을 추적하도록 설정되어 생성된 새로운 XRSpace 객체로 설정한다.

  4. result, native mesh, frame을 사용하여 메시 객체 업데이트 알고리즘을 호출한다.

  5. result를 반환한다.

이러한 방식으로 생성된 메시 객체 result는 전달된 네이티브 메시 객체 native mesh대응한다고 한다.

네이티브 메시 객체 native meshXRFrame frame으로부터 메시 객체 mesh업데이트하기 위해 사용자 에이전트는 다음 단계를 실행해야 한다:
  1. mesh프레임frame으로 설정한다.

  2. meshverticesnative mesh의 정점을 나타내는 새로운 정점 배열로 설정하고, 네이티브 메시 표현의 차이를 처리하는 데 필요한 모든 변환을 수행한다.

  3. meshindicesnative mesh의 정점을 나타내는 새로운 색인 배열로 설정하고, 네이티브 메시 표현의 차이를 처리하는 데 필요한 모든 변환을 수행한다.

  4. 필요한 경우 § 6 개인정보 보호 및 보안 고려사항에 설명된 대로 meshverticesindices의 세부 수준을 낮춘다.

  5. meshlastChangedTime시간으로 설정한다.

5. 네이티브 기기 개념

5.1. 네이티브 메시 감지

메시 감지 API는 사용자 환경에서 감지된 3D 표면에 관한 정보를 제공한다. 이 명세에서는 사용자 에이전트가 메시 감지 기능을 구현하기 위해 기반 플랫폼에서 제공하는 네이티브 메시 감지 기능에 의존할 수 있다고 가정한다. 구체적으로, 기반 XR 기기는 특정 XRFrame시간에 대응하는 시점에 추적 중인 모든 메시를 질의하는 방법을 제공해야 한다.

또한 네이티브 메시 객체라고 하는 추적 중인 메시가 프레임 간에 정체성을 유지한다고 가정한다. 즉, 기반 시스템이 시간 t0에 반환한 메시 객체 P와 시간 t1에 반환한 메시 객체 Q가 주어졌을 때, 사용자 에이전트는 PQ가 동일한 논리적 메시 객체에 대응하는지 기반 시스템에 질의할 수 있다. 기반 시스템은 시간 t에서 자세의 위치를 질의하는 데 사용할 수 있는 네이티브 원점도 제공해야 하지만, 메시 자세가 항상 알려진다고 보장되지는 않는다 (예를 들어 여전히 추적 중이지만 특정 시점에 위치를 확인할 수 없는 메시의 경우). 또한 네이티브 메시 객체는 감지된 메시의 대략적인 형태를 설명하는 다각형을 노출해야 한다.

또한 기반 시스템은 XRAnchor 생성을 위해 네이티브 메시를 네이티브 엔터티로 인식해야 한다. 자세한 내용은 WebXR 앵커 모듈 § native-anchor 절을 참조한다.

6. 개인정보 보호 및 보안 고려사항

메시 감지 API는 사용자의 물리적 환경에 관한 정보를 노출한다. 사용자 에이전트가 선택하는 경우 노출되는 메시 정보 (예: 메시의 다각형)를 제한할 수 있다. 사용자 에이전트가 노출되는 정보를 줄일 수 있는 몇 가지 방법은 다음과 같다: 메시 객체 업데이트 알고리즘에서 메시 다각형의 세부 수준을 낮추는 방법 (예를 들어 정점 수를 줄이거나 정점의 좌표를 반올림 / 양자화하는 방법), 또는 메시 업데이트 알고리즘의 trackedMeshs 모음에 메시 객체가 존재하지 않는 것처럼 동작하여 메시를 완전히 제거하는 방법(예를 들어 감지된 메시가 노출하기에는 너무 작거나 너무 상세하다고 판단되고 메시에서 노출되는 세부 정보를 줄이는 메커니즘을 사용자 에이전트가 구현하지 않은 경우 이 방법을 사용할 수 있다). 메시의 자세 (meshSpace에서 가져올 수 있음)도 양자화할 수 있다.

메시 감지 API의 개념은 [webxr-anchors-module] 명세에서 노출하는 메서드에 사용될 수 있으므로, WebXR 앵커 모듈과 관련된 개인정보 보호 및 보안 고려사항 중 일부도 여기에 적용된다. 자세한 내용은 WebXR 앵커 모듈 § privacy-security 절을 참조한다.

메시 감지 API가 WebXR 기기 API를 확장하는 방식으로 인해, WebXR 기기 API § 13. 보안, 개인정보 보호 및 편의성 고려사항 절도 WebXR 메시 감지 모듈에서 노출하는 기능에 적용된다.

7. 감사의 말

다음 사람들은 WebXR 메시 감지 명세의 설계에 기여했다:

적합성

문서 규칙

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

명시적으로 비규범적이라고 표시된 절, 예제 및 참고를 제외하고 이 명세의 모든 텍스트는 규범적이다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 문구로 시작하거나 다음과 같이 class="example"을 사용하여 규범적 텍스트와 구분한다:

이것은 정보 제공용 예제의 한 예이다.

정보 제공용 참고는 “참고”라는 단어로 시작하며 다음과 같이 class="note"를 사용하여 규범적 텍스트와 구분한다:

참고: 이것은 정보 제공용 참고이다.

색인

이 명세에서 정의하는 용어

참조로 정의된 용어

참고문헌

규범적 참고문헌

[HR-TIME-3]
Yoav Weiss. 고해상도 시간. URL: https://w3c.github.io/hr-time/
[RFC2119]
S. Bradner. 요구사항 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어. 1997년 3월. 현행 모범 사례. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR 기기 API. URL: https://immersive-web.github.io/webxr/

정보 제공용 참고문헌

[WEBXR-ANCHORS-MODULE]
Piotr Bialecki. WebXR 앵커 모듈. 보고서 초안. URL: https://immersive-web.github.io/anchors/

IDL 색인

[Exposed=Window] interface XRMesh {
    [SameObject] readonly attribute XRSpace meshSpace;

    readonly attribute Float32Array vertices;
    readonly attribute Uint32Array indices;
    readonly attribute DOMHighResTimeStamp lastChangedTime;
    readonly attribute DOMString? semanticLabel;
};

[Exposed=Window] interface XRMeshSet {
  readonly setlike<XRMesh>;
};

partial interface XRFrame {
  readonly attribute XRMeshSet detectedMeshes;
};