Menu lateral
Os menus de mão permitem que os usuários ativem rapidamente a interface do usuário conectada com a mão para funções usadas com frequência. Para evitar a ativação falsa ao interagir com outros objetos, o menu manual fornece opções como 'Exigir Mão Simples' e 'Usar Ativação de Olhar'. É recomendável usar essas opções para evitar a ativação indesejada.
Exemplos de menu manual
A cena HandMenuExamples.unity está sob MRTK/Examples/Demos/HandTracking/Scenes
pasta. Quando estiver em execução, a cena só ativará o tipo de menu selecionado no momento.
Você pode encontrar esses pré-fabricados de menu manual na MRTK/Examples/Demos/HandTracking/Prefabs
pasta.
HandMenu_Small_HideOnHandDrop e HandMenu_Medium_HideOnHandDrop
Esses dois exemplos simplesmente ativam e desativam o objeto MenuContent para mostrar e ocultar o menu no evento OnFirstHandDetected() e OnLastHandLost().
HandMenu_Large_WorldLock_On_GrabAndPull
Para menus mais complexos que exigem tempo de interação mais longo, é recomendável bloquear o menu. Neste exemplo, o usuário pode pegar e efetuar pull para bloquear o menu, além de ativar e desativar os eventos MenuContent em OnFirstHandDetected() e OnLastHandLost().
Backplate torna-o ManipulationHandler
agarrável e móvel. No evento Manipulation Started , SolverHandler.UpdateSolvers é desativado para bloquear o menu. Além disso, ele mostra o botão Fechar para permitir que o usuário feche o menu quando a tarefa for concluída. No evento Manipulação Encerrada , ele chama HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine para permitir que o usuário traga o menu de volta à mão levantando e olhando para a palma da mão.
O botão Fechar reativa SolverHandler.UpdateSolvers e oculta o MenuContent.
HandMenu_Large_AutoWorldLock_On_HandDrop
Este exemplo é semelhante a HandMenu_Large_WorldLock_On_GrabAndPull. A única diferença é que o menu será bloqueado automaticamente na entrega manual. Isso é feito simplesmente por não ocultar o menuContent no evento OnLastHandLost( ). O & comportamento de pull de captura é o mesmo que HandMenu_Large_WorldLock_On_GrabAndPull exemplo.
Scripts
O comportamento HandConstraint
fornece um solucionador que restringe o objeto controlado a uma região segura para conteúdo restrito à mão (como interface do usuário da mão, menus etc.). Regiões seguras são consideradas áreas que não se cruzam com a mão. Uma classe derivada de HandConstraint
chamada HandConstraintPalmUp
também é incluída para demonstrar um comportamento comum de ativar o objeto controlado pelo solucionador quando a palma da mão estiver voltada para o usuário.
Consulte as dicas de ferramenta disponíveis para cada HandConstraint
propriedade para obter documentação adicional. Algumas propriedades são definidas em mais detalhes abaixo.

zona Cofre: a zona segura especifica onde, na mão, restringir o conteúdo. É recomendável que o conteúdo seja colocado no Lado ulnar para evitar a sobreposição com a mão e melhorar a qualidade da interação. Cofre zonas são calculadas tomando a orientação das mãos projetada em um plano ortogonal para o modo de exibição da câmera e raycasting contra uma caixa delimitadora ao redor das mãos. Cofre zonas são definidas para funcionar,
IMixedRealityHand
mas também funcionam com outros tipos de controlador. É recomendável explorar o que cada zona segura representa em diferentes tipos de controlador.Siga a mão até a câmera voltada Com esse ativo, o solucionador seguirá a rotação manual até que o menu esteja suficientemente alinhado com o olhar, momento em que ele fica de frente para a câmera. Isso funciona alterando o SolverRotationBehavior no HandConstraintSolver, de LookAtTrackedObject para LookAtMainCamera conforme o ângulo GazeAlignment com o solucionador varia.

Eventos de ativação: atualmente, os
HandConstraint
gatilhos são quatro eventos de ativação. Esses eventos podem ser usados em muitas combinações diferentes para criar comportamentos exclusivosHandConstraint
, consulte a cenaMRTK/Examples/Demos/HandTracking/Scenes/
HandBasedMenuExample em para obter exemplos desses comportamentos.- OnHandActivate: dispara quando uma mão satisfaz o método IsHandActive.
- OnHandDeactivate: dispara quando o método IsHandActive não é mais atendido.
- OnFirstHandDetected: ocorre quando o estado de acompanhamento da mão muda de nenhuma mão no modo de exibição, para a exibição em primeira mão.
- OnLastHandLost: ocorre quando o estado de acompanhamento da mão muda de pelo menos uma mão na exibição, para nenhuma mão na exibição.
Lógica de Ativação/Desativação do Solver: atualmente, a recomendação para ativar e desativar
HandConstraintPalmUp
a lógica é fazer isso por meio do uso do valor UpdateSolver do SolverHandler, em vez de desabilitar/habilitar o objeto. Isso pode ser visto na cena de exemplo por meio dos ganchos baseados no editor disparados após os eventos "OnManipulationStarted/Ended" do menu anexado.- Parando a lógica de restrição manual: ao tentar definir o objeto restrito à mão para parar (além de não executar a lógica de ativação/desativação), defina UpdateSolver como False em vez de desabilitar HandConstraintPalmUp.
- Se você quiser habilitar a lógica de recolocação baseada em foco (ou mesmo sem foco), isso será seguido chamando a função HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Isso disparará uma coroutina que, em seguida, continuará a verificar se os critérios "IsValidController" são atendidos e definirá UpdateSolver como True quando ele for (ou o objeto estiver desabilitado)
- Iniciando a lógica de restrição manual: ao tentar definir o objeto restrito à mão para começar a seguir sua mão novamente (com base em se ele atende aos critérios de ativação), defina o UpdateSolver do SolverHandler como true.
- Parando a lógica de restrição manual: ao tentar definir o objeto restrito à mão para parar (além de não executar a lógica de ativação/desativação), defina UpdateSolver como False em vez de desabilitar HandConstraintPalmUp.
Lógica de reanexamento: atualmente, ele
HandConstraintPalmUp
é capaz de reanexar automaticamente o objeto de destino ao ponto rastreado, independentemente de o UpdateSolver do SolverHandler ser True ou não. Isso é feito por meio da chamada da função StartWorldLockReattachCheckCoroutine() do HandConstraintPalmUp, depois de ter sido bloqueada pelo mundo (que, nesse caso, está efetivamente definindo o UpdateSolver do SolverHandler como False).