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" 권한
정책이 허용되어야 한다.
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에 대해 카메라를
획득하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
session을 view의 session으로 둔다.
-
camera-access 기능 기술자가 session의 set of granted features에 포함되어 있지 않으면,
null을 반환하고 이 단계를 중단한다. -
frame을 view의 frame으로 둔다.
-
frame의 active 불리언이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
frame의 animationFrame 불리언이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
camera image를 frame의 time에 유효한 네이티브 카메라에서 반환된, width x height 텍셀 크기의 카메라 이미지 버퍼를 포함하는 것으로 둔다.
-
camera image가
null이면,null을 반환하고 이 단계를 중단한다. -
camera image가 view와 정렬된 데이터를 포함하도록 보장한다. 여기에는 적절하게 width와 height를 조정하는 것도 포함된다. 가능하지 않으면,
null을 반환하고 이 단계를 중단한다. -
view, camera image, width 및 height로 카메라 인스턴스 생성 알고리즘을 호출하고 그 결과를 반환한다.
3.2. XRCamera
[SecureContext ,Exposed =Window ]interface {XRCamera readonly attribute unsigned long ;width readonly attribute unsigned long ; };height
XRCamera
인터페이스는 XRWebGLBinding에서
얻을 수 있는 카메라 텍스처에 대한 정보를 노출하는 방법으로 도입된다.
XRCamera는
camera image의
너비(텍셀 단위)를 포함하는 width
속성을 포함한다.
XRCamera는
camera image의
높이(텍셀 단위)를 포함하는 height
속성을 포함한다.
각 XRCamera에는
XRCamera 인스턴스가
반환된 XRView를
포함하는 연관된 view 인스턴스가 있다.
각 XRCamera에는
연관된 camera image 데이터 버퍼가 있다.
XRView
view, camera image, width 및 height로부터
카메라 인스턴스 생성을 하기 위해, 사용자 에이전트는
다음 단계를 실행해야 한다:
-
result를
XRCamera인터페이스의 새 인스턴스로 둔다. -
result의 view를 view로 설정한다.
-
result의 camera image를 camera image로 설정한다.
-
result의
width를 width로 설정한다. -
result의
height를 height로 설정한다. -
result를 반환한다.
3.3. XRWebGLBinding
partial interface XRWebGLBinding {WebGLTexture ?(getCameraImage XRCamera ); };camera
getCameraImage(camera)
메서드는 호출될 때 XRWebGLBinding에서
카메라 이미지 획득을 하는 데
사용할 수 있다.
반환된 WebGLTexture가
null이 아니면, 이는 불투명
텍스처다.
XRWebGLBinding
binding에서, XRCamera
camera에 대해 카메라
이미지 획득을 하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
session을 binding의 session으로 둔다.
-
view를 camera의 view로 둔다.
-
view의 session이 session과 일치하지 않으면,
InvalidStateError를 던지고 이 단계를 중단한다. -
frame을 view의 frame으로 둔다.
-
frame의 active 불리언이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
frame의 animationFrame 불리언이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
context를 binding의 context로 둔다.
-
camera image를 camera의 camera image로 둔다.
-
result를 context에서 생성된, camera image의 데이터를 포함하는
WebGLTexture로 둔다. result는 불투명 텍스처다. -
result를 반환한다.
사용자 에이전트는 호출 결과가 바인딩과 카메라 인스턴스를 키로 하는 캐시에 저장된다고 가정하여, getCameraImage(camera)
호출 결과를 캐시하고 이후 메서드 호출에 대해 반환할 수 있다. 사용자 에이전트는 캐시를 사용할 때에도
카메라 이미지 획득 알고리즘의
6단계까지(포함) 실행하여
초기 검증을 수행해야 한다. 이러한 캐싱이 허용되므로, 애플리케이션은 반환된 WebGLTexture를
읽기 전용으로 취급해야 한다.
참고: 캐싱이 허용되는 이유는 사용자 에이전트가 반환된 WebGLTexture의
수명에 대한 소유권을 유지하기 때문이며(이는 불투명
텍스처로 간주되기 때문이다), 또한 동일한 requestAnimationFrame() 콜백 내에서 이 메서드를 여러 번 호출하면
(XRCamera를
사용함으로써 보장되며, 따라서 XRFrame도
캐시 키의 일부로 전이적으로 보장된다), 동일한 바인딩에서(XRWebGLBinding를
캐시 키의 일부로 사용함으로써 보장된다), 동일한 내용을 가진 텍스처가 결과가 되기 때문이다.
WebGLTexture가
getCameraImage(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 § security 및 WebXR Device API § user-intention 절과 아래의 § 5.1 사용자 경험 및 § 5.2 개인정보 보호 표시자 절을 참조하라.
제공되는 카메라 이미지가 XRView와
정렬되어야 한다는 요구사항은 이 API가 사용자 개인정보에 미치는
영향에 대한
부분적인 완화책을 제공한다. 이 요구사항의 결과로, XR Compositor의 blend technique에 따라 카메라 이미지는 사용자가 이미 보고 있을 수 있는
것과 동일한 정보를 포함하므로, 환경의 어느 부분이 웹사이트에 보이는지에 대한 직접적인 피드백을 제공한다.
일부 경우에는 사이트가 이 정보를 억제할 수 있다는 점에 유의하라(예: 스마트폰에서 전체 뷰를 감싸는 불투명한
객체를 렌더링하여 컴포지터가 렌더링한 환경을 가리는 경우).
사용자 에이전트가 사용자 동의를 구해야 한다는 요구사항에 더해, 애플리케이션 개발자는 자신의 사용 사례를 달성할 다른 수단이 있다면 camera-access 기능을 요청하지 않을 것을 강력히 권장한다.
5.1. 사용자 경험
위에서 설명했듯이, Raw Camera Access API의 개인정보 보호 영향 때문에 사용자 에이전트는 camera-access 기능이 활성화된 세션을 생성하기 전에 사용자 동의를 구해야 한다. 이는 여러 방식으로 달성될 수 있으며, 그중 일부는 사용자와 직접 상호작용해야 할 수 있다.
사용자와 직접 상호작용하는 몇 가지 예는 다음과 같다:
-
사이트에 얼마나 세밀한 정보가 노출될지를 사용자가 선택할 수 있는 권한 프롬프트를 표시한다. 이러한 프롬프트의 모형은 아래에서 볼 수 있다.
-
애플리케이션이
requestSession()호출에 제공한 요청 기능과 선택 기능으로 세션을 생성하기 위해 필요한 다양한 수준의 사용자 동의를 고려하는 일련의 권한 프롬프트를 표시한다.
이 사양의 의도는 사용자 에이전트가 앱 개발자에게 제공하려는 경험이 절대적으로 필요로 하지 않는 경우 camera-access 기능을 요청하도록 조장하지 않게 하는 것이다. 이 기능의 개인정보 보호 영향 때문에, 사이트가 카메라 이미지에 대한 접근을 요청할 때 사용자 에이전트는 추가 마찰을 도입할 수 있으며, 이는 애플리케이션이 불필요하게 해당 기능을 요청하지 않도록 유도하기 위한 것이다.
사용자 에이전트는 강력한 기능 "camera"에 대해 powerful feature 권한 UI(또는 이미 출처에 부여된 권한)를 재사용하는 것을 고려해야 한다.
5.2. 개인정보 보호 표시자
사용자 에이전트는 camera-access가
있는 XRSession이
생성되고 아직 ended되지
않은 매 순간 개인정보 보호 표시자를 표시해야 한다.
세션이 생성된 후 세션의 set of
granted features를 수정할 수 있게 되는 경우, 표시자는 적어도 camera-access 기능 기술자가 세션의 set of
granted features에
포함되어 있는 동안
표시되어야 한다.
사용자에게 표시되는 표시자는 기기의 카메라가 사용 중이고 사이트가 이에 접근할 수 있다는 사실을 전달해야 한다. 따라서 사용자는 카메라의 시야에 들어오는 콘텐츠가 사이트와 공유해도 괜찮은 것인지 확인하기 위해 각별히 주의해야 한다. 이는 녹화에 동의하지 않은 주변인이 있을 수 있는 공공장소에서 특히 그렇다.
표시자의 예는 다음을 포함한다(이에 한정되지 않는다):
-
모바일 기기에서 카메라가 사용 중임을 상태 표시줄에 알림으로 표시한다;
-
콘텐츠가 녹화되고 있음을 암시하는 UI 요소(예: 콘텐츠 주변의 테두리, "Record" 버튼을 상징하는 둥근 아이콘 등)를 렌더링한다;
-
녹화 기기의 LED 표시자(존재하고 사용자 에이전트가 제어할 수 있는 경우)를 사용한다;
-
세션 시작 시 카메라 셔터음 효과를 낸다;
6. 감사의 말
다음 개인들이 WebXR Raw Camera Access 사양의 설계에 기여했다: