1. 소개
이 모듈은 WebXR 애플리케이션이 사용자의 실제 세계 환경으로 광선을 쏘고, XR 장치가 아는 최선의 범위에서, 그 광선이 물리적 객체와 교차한 지점 및 교차한 표면의 방향을 다시 보고하도록 허용하는 메커니즘을 설명한다. 이를 통해 가상 객체를 해당 표면과 정렬되도록 배치할 수 있다. 예를 들어 객체를 바닥 위에 사실적으로 배치하거나 벽에 부착할 수 있다. 히트 테스트 API는 WebXR Device API의 확장이며 WebXR Augmented Reality Module 위에 구축된다.
1.1. 용어
이 문서에서 이해하는 히트 테스트는 이상화된 수학적 광선 (반직선)이 기반 증강 현실 하드웨어 및 소프트웨어가 이해하는 실제 세계와 교차하는지를 확인하는 행위이다. API를 사용하는 애플리케이션이 생성한 가상 객체에 대한 광선 교차는 명시적으로 히트 테스트 API의 범위 밖이다.
2. 초기화
2.1. 기능 설명자
애플리케이션이 세션 중 히트 테스트 수행에 대한 관심을 신호하기 위해서는, 해당 세션이 적절한 기능 설명자와 함께 요청되어야 한다. 문자열 hit-test는 이 모듈에 의해 히트 테스트 기능을 위한 새로운 유효한 기능 설명자로 도입된다.
장치가 지원할 수 있는 히트 테스트 기능은 장치가 네이티브 히트 테스트 기능을 노출하는 경우이다. inline XR device는 히트 테스트 기능을 지원할 수 있는 것으로 취급되어서는 안 된다.
히트 테스트 기능은 기능 정책의 적용을 받으며, 요청 문서의 출처에서
"xr-spatial-tracking" 정책이 허용되어 있어야 한다.
3. 히트 테스트 옵션
3.1. XRHitTestTrackableType
XRHitTestTrackableType
enum은 히트 테스트 소스 생성 목적으로 사용될 수 있는 엔티티 타입을 지정한다.
enum {XRHitTestTrackableType "point" ,"plane" ,"mesh" };
-
타입이
"point"인 히트 테스트 추적 가능 대상은 히트 테스트 결과가 기반 증강 현실 시스템이 감지한 특징점에 기반해 계산됨을 나타낸다. -
타입이
"plane"인 히트 테스트 추적 가능 대상은 히트 테스트 결과가 기반 증강 현실 시스템이 감지한 평면에 기반해 계산됨을 나타낸다. -
타입이
"mesh"인 히트 테스트 추적 가능 대상은 히트 테스트 결과가 기반 증강 현실 시스템이 감지한 메시들에 기반해 계산됨을 나타낸다.
3.2. XRHitTestOptionsInit
XRHitTestOptionsInit
dictionary는 수행되는 히트 테스트의 동작에 영향을 주는 구성 가능한 값들의 집합을 나타낸다.
dictionary {XRHitTestOptionsInit required XRSpace space ;sequence <XRHitTestTrackableType >entityTypes ;XRRay offsetRay ; };
space dictionary 멤버는
XRSpace를
지정하며,
이는 offsetRay가
상대적으로 지정되는 기준이다.
entityTypes dictionary 멤버는
히트 테스트 결과를 계산하는 데 사용될 XRHitTestTrackableTypes의 배열을 지정한다.
offsetRay dictionary 멤버는
히트 테스트를 수행하는 데 사용될 XRRay를
지정한다. offsetRay는
space가
정의한 좌표계로 표현된 것처럼 해석된다.
XRHitTestOptionsInit
dictionary에는 연관된 effective
entityTypes가 있으며, 이는 dictionary 생성 시 제공된 경우 entityTypes로
설정된다. 생성 시 entityTypes가
제공되지 않은 경우, effective entityTypes는 단일 요소
"plane"를
포함하는 배열로 설정된다.
XRHitTestOptionsInit
dictionary에는 연관된 effective
offsetRay가 있으며, 이는 dictionary 생성 시 제공된 경우 offsetRay로
설정된다. 생성 시 offsetRay가
제공되지 않은 경우, effective offsetRay는 매개변수 없이
XRRay()를
호출하여 생성된 XRRay로 설정된다.
3.3. XRTransientInputHitTestOptionsInit
XRTransientInputHitTestOptionsInit
dictionary는 수행되는 transient
input에 대한 히트 테스트의 동작에 영향을 주는 구성 가능한 값들의 집합을 나타낸다.
dictionary {XRTransientInputHitTestOptionsInit required DOMString profile ;sequence <XRHitTestTrackableType >entityTypes ;XRRay offsetRay ; };
profile dictionary 멤버는
히트 테스트 결과를 계산하는 데 사용될 transient input source의 input profile name을 지정한다.
entityTypes dictionary 멤버는
히트 테스트의 결과를 계산하는 데 사용될 XRHitTestTrackableTypes의 배열을 지정한다.
offsetRay dictionary 멤버는
히트 테스트를 수행하는 데 사용될 XRRay를 지정한다.
offsetRay는
transient input source에 대한 히트 테스트 결과를 계산할 때 전달된 profile과
일치하는 profile을 가진 XRInputSource가
정의한 좌표계로 표현된 것처럼 해석된다.
XRTransientInputHitTestOptionsInit
dictionary에는 연관된 effective entityTypes가 있으며, 이는
dictionary 생성 시 제공된 경우 entityTypes로
설정된다. 생성 시 entityTypes가
제공되지 않은 경우, effective entityTypes는
단일 요소 "plane"를
포함하는 배열로 설정된다.
XRTransientInputHitTestOptionsInit
dictionary에는 연관된 effective
offsetRay가 있으며, 이는 dictionary 생성 시 제공된 경우 offsetRay로
설정된다. 생성 시 offsetRay가
제공되지 않은 경우, effective offsetRay는
매개변수 없이 XRRay를
구성하기 위해 XRRay()를
호출하여 생성된 것으로 설정된다.
4. 히트 테스트 소스
4.1. XRHitTestSource
[SecureContext ,Exposed =Window ]interface {XRHitTestSource undefined cancel (); };
XRHitTestSource
객체는 히트 테스트에 대한 활성 구독의 핸들 역할을 한다.
각 XRHitTestSource에는
연관된 session이 있으며, 이는 히트 테스트 소스를 생성하는 데 사용된
XRSession을
저장한다.
각 XRHitTestSource에는
연관된 native origin이 있으며, 이는 히트
테스트 요청에 사용된 XRSpace의
native origin을 식별하기에 충분한 정보를 저장한다.
이 정보는 이후 히트 테스트 결과를 계산할 때 사용된다.
XRHitTestSource에는
연관된 entity types가 있으며, 이는 히트 테스트 결과를 계산할 때
고려될 엔티티 타입을 설명하는 XRHitTestTrackableTypes의 배열이다.
각 XRHitTestSource에는
연관된 offset ray가 있으며, 이는 히트 테스트 결과를 계산할 때 사용될
XRRay이다.
XRHitTestSource는
session의 활성 히트 테스트 소스 집합에 존재하는 동안
active한 것으로 간주된다.
session, space, entityTypes, offsetRay로부터 히트 테스트 소스를 생성하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
hitTestSource를 새
XRHitTestSource로 둔다. -
hitTestSource의 session을 session으로 초기화한다.
-
hitTestSource의 native origin을 space의 native origin으로 초기화한다.
-
hitTestSource의 entity types를 entityTypes로 초기화한다.
-
offsetRay와 space로부터 transformedOffsetRay를 계산하되, transformedOffsetRay가 space의 native origin 좌표계에서 해석될 때, offsetRay가 space의 effective origin 좌표계에서 해석될 때와 동일한 광선을 나타내도록 한다.
-
hitTestSource의 offset ray를 transformedOffsetRay로 초기화한다.
-
hitTestSource를 반환한다.
cancel() 메서드는 XRHitTestSource
hitTestSource에서 호출될 때, 애플리케이션이 지정된 hitTestSource에 대한
히트 테스트 결과 획득에 더 이상 관심이 없음을 신호한다.
cancel()
메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행하여 히트 테스트 소스를 취소해야 한다:
-
hitTestSource가 active하지 않은 경우,
InvalidStateError를 던지고 이 단계를 중단한다. -
hitTestSource를 session의 활성 히트 테스트 소스 집합에서 제거한다.
애플리케이션이 특정 XRHitTestSource
hitTestSource에 대한 어떤 참조도 더 이상 보유하지 않는 경우, 사용자 에이전트는
hitTestSource가 아직 active하다면
히트 테스트 소스를
취소할 수 있다. 취소는
지정되지 않은 시간에 발생할 수도 있고(또는 전혀 발생하지 않을 수도 있으며), 애플리케이션은 정리를 위해 이
동작에 의존해서는 안 된다.
4.2. XRTransientInputHitTestSource
[SecureContext ,Exposed =Window ]interface {XRTransientInputHitTestSource undefined cancel (); };
XRTransientInputHitTestSource
객체는 transient input source에 대한 히트 테스트의 활성 구독에 대한 핸들 역할을 한다.
각 XRTransientInputHitTestSource에는
연관된 session이 있으며, 이는 히트 테스트 소스를 생성하는 데 사용된
XRSession을
저장한다.
각 XRTransientInputHitTestSource에는
연관된 profile이 있으며, 이는 입력 소스의
input profile name을 저장한다. 이
정보는 이후 transient input source에 대한 히트 테스트 결과를 계산할 때 사용된다.
XRTransientInputHitTestSource에는
연관된 entity types가 있으며, 이는
히트 테스트 결과를 계산할 때 고려될 엔티티 타입을 설명하는
XRHitTestTrackableTypes의 배열이다.
각 XRTransientInputHitTestSource에는
연관된 offset ray가 있으며, 이는 히트 테스트 결과를 계산할 때
사용될 XRRay이다.
XRTransientInputHitTestSource는
session의 transient input에 대한 활성 히트 테스트
소스
집합에 존재하는 동안 active한 것으로 간주된다.
session, profile, entityTypes, offsetRay로부터 transient input에 대한 히트 테스트 소스를 생성하기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
hitTestSource를 새
XRTransientInputHitTestSource로 둔다. -
hitTestSource의 session을 session으로 초기화한다.
-
hitTestSource의 profile을 profile로 초기화한다.
-
hitTestSource의 entity types를 entityTypes로 초기화한다.
-
hitTestSource의 offset ray를 offsetRay로 초기화한다.
-
hitTestSource를 반환한다.
cancel() 메서드는
XRTransientInputHitTestSource
hitTestSource에서 호출될 때, 애플리케이션이 지정된 hitTestSource에 대한
히트 테스트 결과 획득에 더 이상 관심이 없음을 신호한다.
cancel()
메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행하여 transient input에 대한 히트 테스트 소스를 취소해야 한다:
-
hitTestSource가 active하지 않은 경우,
InvalidStateError를 던지고 이 단계를 중단한다. -
hitTestSource를 session의 transient input에 대한 활성 히트 테스트 소스 집합에서 제거한다.
애플리케이션이 특정 XRTransientInputHitTestSource
hitTestSource에 대한 어떤 참조도 더 이상 보유하지 않는 경우, 사용자 에이전트는
hitTestSource가 아직 active하다면 transient
input에 대한 히트 테스트 소스를 취소할 수 있다. 취소는
지정되지 않은 시간에 발생할 수도 있고(또는 전혀 발생하지 않을 수도 있으며), 애플리케이션은 정리를 위해 이
동작에 의존해서는 안 된다.
5. 히트 테스트 결과
5.1. XRHitTestResult
[SecureContext ,Exposed =Window ]interface {XRHitTestResult XRPose ?getPose (XRSpace ); };baseSpace
XRHitTestResult는
히트 테스트의 단일 결과를 포함한다. 이는 기반 XR 장치가 이해하는 사용자의 환경과
히트 테스트 수행에 사용된 광선의 교차점에 대한 정보를 캡슐화한다.
각 XRHitTestResult에는
연관된 frame이 있으며, 이는 결과가 계산된
XRFrame이다.
각 XRHitTestResult에는
연관된 native origin이 있다. 이 native origin은
Y축이 교차점에서 표면의 법선 벡터를 나타내는 새 좌표계를 정의한다.
XRFrame
frame, XRHitTestTrackableType의
배열
entityTypes, 그리고 native hit test result nativeResult가 주어졌을 때
히트 테스트 결과를
생성하기 위해, 사용자
에이전트는 다음 단계를 실행해야 한다:
-
hitTestResult를 새
XRHitTestResult로 둔다. -
session을 frame의 session으로 둔다.
-
device를 session의 XR device로 둔다.
-
device에 nativeResult의 native entity type, nativeEntityType를 조회한다.
-
native entity type에서 변환하여 nativeEntityType를 entityType로 변환한다.
-
entityType이
null이거나 entityTypes 배열에 존재하지 않으면,null을 반환하고 이 단계를 중단한다. -
hitTestResult의 frame을 frame으로 설정한다.
-
hitTestResult의 native origin을 nativeResult에서 얻은 native origin으로 설정한다.
-
hitTestResult를 반환한다.
getPose(baseSpace)
메서드는 XRHitTestResult
hitTestResult에서 baseSpace 매개변수와 함께 호출될 때,
frame이 나타내는
시점의
baseSpace에 상대적인 hitTestResult의 포즈를 XRPose로
제공한다.
getPose(baseSpace) 메서드가
hitTestResult에서 호출되면, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
frame을 hitTestResult의 frame으로 둔다.
-
frame의 active boolean이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
pose를 새
XRPose로 둔다. -
space를 새
XRSpace로 두고, native origin은 native origin으로, origin offset은 identity transform으로, 그리고 session은 frame의 session으로 설정한다. -
frame이 나타내는 시점에서 baseSpace 안의 space의 pose를 채워 pose에 넣는다.
-
pose를 반환한다.
5.2. XRTransientInputHitTestResult
[SecureContext ,Exposed =Window ]interface { [XRTransientInputHitTestResult SameObject ]readonly attribute XRInputSource ;inputSource readonly attribute FrozenArray <XRHitTestResult >; };results
XRTransientInputHitTestResult는
transient input에 대한 히트 테스트 결과의 배열을 포함하며, XRInputSource
inputSource별로
그룹화된다.
inputSource
속성은 XRInputSource를
포함하며, 이는 results
배열을 계산하는 데 사용된 것이다.
results
속성은 계산된 XRHitTestResult들의
배열을 포함한다.
각 XRTransientInputHitTestResult에는
연관된 frame이 있으며, 이는 결과가 계산된
XRFrame이다.
XRInputSource
inputSource, XRFrame
frame, XRHitTestTrackableType의
배열
entityTypes, 그리고 native hit test results의 배열 nativeResults가
주어졌을 때 transient input에 대한 히트 테스트 결과를 생성하기 위해, 사용자
에이전트는 다음 단계를 실행해야 한다:
-
hitTestResult를 새
XRTransientInputHitTestResult로 둔다. -
hitTestResult의 frame을 frame으로 설정한다.
-
hitTestResult의
inputSource를 inputSource로 설정한다. -
results를
XRHitTestResult들의 빈 배열로 둔다. -
nativeResults의 각 nativeResult에 대해:
-
frame, entityTypes, nativeResult로부터 히트 테스트 결과를 생성하여 result로 둔다.
-
result가
null이면, nativeResults의 다음 항목으로 계속한다. -
result를 results 배열에 추가한다.
-
-
hitTestResult의
results를 results로 설정한다. -
hitTestResult를 반환한다.
6. 히트 테스트 요청
partial interface XRSession {Promise <XRHitTestSource >requestHitTestSource (XRHitTestOptionsInit );options Promise <XRTransientInputHitTestSource >requestHitTestSourceForTransientInput (XRTransientInputHitTestOptionsInit ); };options
XRSession은
히트 테스트 결과를 계산할 때 사용될 연관된 활성 히트 테스트 소스 집합을 포함하도록 확장된다.
XRSession은
transient input에 대한 히트 테스트 결과를 계산할 때 사용될 연관된 transient input에 대한 활성 히트 테스트
소스 집합을 포함하도록 확장된다.
활성 히트 테스트 소스의 총 수 또는 최근 요청 수가 API의 정당한 사용에 비해 너무 높다고 간주되는 경우, 애플리케이션은 비합리적인 수의 요청을 하는 것으로 간주된다. 이는 남용을 피하기 위해 사용자 에이전트가 취할 수 있는 OPTIONAL 개인정보 보호 조치이다.
애플리케이션은 XRSession의
requestHitTestSource()
메서드를 사용하여 히트
테스트를 요청할 수 있다.
requestHitTestSource(options)
메서드는 XRSession
session에서 호출될 때, 다음 단계를 실행해야 한다:
-
promise를 새 Promise로 둔다.
-
hit-test 기능 설명자가 session의 활성화된 기능 목록에 포함되어 있지 않으면, promise를
NotSupportedError로 거부하고 이 단계를 중단한다. -
session의
ended값이true이면,InvalidStateError를 던지고 이 단계를 중단한다. -
사용자 에이전트는 비합리적인 수의 요청이 있는 경우, promise를
NotAllowedError로 거부하고 이 단계를 중단할 수 있다. -
모든 히트 테스트 결과 계산 알고리즘이 session의 프레임 업데이트 목록에 아직 없으면 추가한다.
-
session, options의
space, options의 effective entityTypes 및 options의 effective offsetRay로 히트 테스트 소스를 생성하여 hitTestSource로 둔다. -
hitTestSource가
null이면, promise를OperationError로 거부하고 이 단계를 중단한다. -
생성된 hitTestSource를 session의 활성 히트 테스트 소스 집합에 저장한다.
-
promise를 생성된 hitTestSource로 해결한다.
requestHitTestSourceForTransientInput(options)
메서드는 XRSession
session에서 호출될 때, 다음 단계를 실행해야 한다:
-
promise를 새 Promise로 둔다.
-
hit-test 기능 설명자가 session의 활성화된 기능 목록에 포함되어 있지 않으면, promise를
NotSupportedError로 거부하고 이 단계를 중단한다. -
session의
ended값이true이면,InvalidStateError를 던지고 이 단계를 중단한다. -
사용자 에이전트는 비합리적인 수의 요청이 있는 경우, promise를
NotAllowedError로 거부하고 이 단계를 중단할 수 있다. -
모든 히트 테스트 결과 계산 알고리즘이 session의 프레임 업데이트 목록에 아직 없으면 추가한다.
-
session, options의
profile, options의 effective entityTypes 및 options의 effective offsetRay로 transient input에 대한 히트 테스트 소스를 생성하여 hitTestSource로 둔다. -
hitTestSource가
null이면, promise를OperationError로 거부하고 이 단계를 중단한다. -
생성된 hitTestSource를 session의 transient input에 대한 활성 히트 테스트 소스 집합에 저장한다.
-
promise를 생성된 hitTestSource로 해결한다.
7. 히트 테스트 결과 계산
주어진 XRFrame
frame에 대한 모든 히트 테스트 결과를 계산하기 위해, 사용자 에이전트는
다음 단계를 수행해야 한다:
-
frame으로 히트 테스트 결과 계산 알고리즘을 호출한다.
-
frame으로 transient input에 대한 히트 테스트 결과 계산 알고리즘을 호출한다.
주어진 XRFrame
frame에 대한 히트 테스트 결과를 계산하기 위해,
session의
활성 히트 테스트 소스 집합에 존재하는 각 히트 테스트 소스
hitTestSource에 대해, 사용자 에이전트는 다음 단계를 수행해야 한다:
-
entityTypes를 hitTestSource의 entity types로 둔다.
-
session을 frame의
session으로 둔다. -
device를 session의 XR device로 둔다.
-
device의 트래킹 시스템에 hitTestSource의 native origin의 최신 coordinates를 조회한다.
-
hitTestSource의 offset ray, offsetRay를 coordinates에 상대적으로 표현된 것처럼 해석하고, 그 해석을 사용하여 native hit test를 수행하여 native hit test results nativeResults를 얻는다.
-
hitTestResults를 빈 list로 둔다.
-
nativeResults의 각 native hit test result nativeResult에 대해 다음 단계를 수행한다:
-
frame, entityTypes, 그리고 nativeResult로부터 히트 테스트 결과를 생성하여 hitTestResult로 둔다.
-
hitTestResult가
null이면, nativeResults의 다음 항목으로 계속한다. -
hitTestResults에 hitTestResult를 추가하되, 목록이 offsetRay에서 nativeResult까지의 광선을 따른 거리 순서로 정렬된 상태를 유지하도록 한다.
-
-
hitTestResults를 frame의 히트 테스트 소스에서 히트 테스트 결과로의 맵에 hitTestSource 키 아래 저장한다.
주어진 XRFrame
frame에 대한 transient input에 대한 히트 테스트 결과를 계산하기 위해,
session의
transient input에 대한 활성 히트
테스트
소스 집합에 존재하는 각 히트 테스트 소스 hitTestSource에 대해, 사용자 에이전트는 다음 단계를 수행해야 한다:
-
entityTypes를 hitTestSource의 entity types로 둔다.
-
session을 frame의
session으로 둔다. -
device를 session의 XR device로 둔다.
-
candidateInputSources를 transient로 간주되고 활성 XR 입력 소스 목록에 포함된 모든 session의 입력 소스 집합으로 둔다.
-
matchingInputSources를 candidateInputSources에 포함된 입력 소스 중, 그
profiles배열이 hitTestSource의 profile과 동일한 항목을 포함하는 모든 입력 소스의 집합으로 둔다. -
hitTestResults를 XRTransientInputHitTestResults의 빈 배열로 둔다.
-
matchingInputSources의 각 transient input source inputSource에 대해:
-
device의 트래킹 시스템에 inputSource의
targetRaySpace의 native origin의 최신 coordinates를 조회한다. -
hitTestSource의 offset ray를 coordinates에 상대적으로 표현된 것처럼 해석하고, 그 해석을 사용하여 native hit test를 수행하여 native hit test results nativeResults를 얻는다.
-
frame, inputSource, entityTypes, 그리고 nativeResults로부터 transient input에 대한 히트 테스트 결과를 생성하여 hitTestResult로 둔다.
-
hitTestResult를 hitTestResults 배열에 추가한다.
-
-
hitTestResults를 frame의 transient input에 대한 히트 테스트 소스에서 히트 테스트 결과로의 맵에 hitTestSource 키 아래 저장한다.
8. 히트 테스트 결과 획득
partial interface XRFrame {sequence <XRHitTestResult >getHitTestResults (XRHitTestSource );hitTestSource sequence <XRTransientInputHitTestResult >getHitTestResultsForTransientInput (XRTransientInputHitTestSource ); };hitTestSource
XRFrame은
XRHitTestSource에서
XRHitTestResults 배열로의 매핑을 저장하는 연관된 히트 테스트 소스에서 히트
테스트 결과로의 맵을 포함하도록 확장된다.
XRFrame은
XRTransientInputHitTestSource에서
XRTransientInputHitTestResults 배열로의 매핑을 저장하는 연관된
transient input에 대한 히트
테스트 소스에서 히트 테스트 결과로의 맵을 포함하도록 확장된다.
애플리케이션은 XRHitTestSource에서
XRFrame의
getHitTestResults()
메서드를 사용하여 히트 테스트 결과를 획득할 수 있다.
getHitTestResults(hitTestSource)
메서드가 XRFrame
frame에서 호출될 때, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
frame의 active boolean이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
hitTestSource에 대한 항목이 frame의 히트 테스트 소스에서 히트 테스트 결과로의 맵에 존재하는지 확인한다. 항목이 존재하지 않으면,
InvalidStateError를 던지고 이 단계를 중단한다. -
frame의 히트 테스트 소스에서 히트 테스트 결과로의 맵에서 hitTestSource에 대한 항목을 찾아 results에 할당한다.
-
results를 반환한다.
애플리케이션은 XRTransientInputHitTestSource에서
XRFrame의
getHitTestResultsForTransientInput()
메서드를 사용하여 transient input에 대한 히트 테스트 결과를 획득할 수 있다.
getHitTestResultsForTransientInput(hitTestSource)
메서드가 XRFrame
frame에서 호출될 때, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
frame의 active boolean이
false이면,InvalidStateError를 던지고 이 단계를 중단한다. -
hitTestSource에 대한 항목이 frame의 transient input에 대한 히트 테스트 소스에서 히트 테스트 결과로의 맵에 존재하는지 확인한다. 항목이 존재하지 않으면,
InvalidStateError를 던지고 이 단계를 중단한다. -
frame의 transient input에 대한 히트 테스트 소스에서 히트 테스트 결과로의 맵에서 hitTestSource에 대한 항목을 찾아 results에 할당한다.
-
results를 반환한다.
9. 기하 프리미티브
9.1. XRRayDirectionInit
XRRayDirectionInit
dictionary는 XRRay(origin, direction)
생성자에 전달될 방향 벡터를 나타낸다.
dictionary {XRRayDirectionInit double = 0;x double = 0;y double = -1;z double = 0; };w
9.2. XRRay
XRRay는
origin
점과 direction
벡터로 설명되는 기하 광선이다.
[SecureContext ,Exposed =Window ]interface {XRRay constructor (optional DOMPointInit = {},origin optional XRRayDirectionInit = {});direction constructor (XRRigidTransform ); [transform SameObject ]readonly attribute DOMPointReadOnly origin ; [SameObject ]readonly attribute DOMPointReadOnly direction ; [SameObject ]readonly attribute Float32Array matrix ; };
XRRay(origin, direction) 생성자는
호출될 때 다음 단계를 수행해야 한다:
-
ray를 새
XRRay로 둔다. -
ray의
origin을{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }으로 초기화한다. -
ray의
direction을{ x: 0.0, y: 0.0, z: -1.0, w: 0.0 }으로 초기화한다. -
ray의
origin의x값을 origin의x로,y값을 origin의y로, 그리고z값을 origin의z로 초기화한다. -
ray의
direction의x값을 direction의x로,y값을 direction의y로, 그리고z값을 direction의z로 초기화한다. -
ray의 matrix를
null로 초기화한다. -
ray를 반환한다.
XRRay(transform) 생성자는 호출될 때
다음 단계를 수행해야 한다:
-
ray를 새
XRRay로 둔다. -
ray의
origin을{ x: 0.0, y: 0.0, z: 0.0, w: 1.0 }으로 초기화한다. -
ray의
direction을{ x: 0.0, y: 0.0, z: -1.0, w: 0.0 }으로 초기화한다. -
transform의
matrix를 왼쪽에서 미리 곱하여 ray의origin을 변환하고, 그 결과로 ray를 설정한다. -
transform의
matrix를 왼쪽에서 미리 곱하여 ray의direction을 변환하고, 그 결과로 ray를 설정한다. -
ray의 matrix를
null로 초기화한다. -
ray를 반환한다.
origin 속성은 광선이 시작되는 공간상의 3차원 점을
미터 단위로 정의한다. origin의
w
속성은 1.0이어야 한다.
direction 속성은 광선의 3차원
방향 벡터를 정의한다. direction의
w
속성은 0.0이어야 하며, 벡터는 길이가 1.0이 되도록 정규화되어야 한다.
matrix 속성은 matrix이며,
XRRay를 따라 객체를 배치하는 데
사용할 수 있는 변환을 나타낸다. 이는
[0, 0, 0]에서 시작하여 음의 Z축 방향으로 뻗는 광선에서
XRRay의 origin
및 direction으로
설명되는 광선으로의 변환이다. 이러한 matrix는 direction
및 Z축에 수직인 임의의 벡터를 변경하지 않는 회전 성분을 가진 것이어야 한다.
이 속성은 XRRay에 대한
matrix 획득으로
계산되어야 한다. 이
속성은 지연 평가되어야 한다.
참고: XRRay의 matrix는
렌더링할 때 광선의 그래픽 표현을 쉽게 배치하는 데 사용할 수 있다.
주어진 XRRay
ray에 대해 matrix를 획득하려면
-
ray의 matrix가
null이 아니면, 다음 단계를 수행한다:-
matrix에 대한
IsDetachedBuffer연산이false이면, ray의 matrix를 반환한다.
-
-
z를 벡터
[0, 0, -1]로 둔다. -
axis를 z와 ray의
direction의 벡터 외적으로 둔다.z × direction. -
cos_angle을 z와 ray의
direction의 스칼라 내적으로 둔다.z · direction. -
다음에 따라 rotation을 설정한다:
- cos_angle이 -1보다 크고 1보다 작은 경우
- rotation을 axis 주위의
arccos(cos_angle)만큼의 오른손 평면 회전을 나타내는 회전 행렬로 설정한다. - 그렇지 않고, cos_angle이 -1인 경우
- rotation을 벡터
[1, 0, 0]주위의arccos(cos_angle)만큼의 오른손 평면 회전을 나타내는 회전 행렬로 설정한다. - 그 외의 경우
- rotation을 단위 행렬로 설정한다.
-
translation을 ray의
origin에 해당하는 성분을 가진 평행 이동 행렬로 둔다. -
matrix를 열 벡터 표기법에서 rotation을 왼쪽에서 translation에 미리 곱한 결과(즉
translation * rotation)로 둔다. -
ray의 matrix를 matrix로 설정한다.
-
matrix를 반환한다.
XRRay
ray에서 임의의 엔티티 entity까지의 광선을 따른
거리, distance는
ray.origin + ray.direction * distance가
엔티티 entity에 속하는 점이 되고, distance가 음수가 아니며, 위 조건이 계속 성립하는
더 작은 distance 값이 존재하지 않도록 정의된다. "엔티티에 속하는 점"의 의미를 정의하는 것은
XR
장치에 달려 있다.
10. 네이티브 장치 개념
히트 테스트 API를 구현하는 사용자 에이전트는 기반 XR 장치로부터 사용자의 환경에 대한 정보를 얻는 방법을 가져야 한다. 이 절은 장치의 네이티브 기능과 관련된 요구사항 및 개념을 설명하려고 하며, 필연적으로 다양한 기반 프레임워크 / 장치를 위한 충분한 여지를 남기기 위해 충분히 덜 명세화되어 있다.
10.1. 네이티브 히트 테스트
이 명세에서는 XR 장치가 다음 요구사항을 만족하는 네이티브 히트 테스트를 사용자 에이전트가 수행할 수 있는 방법을 노출한다고 가정한다:
-
사용자의 환경에 대해 테스트될 3D 광선을 받는다.
-
전달된 광선과 사용자의 환경의 교차점을 나타내는 3D 포즈의 컬렉션을 반환한다. 컬렉션의 각 항목은 해당 native result를 얻는 데 사용된 native entity의 타입에 대한 정보와, 교차점에서 사용자의 환경에 대한 표면 법선을 사용자 에이전트가 계산할 수 있게 하는 충분한 정보도 포함해야 한다.
참고: 히트 테스트 기능을 네이티브로 노출하지 않는 장치의 경우에도, XR 장치가 노출할 수 있는 사용자의 환경에 대한 정보를 얻는 다른 방법을 활용하여 사용자 에이전트가 이 명세를 구현하는 것이 가능할 수 있다.
10.2. 네이티브 엔티티 타입
-
Point - 히트 테스트 결과가 사용자의 환경에서 발견된 특징점에 기반해 계산되었음을 의미한다.
-
Plane - 히트 테스트 결과가 사용자의 환경에서 감지된 평면에 기반해 계산되었음을 의미한다.
-
Mesh - 히트 테스트 결과가 사용자의 환경에서 감지된 메시들에 기반해 계산되었음을 의미한다.
native entity type에서 변환하여 XRHitTestTrackableType으로
만들기 위해, 사용자 에이전트는 다음 단계를 실행해야 한다:
-
nativeEntityType을 변환될 native entity type으로 둔다.
-
entityType을 새
XRHitTestTrackableType로 둔다. -
entityType을 다음과 같이 초기화한다:
-
entityType을 반환한다.
10.3. 네이티브 히트 테스트 결과
XR 장치에서 반환되는 Native hit test results는 사용자의 환경과의 교차점 위치를 포함해야 한다. native entity type과 XR 장치가 이용할 수 있는 정보에 따라, 그 결과는 교차점에서 사용자의 환경에 대한 표면 법선을 사용자 에이전트가 계산할 수 있도록 하는 방식으로 정의된 방향도 포함해야 한다.
교차점의 위치와 방향에 대한 정보는 native hit test result의 native origin에 포함되어야 한다. Native origin은 그 Y축이 교차점에서 표면의 법선 벡터를 나타내는 방식으로 새 좌표계를 정의한다. XR 장치에서 방향을 반환하지 않는 경우, 사용자 에이전트는 그것이 정의하는 좌표계의 Y축이 위쪽(음의 중력 벡터 방향)을 가리키도록 native origin을 설정해야 한다.
서로 다른 구현 및 서로 다른 AR 프레임워크 간 호환성을 유지하기 위해 히트 테스트 결과의 native origin이 정의하는 좌표계의 다른 축들을 명세해야 하는지 결정한다.
11. 개인정보 보호 및 보안 고려사항
히트 테스트 API는 여러 방향으로 히트 테스트 광선을 보내 사용자의 환경을 더 많거나 적은 정밀도로 매핑하는 데 사용될 수 있다. 히트 테스트는 XR 세션을 생성할 때 기능 설명자로 선언되어야 하며, 이는 웹사이트가 히트 테스트 API를 사용하도록 허용하는 것의 잠재적인 개인정보 영향을 사용자 에이전트가 사용자에게 알릴 수 있게 한다. 또한, 사용자 에이전트는 진정한 비-개인정보 침해적 사용에 대해 비합리적인 수의 요청이 이루어졌다고 판단하는 경우 히트 테스트 요청을 거부할 수 있다.
변경사항
2021년 8월 31일 최초 공개 작업 초안 이후의 변경사항
12. 감사의 말
다음 개인들은 WebXR Hit Test 명세의 설계에 기여했다: