Terminologia do sistema de entrada — MRTK2
O sistema de entrada é um dos maiores sistemas de todos os recursos oferecidos pelo MRTK. Tantas coisas dentro do kit de ferramentas se baseiam nele (ponteiros, foco, pré-fabricados). O código dentro do sistema de entrada é o que permite interações naturais, como capturar e girar entre plataformas.
O sistema de entrada tem algumas de suas próprias terminologias que valem a pena definir:
Provedores de dados
As configurações de entrada no perfil de entrada têm referências a entidades conhecidas como provedores de dados – outra palavra que descreve essas são gerenciadores de dispositivos. Esses são componentes cujo trabalho é estender o sistema de entrada mrtk ao fazer a interfacagem com um sistema subjacente específico. Um exemplo de provedor é o provedor Windows Mixed Reality, cujo trabalho é conversar com as APIs de Windows Mixed Reality subjacentes e, em seguida, traduzir os dados dessas APIs para conceitos de entrada específicos do MRTK abaixo. Outro exemplo seria o provedor OpenVR (cujo trabalho é falar com a versão abstrata do Unity das APIs do OpenVR e, em seguida, converter esses dados em conceitos de entrada do MRTK).
Controller
Uma representação de um controlador físico (seja um controlador de 6 graus de liberdade, uma mão estilo HoloLens 1 com suporte a gestos, uma mão totalmente articulada, um controlador de movimento bissexto etc.). Os controladores são gerados por gerenciadores de dispositivos (ou seja, o gerenciador de dispositivos WMR gerará um controlador e gerenciará seu tempo de vida quando vir uma mão articulada chegando à existência).
Ponteiro
Os controladores usam ponteiros para interagir com objetos de jogo. Por exemplo, o ponteiro de interação próxima é responsável por detectar quando a mão (que é um controlador) está próxima de objetos que se anunciam como suporte à "interação próxima". Outros exemplos para ponteiros são teletransporte ou ponteiros distantes (ou seja, o ponteiro de raio de mão do shell) que usam raycasts distantes para se envolver com conteúdo maior que o comprimento dos braços do usuário.
Os ponteiros são criados pelo gerenciador de dispositivos e anexados a uma fonte de entrada. Para obter todos os ponteiros de um controlador, faça:
controller.InputSource.Pointers
Observe que um controlador pode ser associado a muitos ponteiros diferentes ao mesmo tempo. Para garantir que isso não se transforme em caos, há um mediador de ponteiro que controla quais ponteiros podem estar ativos (por exemplo, o mediador desabilitará ponteiros de interação distantes quando a interação próxima for detectada).
Foco
Os eventos de ponteiro são enviados para objetos em foco. A seleção de foco varia de acordo com o tipo de ponteiro; um ponteiro de raio de mão usará raycasts, enquanto um ponteiro de cutucada usará spherecasts. Um objeto deve implementar IMixedRealityFocusHandler para receber o foco. É possível registrar globalmente um objeto para receber eventos de ponteiro não filtrados, mas essa abordagem não é recomendada.
O componente que atualiza quais objetos estão em foco é o FocusProvider
Cursor
Uma entidade associada a um ponteiro que fornece indicações visuais adicionais em torno da interação do ponteiro. Por exemplo, o FingerCursor renderizará um anel ao redor do dedo e poderá girar esse anel quando o dedo estiver perto de objetos "quase interativos". Um ponteiro pode ser associado a um único cursor no momento.
Interação e manipulação
Os objetos podem ser marcados com um script de interação ou manipulação. Isso pode ser por meio 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 quais objetos podem ser focados.
Interactable e ManipulationHandler são exemplos de componentes que escutam eventos de ponteiro para modificar visuais da interface do usuário ou mover/dimensionar/girar objetos de jogo.
A imagem abaixo captura o build de alto nível (de baixo para cima) da pilha de entrada do MRTK: