다음을 통해 공유


상호 작용기 아키텍처 — 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의 포즈를 수신할 수 있습니다.

예를 들어, GrabInteractorattachTransform은 손/컨트롤러의 잡기 지점에 있습니다. XRRayInteractorattachTransform은 광선 끝의 적중 포인트에 있습니다. CanvasProxyInteractorattachTransform은 마우스가 클릭된 모든 위치에 있습니다. 이러한 서로 다른 모든 상호 작용기의 경우 상호 작용 가능 개체는 조작에 적절하게 응답하기 위해 상호 작용기의 형식에 신경 쓸 필요가 없습니다.

상호 작용 가능 개체는 attachTransform을 쿼리하고 상호 작용기 형식에 관계없이 모든 attachTransform을 동일하게 처리할 수 있습니다.

이 방법은 기존 XRI 상호 작용기와의 호환성은 물론 아직 개발되지 않은 입력 양식에 대한 상호 작용의 향후 보장에 매우 중요합니다. 새 입력 방법이 도입되면 새 상호 작용기가 유효하고 올바르게 작동하는 attachTransform을 생성하는 경우 기존 상호 작용 가능 개체를 변경할 필요가 없습니다.

따라서 철학적으로 attachTransform 상호 작용 논리입니다. 모든 사용자 지정 상호 작용의 경우 새 상호 작용에 맞게 사용자 지정하기 위해 상호 작용 가능 개체를 다시 작성하거나 확장하는 것보다 항상 새 attachTransform 논리를 사용하여 새 상호 작용기를 작성하는 것을 선호합니다. 이러한 방식으로 기존의 모든 상호 작용 가능 개체는 다시 작성하거나 확장한 항목만이 아니라 새로운 상호 작용의 이점을 누릴 수 있습니다.

XRController 및 입력 바인딩

대부분의 상호 작용기는 입력 작업에 직접 바인딩하지 않습니다. 대부분은 XRBaseControllerInteractor에서 파생되며 계층 구조에서 상호 작용기 위에 XRController가 필요합니다. XRController는 입력 작업에 바인딩한 다음, 관련 작업(선택 등)을 연결된 모든 상호 작용기로 전파합니다.

그럼에도 불구하고 일부 상호 작용기에는 XRController가 제공하지 않는 특수 입력 바인딩 또는 추가 입력이 필요할 수 있습니다. 이러한 경우 상호 작용기는 고유한 입력 작업에 직접 바인딩하거나 상호 작용 논리에 대해 입력 시스템이 아닌 다른 원본을 사용할 수도 있습니다. XRI 기본 클래스는 XRController의 바인딩을 수신하는 것을 선호하지만 외부 또는 대체 입력 원본을 사용하도록 이러한 동작을 재정의할 수 있습니다.

인터페이스

XRI는 기본 IXRInteractor, IXRHoverInteractor, IXRSelectInteractorIXRActivateInteractor를 정의합니다. MRTK는 상호 작용기를 위한 추가 인터페이스를 정의합니다. 일부는 MRTK 관련 상호 작용에 대한 추가 정보를 노출하고 다른 일부는 단순히 분류 및 식별을 위한 것입니다. 이러한 인터페이스는 모두 Core 패키지 내에 있으며 구현은 입력을 비롯한 다른 패키지에 있습니다.

중요

이러한 인터페이스는 특정 형식의 상호 작용을 필터링해야 하는 경우에 유용하지만 이러한 인터페이스를 구체적으로 수신하도록 상호 작용을 하드 코딩하지 않는 것이 좋습니다. 모든 상황에서 상호 작용별 인터페이스보다 항상 일반 XRI isSelectedisHovered를 선호합니다.

꼭 필요한 경우가 아니면 상호 작용 가능 개체에서 이러한 인터페이스의 구체적인 MRTK 구현을 참조하지 않아야 합니다. 모든 경우에 인터페이스를 참조하는 것이 좋습니다. 구체적인 형식을 명시적으로 참조하면 상호 작용 가능 개체가 현재 기존 형식에서만 작동하도록 제한됩니다. 인터페이스만 참조하여 기존 구현을 하위 클래스로 분류하지 않을 수 있는 향후 구현과의 호환성을 보장합니다.

IVariableSelectInteractor

이 인터페이스를 구현하는 상호 작용기는 상호 작용 가능 개체에 변수(즉, 아날로그) 선택성을 실행할 수 있습니다. 변수 선택량은 SelectProgress 속성으로 쿼리할 수 있습니다. 이 인터페이스를 구현하는 MRTK 상호 작용기에는 MRTKRayInteractorGazePinchInteractor가 포함됩니다. 기본 상호 작용 가능 개체(기본 XRI 상호 작용 가능 개체 및 MRTKBaseInteractable)는 변수 선택량의 영향을 받지 않습니다. 그러나 StatefulInteractable은 이 값을 수신하고 참여하는 모든 변수 및 비변수 상호 작용기의 max()를 기반으로 Selectedness를 계산합니다.

IGazeInteractor

이 인터페이스를 구현하는 상호 작용기는 조작이나 의도와 별개로 사용자가 수동적으로 응시하는 것을 나타냅니다. MRTK 구현은 FuzzyGazeInteractor이며 XRI XRRayInteractor에서 상속하고 퍼지 콘 캐스팅 논리를 추가합니다. IGazeInteractor가 가리키고 있을 때 XRBaseInteractableIsGazeHovered에 플래그를 지정합니다.

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간접적으로 대상화된 원격 조작을 명시적으로 나타냅니다. 별도의 응시 기반 상호 작용기는 상호 작용의 대상을 구동하며 조작은 손이나 컨트롤러에 의해 수행됩니다. attachTransformIRayInteractorattachTransform과 같은 방식으로 작동합니다. 선택이 시작되면 대상의 적중 포인트에 스냅됩니다.

여러 IGazePinchInteractor가 단일 상호 작용에 참여할 때 attachTransform은 참여하는 모든 손가락 모으기 포인트 사이의 중앙값에서 변위에 의해 오프셋됩니다. 따라서 상호 작용 가능 개체는 잡기 상호 작용 또는 광선 상호 작용의 attachTransforms와 같은 기타 여러 손 상호 작용과 동일한 방식으로 이러한 attachTransform을 해석할 수 있습니다.

MRTK 구현은 GazePinchInteractor입니다.

IHandedInteractor

일부 상호 작용기는 IHandedInteractor 인터페이스를 구현하여 사용자의 특정 손과 연결되어 있음을 명시적으로 지정할 수 있습니다. 일부 상호 작용기는 사용하는 손과 연결되지 않으므로 이를 구현하지 않습니다. 가장 확실한 예는 SpeechInteractor 또는 FuzzyGazeInteractor와 같은 것입니다.

이 인터페이스를 구현하는 MRTK 상호 작용기는 HandJointInteractor, 임의의 손 관절에 의해 구동되는 일반 추상 XRDirectInteractor, GazePinchInteractorMRTKRayInteractor입니다.

상호 작용 가능 개체는 현재 이 인터페이스를 사용하여 선택 시 왼쪽 또는 오른쪽 손 사이를 명확하게 해야 하는 특정 효과를 발생시킵니다. 가장 주목할 만한 예는 UX 구성 요소 라이브러리의 펄스 효과입니다.