상호 작용기 아키텍처 — MRTK3
MRTK는 Unity의 XR Interaction Toolkit에서 제공하는 상호 작용기 집합을 기반으로 합니다. 관절형 손 추적, 응시 및 손가락 모으기와 같은 Mixed Reality 기능에는 기본적으로 XRI와 함께 제공되는 집합보다 정교한 상호 작용기가 필요합니다. MRTK는 일반적으로 입력 양식 및 해당 구현으로 분류되는 새로운 상호 작용기 인터페이스를 정의합니다.
요약 및 검토
XRI를 처음 사용하는 개발자의 경우 먼저 Unity의 XRI 아키텍처 설명서를 검토하는 것이 좋습니다. MRTK 상호 작용기는 기존 XRI 상호 작용기의 하위 클래스 또는 XRI 상호 작용기 인터페이스의 구현입니다. MRTK에도 적용되는 상호 작용기 아키텍처에 대한 Unity 설명서를 참조하세요.
XRI의 정상적인 구성
사용자 지정 MRTK 상호 작용기는 기본 XRI 상호 작용기 인터페이스와 관련하여 올바르게 작동합니다. XRI 시스템의 관점에서 보면 "vanilla" 상호 작용기와 구별할 수 없습니다. 그 반대도 사실입니다. MRTK에서 고급 상호 작용 가능 개체를 빌드할 때 기본 XRI 상호 작용기는 여전히 기본 호버 및 선택에서 작동합니다. 기존 XRI 프로젝트와 완벽하게 호환되는 MRTK 활동의 일부입니다. XRI 애플리케이션이 있는 경우 MRTK 상호 작용 가능 개체 및 UI 컨트롤은 기존 "vanilla" XRI 설정과 함께 작동합니다.
입력 양식의 추상화
입력 디바이스, 상호 작용을 수행하는 상호 작용기 및 생성하는 상호 작용 이벤트는 모두 XRI에서 구조적으로 격리됩니다. 이 격리는 MRTK3의 입력 추상화 전략에 중요하며 모든 컨텍스트에서 잘 작동하는 플랫폼 간 및 디바이스 간 상호 작용을 작성할 수 있습니다.
MRTK v2부터 특정 입력 형식 또는 디바이스와 관련된 상호 작용을 코딩하려는 공통된 본능이 있습니다. 많은 개발자는 근거리 잡기, 원거리 광선 또는 기타 특정 입력 형식에 특별히 반응하는 상호 작용을 작성하는 데 익숙합니다.
MRTK3는 여전히 개별 입력 모드의 명확화 및 검색을 허용하지만 특정 개별 입력 형식에 대한 하드 코딩 상호 작용은 인위적으로 상호 작용을 제한하고 상호 작용의 유연성을 감소시킵니다. 이에 대한 자세한 내용은 상호 작용 가능 개체 아키텍처 설명서에서 찾을 수 있지만 상호 작용기의 핵심은 일반적으로 입력 디바이스와 1:1로 매핑할 필요가 없다는 것입니다.
AttachTransform 및 역 제어
MRTK v2가 ObjectManipulator
, Slider
등의 일부로 "논리 이동"에서 수행한 작업의 대부분은 이제 상호 작용기 자체의 책임입니다. 상호 작용기는 이제 특정 형식의 조작이 작동하는 방식을 정의하기 위해 자신의 attachTransform을 제어합니다. 더 이상 입력 방식이 다른 상호 작용 가능 개체 항목에 복잡한 상호 작용 논리를 작성할 필요가 없습니다. 대신 통합 조작 논리는 입력 양식이나 이를 구동하는 디바이스에 관계없이 attachTransform
의 포즈를 수신할 수 있습니다.
예를 들어, GrabInteractor
의 attachTransform
은 손/컨트롤러의 잡기 지점에 있습니다. XRRayInteractor
의 attachTransform
은 광선 끝의 적중 포인트에 있습니다. CanvasProxyInteractor
의 attachTransform
은 마우스가 클릭된 모든 위치에 있습니다. 이러한 서로 다른 모든 상호 작용기의 경우 상호 작용 가능 개체는 조작에 적절하게 응답하기 위해 상호 작용기의 형식에 신경 쓸 필요가 없습니다.
상호 작용 가능 개체는 attachTransform
을 쿼리하고 상호 작용기 형식에 관계없이 모든 attachTransform
을 동일하게 처리할 수 있습니다.
이 방법은 기존 XRI 상호 작용기와의 호환성은 물론 아직 개발되지 않은 입력 양식에 대한 상호 작용의 향후 보장에 매우 중요합니다. 새 입력 방법이 도입되면 새 상호 작용기가 유효하고 올바르게 작동하는 attachTransform
을 생성하는 경우 기존 상호 작용 가능 개체를 변경할 필요가 없습니다.
따라서 철학적으로 attachTransform
상호 작용 논리입니다 . 모든 사용자 지정 상호 작용의 경우 새 상호 작용에 맞게 사용자 지정하기 위해 상호 작용 가능 개체를 다시 작성하거나 확장하는 것보다 항상 새 attachTransform
논리를 사용하여 새 상호 작용기를 작성하는 것을 선호합니다. 이러한 방식으로 기존의 모든 상호 작용 가능 개체는 다시 작성하거나 확장한 항목만이 아니라 새로운 상호 작용의 이점을 누릴 수 있습니다.
XRController 및 입력 바인딩
대부분의 상호 작용기는 입력 작업에 직접 바인딩하지 않습니다. 대부분은 XRBaseControllerInteractor
에서 파생되며 계층 구조에서 상호 작용기 위에 XRController
가 필요합니다. XRController
는 입력 작업에 바인딩한 다음, 관련 작업(선택 등)을 연결된 모든 상호 작용기로 전파합니다.
그럼에도 불구하고 일부 상호 작용기에는 XRController
가 제공하지 않는 특수 입력 바인딩 또는 추가 입력이 필요할 수 있습니다. 이러한 경우 상호 작용기는 고유한 입력 작업에 직접 바인딩하거나 상호 작용 논리에 대해 입력 시스템이 아닌 다른 원본을 사용할 수도 있습니다. XRI 기본 클래스는 XRController
의 바인딩을 수신하는 것을 선호하지만 외부 또는 대체 입력 원본을 사용하도록 이러한 동작을 재정의할 수 있습니다.
인터페이스
XRI는 기본 IXRInteractor
, IXRHoverInteractor
, IXRSelectInteractor
및 IXRActivateInteractor
를 정의합니다. MRTK는 상호 작용기를 위한 추가 인터페이스를 정의합니다. 일부는 MRTK 관련 상호 작용에 대한 추가 정보를 노출하고 다른 일부는 단순히 분류 및 식별을 위한 것입니다. 이러한 인터페이스는 모두 Core 패키지 내에 있으며 구현은 입력을 비롯한 다른 패키지에 있습니다.
중요
이러한 인터페이스는 특정 형식의 상호 작용을 필터링해야 하는 경우에 유용하지만 이러한 인터페이스를 구체적으로 수신하도록 상호 작용을 하드 코딩하지 않는 것이 좋습니다. 모든 상황에서 상호 작용별 인터페이스보다 항상 일반 XRI isSelected 및 isHovered를 선호합니다.
꼭 필요한 경우가 아니면 상호 작용 가능 개체에서 이러한 인터페이스의 구체적인 MRTK 구현을 참조하지 않아야 합니다. 모든 경우에 인터페이스를 참조하는 것이 좋습니다. 구체적인 형식을 명시적으로 참조하면 상호 작용 가능 개체가 현재 기존 형식에서만 작동하도록 제한됩니다. 인터페이스만 참조하여 기존 구현을 하위 클래스로 분류하지 않을 수 있는 향후 구현과의 호환성을 보장합니다.
IVariableSelectInteractor
이 인터페이스를 구현하는 상호 작용기는 상호 작용 가능 개체에 변수(즉, 아날로그) 선택성을 실행할 수 있습니다. 변수 선택량은 SelectProgress
속성으로 쿼리할 수 있습니다. 이 인터페이스를 구현하는 MRTK 상호 작용기에는 MRTKRayInteractor
및 GazePinchInteractor
가 포함됩니다. 기본 상호 작용 가능 개체(기본 XRI 상호 작용 가능 개체 및 MRTKBaseInteractable
)는 변수 선택량의 영향을 받지 않습니다. 그러나 StatefulInteractable
은 이 값을 수신하고 참여하는 모든 변수 및 비변수 상호 작용기의 max()
를 기반으로 Selectedness
를 계산합니다.
IGazeInteractor
이 인터페이스를 구현하는 상호 작용기는 조작이나 의도와 별개로 사용자가 수동적으로 응시하는 것을 나타냅니다. MRTK 구현은 FuzzyGazeInteractor
이며 XRI XRRayInteractor
에서 상속하고 퍼지 콘 캐스팅 논리를 추가합니다. IGazeInteractor
가 가리키고 있을 때 XRBaseInteractable
은 IsGazeHovered
에 플래그를 지정합니다.
IGrabInteractor
이 인터페이스를 구현하는 상호 작용기는 실제 근거리 잡기 상호 작용을 나타냅니다. attachTransform
은 잡기 지점으로 정의됩니다. MRTK 구현은 XRI의 XRDirectInteractor
를 서브클래싱하는 GrabInteractor
입니다.
IPokeInteractor
이 인터페이스를 구현하는 상호 작용기는 찌르기 상호 작용을 나타냅니다. 이는 반드시 손가락을 의미하지는 않습니다! 임의의 상호 작용기는 이 인터페이스를 구현하고 손가락이 아닌 원본에서 찌르기 상호 작용을 제공할 수 있습니다. 상호 작용기 인터페이스를 확인하는 것이 좋은 몇 안 되는 경우 중 하나에서 PressableButton
과 같은 상호 작용 가능 개체는 특히 용적 측정 누르기를 구동하기 위해 IPokeInteractor
를 수신합니다. IPokeInteractor
를 구현하는 모든 상호 작용기는 단추를 3D로 누르도록 유도합니다.
IPokeInteractor
는 찌르기 개체의 특성을 정의하는 PokeRadius
속성을 노출합니다. 찌르기는 attachTransform
의 중앙에 있는 것으로 간주되고 PokeRadius
에 의해 attachTransform
에서 바깥쪽으로 확장됩니다. PressableButton
과 같은 상호 작용 가능 개체는 이 반경만큼 3D 푸시 거리를 상쇄하며, 이는 손가락 기반 누르기의 경우 사용자의 실제 손가락 두께에 의해 구동될 수 있습니다.
이 인터페이스의 MRTK 구현은 PokeInteractor
입니다. 템플릿 프로젝트에서는 손가락으로 작동하지 않는 IPokeInteractor
의 또 다른 예도 제공합니다. PenInteractor
는 가상 3D 스타일러스의 끝 부분에 기반을 둔 찌르기 상호 작용을 제공합니다.
IRayInteractor
이 인터페이스를 구현하는 상호 작용기는 광선 기반 포인팅 상호 작용을 나타냅니다. attachTransform
은 선택하는 동안 대상 개체의 표면에서 광선의 적중 위치를 나타냅니다.
이 인터페이스의 MRTK 구현은 MRTKRayInteractor
이며 XRI XRRayInteractor
에서 직접 상속됩니다.
참고
XRI XRRayInteractor
는 이 MRTK 인터페이스를 구현하지 않습니다.
ISpeechInteractor
이 인터페이스를 구현하는 상호 작용기는 음성 기반 상호 작용을 나타냅니다. MRTK 구현은 SpeechInteractor
입니다.
MRTK SpeechInteractor
는 내부적으로 PhraseRecognitionSubsystem
을 사용하고 XRI XRInteractionManager
에서 상호 작용 가능 개체 등록 이벤트를 구독합니다. 그러나 상호 작용 가능 개체는 음성 처리를 수행하는 하위 시스템에 대해 걱정할 필요가 없습니다. ISpeechInteractor
는 다른 상호 작용기와 동일한 XRI 이벤트(선택 등)를 생성합니다.
IGazePinchInteractor
이 인터페이스는 특수화된 IVariableSelectInteractor
인터페이스일 뿐입니다. 이 인터페이스를 구현하는 상호 작용기는 암시적으로 변수 선택 상호 작용기입니다. IGazePinchInteractor
간접적으로 대상화된 원격 조작을 명시적으로 나타냅니다. 별도의 응시 기반 상호 작용기는 상호 작용의 대상을 구동하며 조작은 손이나 컨트롤러에 의해 수행됩니다. attachTransform
은 IRayInteractor
의 attachTransform
과 같은 방식으로 작동합니다. 선택이 시작되면 대상의 적중 포인트에 스냅됩니다.
여러 IGazePinchInteractor
가 단일 상호 작용에 참여할 때 attachTransform
은 참여하는 모든 손가락 모으기 포인트 사이의 중앙값에서 변위에 의해 오프셋됩니다. 따라서 상호 작용 가능 개체는 잡기 상호 작용 또는 광선 상호 작용의 attachTransforms
와 같은 기타 여러 손 상호 작용과 동일한 방식으로 이러한 attachTransform
을 해석할 수 있습니다.
MRTK 구현은 GazePinchInteractor
입니다.
IHandedInteractor
일부 상호 작용기는 IHandedInteractor
인터페이스를 구현하여 사용자의 특정 손과 연결되어 있음을 명시적으로 지정할 수 있습니다. 일부 상호 작용기는 사용하는 손과 연결되지 않으므로 이를 구현하지 않습니다. 가장 확실한 예는 SpeechInteractor
또는 FuzzyGazeInteractor
와 같은 것입니다.
이 인터페이스를 구현하는 MRTK 상호 작용기는 HandJointInteractor
, 임의의 손 관절에 의해 구동되는 일반 추상 XRDirectInteractor
, GazePinchInteractor
및 MRTKRayInteractor
입니다.
상호 작용 가능 개체는 현재 이 인터페이스를 사용하여 선택 시 왼쪽 또는 오른쪽 손 사이를 명확하게 해야 하는 특정 효과를 발생시킵니다. 가장 주목할 만한 예는 UX 구성 요소 라이브러리의 펄스 효과입니다.