Arquitectura del interactor: MRTK3

MRTK se basa en el conjunto de interactores que ofrece el kit de herramientas de interacción XR de Unity. Las características de realidad mixta, como el seguimiento articulado de manos, la mirada y el pellizco, requieren interactuadores más elaborados que el conjunto proporcionado con XRI de forma predeterminada. MRTK define nuevas interfaces de interactor, categorizadas generalmente por la modalidad de entrada y las implementaciones correspondientes.

Resumen y revisión

Para los desarrolladores que no están familiarizados con XRI, se recomienda revisar primero la documentación de arquitectura XRI de Unity. Los interactuantes de MRTK son subclases de interactores XRI existentes o implementaciones de las interfaces de interactor de XRI. Consulte la documentación de Unity sobre su arquitectura de interactor que también se aplica a MRTK.

Buenos ciudadanos de XRI

Los interactores de MRTK personalizados se comportan bien con respecto a las interfaces de interactor XRI predeterminadas; desde la perspectiva de los sistemas XRI, son indistinguibles de los interactuantes de "vainilla". El inverso también es true; Al crear elementos interactables avanzados en MRTK, los interactuantes de XRI predeterminados seguirán funcionando para mantener el puntero básico y seleccionar. Forma parte del esfuerzo de MRTK por ser totalmente compatible con los proyectos XRI existentes. Si tiene una aplicación XRI, los controles de interfaz de usuario e interactables de MRTK funcionarán con la configuración de XRI "vainilla" existente.

Abstracción de la modalidad de entrada

El dispositivo de entrada, el interactor que realiza la interacción y los eventos de interacción que generan están aislados arquitectónicamente en XRI. Este aislamiento es fundamental para la estrategia de abstracción de entrada en MRTK3 y nos permite escribir interacciones multiplataforma y entre dispositivos que funcionan bien en todos los contextos.

En MRTK v2, hay un instinto común para codificar interacciones específicas de un tipo o dispositivo de entrada determinado. Muchos desarrolladores están acostumbrados a escribir interacciones que reaccionan específicamente a una toma cercana, un rayo lejano o algún otro tipo de entrada específico.

Aunque MRTK3 todavía permite la desambiguación y detección de modos de entrada individuales, las interacciones de codificación rígida con tipos de entrada individuales específicos limitan artificialmente y reducen la flexibilidad de las interacciones. Puede encontrar más información sobre esto en la documentación de arquitectura interactable, pero la clave para los interactuantes es que, por lo general, no tienen que asignar 1:1 con dispositivos de entrada.

AttachTransform e Inversion of Control

Gran parte de lo que MRTK v2 hizo en "mover lógicas" como parte de ObjectManipulator, Slidery así sucesivamente, es ahora responsabilidad del propio interactor. El interactor ahora controla su attachTransform para definir cómo se comporta un tipo específico de manipulación. Ya no es necesario escribir lógica de interacción compleja en el interactable que difiere entre las modalidades de entrada; en su lugar, la lógica de manipulación unificada puede escuchar la attachTransformposición del usuario independientemente de la modalidad de entrada o del dispositivo que la conduce.

Por ejemplo, un GrabInteractorobjeto 's attachTransform se encuentra en el punto de agarramiento de la mano o el controlador. attachTransform Se XRRayInteractorencuentra en el punto de acierto al final del rayo. El CanvasProxyInteractor's attachTransform se encuentra dondequiera que el mouse haya hecho clic. Para todos estos distintos interactuantes, el interactable no tiene que preocuparse por el tipo de interactor para responder adecuadamente a las manipulaciones.

El interactable consulta y attachTransform puede tratar cada attachTransform uno de los mismos independientemente del tipo de interactor.

Este enfoque es fundamental para la compatibilidad con los interactuantes de XRI existentes, así como para la corrección futura de las interacciones de las modalidades de entrada que aún no se han desarrollado. Si se introduce un nuevo método de entrada, no es necesario modificar los interactables existentes si el nuevo interactor genera un comportamiento válido y correcto attachTransform.

Por lo tanto, filosóficamente, es la attachTransform lógica de interacción. En el caso de las interacciones personalizadas, siempre dé preferencia a escribir un nuevo interactor con una nueva attachTransform lógica en lugar de volver a escribir o ampliar los interactables para personalizarlos para la nueva interacción. De este modo, todos los interactables existentes pueden disfrutar de las ventajas de su nueva interacción en lugar de solo las que ha reescrito o ampliado.

XRControllers y enlace de entrada

La mayoría de los interactuantes no se enlazan directamente a las acciones de entrada. La mayoría derivan de XRBaseControllerInteractor, que requiere un XRController valor superior al interactor de la jerarquía. Se XRController enlaza a las acciones de entrada y, a continuación, propaga las acciones pertinentes (selección, etc.) a todos los interactuantes asociados.

No obstante, es posible que algunos interactúantes necesiten enlaces de entrada especiales o entradas adicionales que no proporcione.XRController En estos casos, los interactuantes tienen la opción de enlazar directamente a sus propias acciones de entrada únicas o incluso usar otros orígenes del sistema que no son de entrada para la lógica de interacción. Las clases base de XRI prefieren escuchar los XRControllerenlaces de los , pero estos comportamientos se pueden invalidar para usar orígenes de entrada externos o alternativos.

Interfaces

XRI define los elementos básicos IXRInteractor, IXRHoverInteractor, IXRSelectInteractory IXRActivateInteractor. MRTK define interfaces adicionales para los interactuantes. Algunas exponen información adicional sobre interacciones específicas de MRTK y otras simplemente son para categorización e identificación. Todas estas interfaces se encuentran dentro del paquete Core , mientras que las implementaciones residen en otros paquetes, incluida la entrada.

Importante

Aunque estas interfaces son útiles si necesita filtrar por un tipo específico de interacción, se recomienda no codificar de forma rígida las interacciones para escuchar estas interfaces específicamente. En cada situación, siempre dé preferencia al XRI genérico isSelected y isHovered, en lugar de cualquier interfaz específica de interacción.

A menos que sea necesario, no debe hacer referencia a las implementaciones concretas de MRTK de estas interfaces en interactables, a menos que sea absolutamente necesario. En todos los casos, es mejor hacer referencia a las interfaces. Hacer referencia explícitamente a los tipos concretos restringirá los elementos interactables para que solo funcionen con los tipos actuales existentes. Al hacer referencia solo a las interfaces, se garantiza la compatibilidad con implementaciones futuras que no pueden subclase las implementaciones existentes.

IVariableSelectInteractor

Los interactuadores que implementan esta interfaz pueden emitir selección de variable (es decir, analógica) a los interactables. La cantidad de selección de variable se puede consultar con la SelectProgress propiedad . Los interactuadores de MRTK que implementan esta interfaz incluyen y MRTKRayInteractorGazePinchInteractor. Los elementos interactables base (los objetos XRI interactables predeterminados y MRTKBaseInteractable) no se verán afectados por la cantidad de selección de variables; StatefulInteractablesin embargo, escucha este valor y calcula su Selectedness en función de la max() de todos los interactuantes variables y no variables participantes.

IGazeInteractor

Los interactuadores que implementan esta interfaz representan la mirada pasiva del usuario, independiente de cualquier manipulación o intención. La implementación de MRTK es FuzzyGazeInteractor, que hereda de XRI XRRayInteractory agrega lógica de conversión de cono aproximada. XRBaseInteractable marcará IsGazeHovered cuando se IGazeInteractor mantenga el puntero.

IGrabInteractor

Los interactuadores que implementan esta interfaz representan una interacción física cercana a la captura de campo. attachTransform se define como el punto de captura. La implementación de MRTK es GrabInteractor, que subclases de XRDirectInteractorXRI.

IPokeInteractor

Los interactuadores que implementan esta interfaz representan una interacción de inserción. Tenga en cuenta que esto no implica necesariamente un dedo. Los interactuadores arbitrarios pueden implementar esta interfaz y ofrecer interacciones de inserción desde orígenes que no son de los dedos. En una de las pocas instancias en las que la comprobación de interfaces interactuables es una buena idea, se pueden interactuar, como PressableButton escuchar s IPokeInteractor, específicamente, para impulsar la presión volumétrica. Cualquier interactor que implemente inducirá presiones IPokeInteractor 3D en los botones.

IPokeInteractor expone la PokeRadius propiedad , que define las características del objeto de inserción. Se considera que el poke se centra en attachTransform y se extiende hacia fuera desde por attachTransform .PokeRadius Los interactables como PressableButton compensan su distancia de inserción 3D por este radio, que puede ser controlado por el grosor físico del dedo del usuario en el caso de las prensas basadas en dedos.

La implementación de MRTK de esta interfaz es PokeInteractor. En nuestro proyecto de plantilla, también proporcionamos otro ejemplo de IPokeInteractor que no está controlado por los dedos; PenInteractor proporciona interacciones de poke basadas en la punta de un lápiz 3D virtual.

IRayInteractor

Los interactuadores que implementan esta interfaz representan una interacción de apuntamiento basada en rayos. attachTransform representa la ubicación de acierto del rayo en la superficie del objeto de destino durante una selección.

La implementación de MRTK de esta interfaz es MRTKRayInteractor, que hereda directamente de XRI XRRayInteractor.

Nota:

El XRI XRRayInteractor no implementa esta interfaz MRTK.

ISpeechInteractor

Los interactuadores que implementan esta interfaz representan interacciones controladas por voz. La implementación de MRTK es SpeechInteractor.

MRTK SpeechInteractor, internamente, usa PhraseRecognitionSubsystem y se suscribe a eventos de registro interactables desde XRI XRInteractionManager. Sin embargo, los interactables no deben preocuparse por qué subsistema está realizando el procesamiento de voz; ISpeechInteractorgeneran los mismos eventos XRI (selección, etc.) que cualquier otro interactor.

IGazePinchInteractor

Esta interfaz es simplemente una especialización de la IVariableSelectInteractor interfaz. Los interactuadores que implementan esta interfaz son, implícitamente, interactores de selección de variables. IGazePinchInteractorrepresentan expresamente una manipulación remota dirigida indirectamente. Un interactor basado en mirada independiente controla el destino de la interacción y la manipulación se realiza mediante una mano o un controlador. attachTransform se comporta de la misma manera IRayInteractorque attachTransform lo hace; se ajusta al punto de acierto en el destino cuando se inicia una selección.

Cuando varios IGazePinchInteractors participan en una única interacción, sus attachTransforms se compensan por su desplazamiento desde el punto medio entre todos los puntos de desenlazamiento participantes. Por lo tanto, los interactables pueden interpretarlos attachTransformde la misma manera que lo harían para cualquier otra interacción de varias manos, como las attachTransforms interacciones de captación o las interacciones de rayos.

La implementación de MRTK es .GazePinchInteractor

IHandedInteractor

Algunos interactuadores pueden optar por implementar IHandedInteractor la interfaz para especificar explícitamente que están asociados a una mano determinada de un usuario. Algunos interactuadores no están asociados con la entrega y, por lo tanto, no implementan esto. Los ejemplos más obvios serían como SpeechInteractor o FuzzyGazeInteractor.

Los interactuadores de MRTK que implementan esta interfaz son , HandJointInteractorun genérico, abstracto XRDirectInteractor controlado por una junta de manos arbitraria, y GazePinchInteractorMRTKRayInteractor.

Actualmente, los interactables usan esta interfaz para activar determinados efectos cuando se seleccionan que deben desambiguarse entre una mano izquierda o derecha. El ejemplo más notable de esto es el efecto de pulso en la biblioteca de componentes de la experiencia de usuario.