WebXR 원시 카메라 접근 모듈

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

이 문서에 대한 자세한 정보
이 버전:
https://immersive-web.github.io/raw-camera-access/
이슈 추적:
GitHub
사양 내 인라인
편집자:
(Google)
이전 편집자:
(Google)
참여:
이슈 제출 (열려 있는 이슈)
메일링 리스트 아카이브
W3C의 #immersive-web IRC
해설서:
GitHub의 explainer.md

초록

이 사양은 기기가 해당 카메라 이미지 렌더링을 담당하는 경우, immerisve-ar 세션 뒤에 표시되는 원시 카메라 이미지에 접근하는 수단을 제공한다.

이 문서의 상태

1. 소개

이 사양은 새로운 WebXR Device API 기능, 즉 Raw Camera Access API를 도입한다. 새로 도입된 API는 WebXR 기반 애플리케이션이 카메라 이미지 픽셀에 접근할 수 있게 하여, 이 새로운 정보를 활용해 프레임별 사용자 정의 시각 효과를 계산하거나, 카메라 이미지가 겹쳐진 앱 렌더링 콘텐츠의 스냅샷을 찍을 수 있게 한다.

참고: 이 문서에서 지정한 API 형태는 주로 스마트폰 중심 시나리오를 해결한다. 맥락은 이슈 #2를 보라.

1.1. 용어

이 문서는 AR이라는 약어를 증강 현실을 의미하는 데 사용하고, VR을 가상 현실을 의미하는 데 사용한다.

2. 초기화

2.1. 기능 기술자

애플리케이션은 적절한 기능 기술자를 전달하여 XRSession에서 원시 카메라 접근이 활성화되도록 요청할 수 있다. 이 모듈은 원시 카메라 접근 기능을 위한 새로운 유효한 기능 기술자로 새 문자열 - camera-access를 도입한다.

기기가 네이티브 카메라 기능을 노출하는 경우, 그 기기는 원시 카메라 접근 기능을 지원 가능하다. 인라인 XR 기기는 원시 카메라 접근 기능을 지원 가능한 것으로 취급해서는 안 된다.

원시 카메라 접근 기능은 권한 정책의 적용을 받으며, 요청 문서의 출처에서 "xr-spatial-tracking" 정책이 허용되어야 한다. 또한 요청 문서의 출처에서 "camera" 권한 정책이 허용되어야 한다.

다음 코드는 원시 카메라 접근 API가 필요한 세션을 요청하는 방법을 보여준다:
const session = await navigator.xr.requestSession("immersive-ar", {
  requiredFeatures: ["camera-access"],
});

3. 카메라 텍스처 접근

3.1. XRView

partial interface XRView {
  [SameObject] readonly attribute XRCamera? camera;
};

XRView는 이 뷰와 관련된 카메라 이미지에 대한 정보를 포함하는 XRCamera 인스턴스를 참조하는 camera 속성을 포함하도록 확장된다. 주어진 XRView 인스턴스에서 camera 속성에 처음 접근할 때, 사용자 에이전트는 카메라 획득 알고리즘을 실행해야 한다. 동일한 XRView 인스턴스에서 이후에 접근하면, 반환된 것이 있으면 동일한 XRCamera 인스턴스가 결과가 되어야 하며, 그렇지 않으면 null이 결과가 되어야 한다.

XRView view에 대해 카메라를 획득하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. sessionviewsession으로 둔다.

  2. camera-access 기능 기술자가 sessionset of granted features포함되어 있지 않으면, null을 반환하고 이 단계를 중단한다.

  3. frameviewframe으로 둔다.

  4. frameactive 불리언이 false이면, InvalidStateError던지고 이 단계를 중단한다.

  5. frameanimationFrame 불리언이 false이면, InvalidStateError던지고 이 단계를 중단한다.

  6. camera imageframetime에 유효한 네이티브 카메라에서 반환된, width x height 텍셀 크기의 카메라 이미지 버퍼를 포함하는 것으로 둔다.

  7. camera imagenull이면, null을 반환하고 이 단계를 중단한다.

  8. camera imageview정렬된 데이터를 포함하도록 보장한다. 여기에는 적절하게 widthheight를 조정하는 것도 포함된다. 가능하지 않으면, null을 반환하고 이 단계를 중단한다.

  9. view, camera image, widthheight카메라 인스턴스 생성 알고리즘을 호출하고 그 결과를 반환한다.

3.2. XRCamera

[SecureContext, Exposed=Window]
interface XRCamera {
  readonly attribute unsigned long width;
  readonly attribute unsigned long height;
};

XRCamera 인터페이스는 XRWebGLBinding에서 얻을 수 있는 카메라 텍스처에 대한 정보를 노출하는 방법으로 도입된다.

XRCameracamera image의 너비(텍셀 단위)를 포함하는 width 속성을 포함한다.

XRCameracamera image의 높이(텍셀 단위)를 포함하는 height 속성을 포함한다.

XRCamera에는 XRCamera 인스턴스가 반환된 XRView를 포함하는 연관된 view 인스턴스가 있다.

XRCamera에는 연관된 camera image 데이터 버퍼가 있다.

XRView view, camera image, widthheight로부터 카메라 인스턴스 생성을 하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
  1. resultXRCamera 인터페이스의 새 인스턴스로 둔다.

  2. resultviewview로 설정한다.

  3. resultcamera imagecamera image로 설정한다.

  4. resultwidthwidth로 설정한다.

  5. resultheightheight로 설정한다.

  6. result를 반환한다.

3.3. XRWebGLBinding

partial interface XRWebGLBinding {
  WebGLTexture? getCameraImage(XRCamera camera);
};

getCameraImage(camera) 메서드는 호출될 때 XRWebGLBinding에서 카메라 이미지 획득을 하는 데 사용할 수 있다. 반환된 WebGLTexturenull이 아니면, 이는 불투명 텍스처다.

XRWebGLBinding binding에서, XRCamera camera에 대해 카메라 이미지 획득을 하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
  1. sessionbindingsession으로 둔다.

  2. viewcameraview로 둔다.

  3. viewsessionsession과 일치하지 않으면, InvalidStateError던지고 이 단계를 중단한다.

  4. frameviewframe으로 둔다.

  5. frameactive 불리언이 false이면, InvalidStateError던지고 이 단계를 중단한다.

  6. frameanimationFrame 불리언이 false이면, InvalidStateError던지고 이 단계를 중단한다.

  7. contextbindingcontext로 둔다.

  8. camera imagecameracamera image로 둔다.

  9. resultcontext에서 생성된, camera image의 데이터를 포함하는 WebGLTexture로 둔다. result불투명 텍스처다.

  10. result를 반환한다.

사용자 에이전트는 호출 결과가 바인딩과 카메라 인스턴스를 키로 하는 캐시에 저장된다고 가정하여, getCameraImage(camera) 호출 결과를 캐시하고 이후 메서드 호출에 대해 반환할 수 있다. 사용자 에이전트는 캐시를 사용할 때에도 카메라 이미지 획득 알고리즘의 6단계까지(포함) 실행하여 초기 검증을 수행해야 한다. 이러한 캐싱이 허용되므로, 애플리케이션은 반환된 WebGLTexture를 읽기 전용으로 취급해야 한다.

참고: 캐싱이 허용되는 이유는 사용자 에이전트가 반환된 WebGLTexture의 수명에 대한 소유권을 유지하기 때문이며(이는 불투명 텍스처로 간주되기 때문이다), 또한 동일한 requestAnimationFrame() 콜백 내에서 이 메서드를 여러 번 호출하면 (XRCamera를 사용함으로써 보장되며, 따라서 XRFrame도 캐시 키의 일부로 전이적으로 보장된다), 동일한 바인딩에서(XRWebGLBinding를 캐시 키의 일부로 사용함으로써 보장된다), 동일한 내용을 가진 텍스처가 결과가 되기 때문이다.

WebGLTexturegetCameraImage(camera) 호출에서 반환되고 투명성을 지원하는 경우, 이는 미리 곱해진 알파가 적용된 색을 포함해야 한다.

반환되는 WebGLTexture에 대한 더 많은 정보를 지정해야 하는가? 예: color-renderable인지, 텍스처 형식은 무엇인지 등.

4. 네이티브 기기 개념

4.1. 네이티브 카메라

Raw camera API 사양은 API가 구현되는 기반이 되는 네이티브 기기가 카메라 이미지에 대한 애니메이션 프레임 동기화 접근을 제공하는 방법을 제공한다고 가정한다. 이러한 기기는 네이티브 카메라 기능을 지원한다고 한다.

기기가 카메라 이미지를 제공할 수 있는 것에 더해, Raw Camera Access API는 요청이 이루어진 XRView정렬된 카메라 이미지 텍스처만 제공할 수 있다. 카메라 포즈가 XRView의 포즈와 같고, 카메라의 뷰잉 프러스텀이 XRView의 뷰잉 프러스텀과 같은 모양을 가지면, 카메라 이미지는 XRView정렬되어 있다고 한다. 네이티브 카메라가 반환한 카메라 이미지가 XRView의 뷰잉 프러스텀을 완전히 포함하는 뷰잉 프러스텀을 덮는 경우, 사용자 에이전트는 그 작업으로 인해 뷰잉 프러스텀 모양이 정확히 일치하게 되는 한 카메라 이미지를 자를 수 있다.

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

Raw Camera Access API는 현재 사용 가능한 모든 WebXR 기능 중 가장 높은 개인정보 보호 영향을 가진다. 애플리케이션이 사용자 환경을 직접 관찰할 수 있게 하는 유일한 API이기 때문이다. 이 때문에 사용자 에이전트는 camera-access 기능이 활성화된 세션 생성을 허용하기 전에 사용자 동의를 구해야 한다. 자세한 내용은 WebXR Device API § securityWebXR Device API § user-intention 절과 아래의 § 5.1 사용자 경험§ 5.2 개인정보 보호 표시자 절을 참조하라.

제공되는 카메라 이미지가 XRView정렬되어야 한다는 요구사항은 이 API가 사용자 개인정보에 미치는 영향에 대한 부분적인 완화책을 제공한다. 이 요구사항의 결과로, XR Compositorblend technique에 따라 카메라 이미지는 사용자가 이미 보고 있을 수 있는 것과 동일한 정보를 포함하므로, 환경의 어느 부분이 웹사이트에 보이는지에 대한 직접적인 피드백을 제공한다. 일부 경우에는 사이트가 이 정보를 억제할 수 있다는 점에 유의하라(예: 스마트폰에서 전체 뷰를 감싸는 불투명한 객체를 렌더링하여 컴포지터가 렌더링한 환경을 가리는 경우).

사용자 에이전트가 사용자 동의를 구해야 한다는 요구사항에 더해, 애플리케이션 개발자는 자신의 사용 사례를 달성할 다른 수단이 있다면 camera-access 기능을 요청하지 않을 것을 강력히 권장한다.

5.1. 사용자 경험

위에서 설명했듯이, Raw Camera Access API의 개인정보 보호 영향 때문에 사용자 에이전트는 camera-access 기능이 활성화된 세션을 생성하기 전에 사용자 동의를 구해야 한다. 이는 여러 방식으로 달성될 수 있으며, 그중 일부는 사용자와 직접 상호작용해야 할 수 있다.

사용자와 직접 상호작용하는 몇 가지 예는 다음과 같다:

  1. 사이트에 얼마나 세밀한 정보가 노출될지를 사용자가 선택할 수 있는 권한 프롬프트를 표시한다. 이러한 프롬프트의 모형은 아래에서 볼 수 있다.

  1. 애플리케이션이 requestSession() 호출에 제공한 요청 기능과 선택 기능으로 세션을 생성하기 위해 필요한 다양한 수준의 사용자 동의를 고려하는 일련의 권한 프롬프트를 표시한다.

이 사양의 의도는 사용자 에이전트가 앱 개발자에게 제공하려는 경험이 절대적으로 필요로 하지 않는 경우 camera-access 기능을 요청하도록 조장하지 않게 하는 것이다. 이 기능의 개인정보 보호 영향 때문에, 사이트가 카메라 이미지에 대한 접근을 요청할 때 사용자 에이전트는 추가 마찰을 도입할 수 있으며, 이는 애플리케이션이 불필요하게 해당 기능을 요청하지 않도록 유도하기 위한 것이다.

사용자 에이전트는 강력한 기능 "camera"에 대해 powerful feature 권한 UI(또는 이미 출처에 부여된 권한)를 재사용하는 것을 고려해야 한다.

5.2. 개인정보 보호 표시자

사용자 에이전트는 camera-access가 있는 XRSession이 생성되고 아직 ended되지 않은 매 순간 개인정보 보호 표시자를 표시해야 한다. 세션이 생성된 후 세션의 set of granted features를 수정할 수 있게 되는 경우, 표시자는 적어도 camera-access 기능 기술자가 세션의 set of granted features포함되어 있는 동안 표시되어야 한다.

사용자에게 표시되는 표시자는 기기의 카메라가 사용 중이고 사이트가 이에 접근할 수 있다는 사실을 전달해야 한다. 따라서 사용자는 카메라의 시야에 들어오는 콘텐츠가 사이트와 공유해도 괜찮은 것인지 확인하기 위해 각별히 주의해야 한다. 이는 녹화에 동의하지 않은 주변인이 있을 수 있는 공공장소에서 특히 그렇다.

표시자의 예는 다음을 포함한다(이에 한정되지 않는다):

6. 감사의 말

다음 개인들이 WebXR Raw Camera Access 사양의 설계에 기여했다:

준수

문서 관례

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

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

이 사양의 예제는 “예를 들어”라는 말로 도입되거나 class="example"으로 규범 텍스트와 구분되어 표시된다. 다음과 같다:

이는 정보 제공용 예제의 예다.

정보 제공용 참고는 “참고”라는 말로 시작하며 class="note"로 규범 텍스트와 구분되어 표시된다. 다음과 같다:

참고, 이는 정보 제공용 참고다.

색인

이 사양에서 정의하는 용어

참조로 정의된 용어

참고문헌

규범 참고문헌

[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. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBGL-2]
Dean Jackson; Jeff Gilbert. WebGL 2.0 Specification. 2017년 8월 12일. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보 참고문헌

[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. URL: https://immersive-web.github.io/webxr/

IDL 색인

partial interface XRView {
  [SameObject] readonly attribute XRCamera? camera;
};

[SecureContext, Exposed=Window]
interface XRCamera {
  readonly attribute unsigned long width;
  readonly attribute unsigned long height;
};

partial interface XRWebGLBinding {
  WebGLTexture? getCameraImage(XRCamera camera);
};

이슈 색인

반환되는 WebGLTexture에 대한 더 많은 정보를 지정해야 하는가? 예: color-renderable인지, 텍스처 형식은 무엇인지 등.