ar-mode-controls
ar-mode-controls는 AR 모드에서 네이티브 앱과 통신하며 액티브 마커의 transform을 업데이트하는 컴포넌트이다.
WXR에서는 이미지 트래킹 기반의 AR 상호작용을 지원한다. 이를 위해서는 WXR용 전용 브라우저를 통해 접속해야 한다. 현재는 Android용 브라우저와 iOS용 브라우저가 제공된다.
AR모드에 진입할 때 Spatial Computing 메서드를 선택하도록 되어있다. 두 가지 옵션이 제공되는데 plane detection base와 marker base가 있다.
전자는 AR엔진에서 자동적으로 제공되는 기능인데 주변 환경의 벽이나 바닥, 책상 등의 평면들을 인식하여 그것들을 기준으로 자체 좌표계를 만들고 기기의 포즈를 트래킹하는 방식이다. 이 경우 씬에 있는 베이스마커는 무시되고 액티브마커만으로 상호작용을 하게 된다. 그러나 주변 환경에 따라 정확도에 큰 차이가 있을 수 있다.
후자는 WXR에 제공되는 고유한 방법인데 이때는 이미지 마커가 두 종류로 분류된다. 하나는 움직임을 트래킹하고자 하는 대상에 부착되는 액티브 마커이고, 다른 하나는 움직이지 않을 것으로 약속된 베이스 마커이다. 이 경우 씬에 등록된 베이스마커와 액티브마커를 모두 활용하며 베이스마커의 움직임은 기기의 움직임으로 처리되고 액티브마커의 움직임은 트래킹할 물체가 움직인 것으로 처리된다. 이 방식에서는 AR 모드가 두 가지 상태로 나뉘는데 하나는 half세션모드이고 다른 하나는 full세션모드이다. 전자는 베이스마커가 인식되지 않고 액티브마커만 인식되는 상태일때인데 이때는 디바이스의 위치를 특정할 수 없기 때문에 인식된 액티브마커를 기준으로 연결된 가상오브젝트의 위상관계에 맞게 씬 전체를 렌더링해준다. 이때 액티브마커를 움직이더라도 연결된 가상오브젝트가 움직이는게 아니라 씬 전체가 움직이는 것으로 보여질 것이고, 실제로는 씬이 움직인 것도 아니며 단지 그 유저의 가상카메라가 움직이는 것이다. 후자는 베이스마커와 액티브마커가 동시에 추적되고 있는 상태일때이며 AR엔진에서 지원한다면 베이스마커에 대한 추적은 extended 트래킹이 적용되어 처음 인식한 후에 카메라 뷰를 벗어나더라도 추적된다. 이때는 기기의 움직임과 대상 물체의 움직임을 구별할 수 있어 씬에 대한 쓰기가 가능해진다. 이 상태에서는 액티브마커를 움직였을 때 가상 오브젝트가 씬에서 실제로 같이 움직여진다.
active-marker
액티브 마커로 사용할 애셋(target type) URL을 담기 위한 컴포넌트이다. 스키마는 다음과 같다.
{
src: {type: 'string'}
}
JavaScript
복사
이 url은 추상화된 target type 애셋에 대한 것이어야 한다. 실제로 사용될 데이터는 그 하위 아이템으로 존재해야하며 그 이름은 general 또는 vuforia여야한다.
general의 파일 구조는 13바이트의 메타데이터와 이미지 파일과 같은 바이너리로 이루어져 있다. 첫번째 바이트는 데이터가 2d 이미지인 경우 0이고 3d 모델인 경우 1이다. 두번째 바이트부터 연이은 네 개의 바이트는 이미지나 3d 모델의 width를 빅엔디언으로 나타낸다. 여섯번째 바이트부터 연이은 네 개의 바이트는 이미지나 3d 모델의 height를 빅엔디언으로 나타낸다. 열번째 바이트부터 연이는 네 개의 바이트는 3d 모델의 depth를 빅엔디언으로 나타내며 2d 이미지인 경우는 0으로 채워진다.
vuforia 파일의 구조는 vuforia에서 사용하는 feature 파일의 구조를 따른다.
이 컴포넌트를 가진 엔티티는 현실에서 트래킹되는 마커를 대변하는 것이며 AR모드 인터랙션에서 직접적으로 조작되는 오브젝트이다. 씬에서 초기 transform을 설정함으로써 마커와 가상 오브젝트 사이의 위치관계가 설정되는 것인데 이를 돕기 위해 노란 가이드 박스를 렌더링 해준다.
active-marker의 엔티티는 씬 루트의 자식으로 하는 것을 강하게 권장한다. 이는 마커와 다른 가상 오브젝트 간의 바인딩 방법의 일관성을 위한 것이다. 바인딩 되는 오브젝트 중에는 마커의 오브젝트 좌표계에서 불변의 transform을 갖는 오브젝트도 있고 그렇지 않은 경우도 있다. 예를 들면 마커가 부착된 물체와 기계적으로 연동되는 다른 물체가 있을 수 있다. 이 경우 마커의 움직임에 종속적으로 움직이지만 transform은 다르게 일어난다. 만약 그러한 오브젝트를 마커 노드의 자식 노드로 둔다면 transform을 연산하는게 상당히 복잡해지며 그러한 시뮬레이션에 필요한 파라미터를 설정해야하는 씬 저작자 입장에서는 전혀 직관적이지 않다. 때문에 이런 경우 해당 오브젝트는 마커의 자식이 아닌게 좋다. 씬 하이어러키 상의 일관성을 위해 권장하는 방법은 모든 마커를 씬루트의 자식으로 놓고 마커와 바인딩되어야 하는 오브젝트들이 이 마커를 참조하여 상황에 맞게 시뮬레이션 되도록 하는 것이다.
base-marker
베이스 마커로 사용할 애셋(target type) URL을 담기 위한 컴포넌트이다. active-marker와 동일한 스키마를 갖는다.
{
src: {type: 'string'}
}
JavaScript
복사
베이스 마커는 하나의 관성계를 대변하며 베이스 마커가 여러개 있더라도 그들의 집합이 하나의 관성계를 대변한다.
AR모드에 진입할때 spatial tracking method로 marker based를 선택했을 때 사용되며 처음으로 액티브 마커와 베이스 마커가 동시에 추적 가능할 때 동적으로 베이스 마커의 transform을 연산하기 때문에 씬에서의 position, rotation, scale 등의 어트리뷰트는 의미가 없다.
base-marker의 엔티티는 씬 루트의 자식으로 한다.
target
액티브 마커의 오브젝트 좌표계에서 transform이 불변인 오브젝트를 위한 컴포넌트이다. 이 컴포넌트는 참조할 액티브 마커 엔티티의 id를 프로퍼티로 갖는다.
{
marker: {type: 'string'}
}
JavaScript
복사
marker의 id를 입력할때는 '#'을 접두사로 붙여야 한다.