Menu lateral

Hand Menu UX Example

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.
HandMenu_ExampleScene

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_ExampleScene 1
HandMenu_ExampleScene 2

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().
HandMenu_ExampleScene 3

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.
HandMenu_ExampleScene 4

O botão Fechar reativa SolverHandler.UpdateSolvers e oculta o MenuContent.
HandMenu_ExampleScene 5

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.

HandMenu_ExampleScene Palm up
  • 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.

HandMenu Safe Zones
  • 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 exclusivos HandConstraint , consulte a cena MRTK/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.
  • 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).

Confira também