Terminologia do sistema de entrada – MRTK2
O sistema de entrada é um dos maiores sistemas de todas as funcionalidades oferecidas pelo MRTK. Muitas coisas no toolkit baseiam-se na mesma (ponteiros, foco, prefabs). O código no sistema de entrada é o que permite interações naturais como agarrar e rodar entre plataformas.
O sistema de entrada tem alguma da sua própria terminologia que vale a pena definir:
Fornecedores de dados
As definições de entrada no perfil de entrada têm referências a entidades conhecidas como fornecedores de dados - outra palavra que descreve estas são gestores de dispositivos. Estes são componentes cuja tarefa consiste em expandir o sistema de entrada MRTK ao interagir com um sistema subjacente específico. Um exemplo de um fornecedor é o fornecedor de Windows Mixed Reality, cujo trabalho é falar com as APIs de Windows Mixed Reality subjacentes e, em seguida, traduzir os dados dessas APIs para conceitos de entrada específicos de MRTK abaixo. Outro exemplo seria o fornecedor OpenVR (cujo trabalho é falar com a versão abstraída do Unity das APIs OpenVR e, em seguida, traduzir esses dados em conceitos de entrada de MRTK).
Controlador
Uma representação de um controlador físico (seja um controlador de 6 graus de liberdade, uma mão de estilo HoloLens 1 com suporte de gestos, uma mão totalmente articulada, um controlador de movimento bissexto, etc.). Os controladores são gerados por gestores de dispositivos (ou seja, o gestor de dispositivos WMR gerará um controlador e gerirá a sua duração quando vir uma mão articulada a surgir).
Ponteiro
Os controladores utilizam ponteiros para interagir com objetos de jogo. Por exemplo, o ponteiro de interação próximo é responsável por detetar quando a mão (que é um controlador) está próxima de objetos que se anunciam como suportando "interação próxima". Outros exemplos para ponteiros são teletransporte ou ponteiros distantes (ou seja, o ponteiro de raios da mão da shell) que utilizam raycasts distantes para interagir com conteúdos que são mais longos do que o comprimento dos braços do utilizador.
Os ponteiros são criados pelo gestor de dispositivos e, em seguida, anexados a uma origem de entrada. Para obter todos os ponteiros de um controlador, faça:
controller.InputSource.Pointers
Tenha em atenção que um controlador pode ser associado a muitos ponteiros diferentes ao mesmo tempo. Para garantir que isto não se transforma num caos, existe um mediador de ponteiro que controla os ponteiros que podem estar ativos (por exemplo, o mediador irá desativar ponteiros de interação distantes quando for detetada uma interação próxima).
Foco
Os eventos de ponteiro são enviados para objetos em foco. A seleção de foco irá variar consoante o tipo de ponteiro; um ponteiro de raios de mão utilizará raycasts, enquanto um ponteiro de punção utilizará spherecasts. Um objeto tem de implementar IMixedRealityFocusHandler para receber o foco. É possível registar globalmente um objeto para receber eventos de ponteiro não filtrados, mas esta abordagem não é recomendada.
O componente que atualiza os objetos em foco é o FocusProvider
Cursor
Uma entidade associada a um ponteiro que fornece pistas visuais adicionais em torno da interação do ponteiro. Por exemplo, o FingerCursor irá compor um anel à volta do dedo e pode rodar esse anel quando o dedo estiver perto de objetos "quase interacionáveis". Um ponteiro pode ser associado a um único cursor no momento.
Interação e Manipulação
Os objetos podem ser etiquetados com um script de interação ou manipulação. Isto pode ser através de um
Interactable
, ou algo como/NearInteractionGrabbable
ManipulationHandler
.Por exemplo, NearInteractionGrabbable e NearInteractionTouchable permitem que determinados ponteiros (especialmente ponteiros de interação próximos) saibam em que objetos podem ser focados.
Interactable e ManipulationHandler são exemplos de componentes que ouvem eventos de ponteiro para modificar elementos visuais da IU ou mover/dimensionar/rodar objetos de jogo.
A imagem abaixo captura a acumulação de alto nível (de baixo para cima) da pilha de entrada MRTK: