Menu manual — MRTK2

Exemplo do Hand Menu UX

Os menus manos permitem que os utilizadores criem rapidamente IU ligada à mão para funções utilizadas frequentemente. Para impedir a ativação falsa enquanto interage com outros objetos, o menu manual fornece opções como "Exigir Mão Plana" e "Utilizar Ativação de Olhar". Recomenda-se que utilize estas opções para impedir a ativação indesejada.

Exemplos de menu de mãos

A cena HandMenuExamples.unity está em MRTK/Examples/Demos/HandTracking/Scenes pasta. Quando estiver em execução, a cena só ativará o tipo de menu selecionado atualmente.
HandMenu_ExampleScene

Pode encontrar estas pré-tarefas do menu manual na MRTK/Examples/Common/Prefabs pasta .

HandMenu_Small_HideOnHandDrop e HandMenu_Medium_HideOnHandDrop

Estes 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 um tempo de interação mais longo, recomenda-se que bloqueie o menu. Neste exemplo, o utilizador pode agarrar e solicitar o bloqueio mundial do menu, além de ativar e desativar os eventos MenuContent on OnFirstHandDetected() e OnLastHandLost( ).
HandMenu_ExampleScene 3

O backplate ManipulationHandler torna-o agarrável e móvel. No evento Manipulação Iniciada , SolverHandler.UpdateSolvers é desativado para bloquear o menu. Além disso, mostra o botão Fechar para permitir que o utilizador feche o menu quando a tarefa estiver concluída. No evento Manipulação Terminada , chama HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine para permitir que o utilizador 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á automaticamente bloqueado no mundo ao largar manualmente. Este comportamento é processado ao não ocultar o menuContent no evento OnLastHandLost( ). Obter & comportamento de solicitação é o mesmo que HandMenu_Large_WorldLock_On_GrabAndPull exemplo.

Scripts

O HandConstraint comportamento fornece um solver que restringe o objeto controlado a uma região segura para conteúdo restrito à mão (como IU manual, menus, etc.). As 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 solver quando a palma da mão está virada para o utilizador.

Veja as sugestões de ferramentas disponíveis para cada HandConstraint propriedade para obter mais documentação. Algumas propriedades são definidas mais detalhadamente abaixo.

HandMenu_ExampleScene palma da mão
  • Zona Segura: a zona segura especifica onde, por sua vez, pretende restringir o conteúdo. Recomenda-se que o conteúdo seja colocado no Lado Ulnar para evitar sobreposição com a mão e uma melhor qualidade de interação. As zonas seguras são calculadas ao levar a orientação das mãos projetada para um plano ortogonal para a vista da câmara e fazer raycast contra uma caixa delimitadora à volta das mãos. As zonas seguras são definidas para funcionar, IMixedRealityHand mas também funcionam com outros tipos de controlador. Recomenda-se explorar o que cada zona segura representa em diferentes tipos de controlador.

  • Seguir a Mão Até à Câmara Virada Com esta definição ativa, o solver seguirá a rotação manual até que o menu esteja suficientemente alinhado com o olhar fixo, altura em que se encontra virado para a câmara. Este comportamento funciona ao alterar o SolverRotationBehavior no HandConstraintSolver, de LookAtTrackedObject para LookAtMainCamera, uma vez que o ângulo GazeAlignment com o solver varia.

Zonas Seguras handMenu
  • Eventos de Ativação: atualmente, aciona HandConstraint quatro eventos de ativação. Estes eventos podem ser utilizados em muitas combinações diferentes para criar comportamentos exclusivos HandConstraint . Veja a cena MRTK/Examples/Demos/HandTracking/Scenes/ HandBasedMenuExample em para obter exemplos destes comportamentos.

    • OnHandActivate: é acionado quando uma mão satisfaz o método IsHandActive.
    • OnHandDeactivate: é acionado quando o método IsHandActive já não está satisfeito.
    • OnFirstHandDetected: ocorre quando o estado de controlo manual muda de nenhuma mão à vista, para a primeira mão na vista.
    • OnLastHandLost: ocorre quando o estado de controlo manual muda de, pelo menos, uma mão na vista para nenhuma mão à vista.
  • Lógica de Ativação/Desativação do Solver: atualmente, a recomendação para ativar e desativar a HandConstraintPalmUp lógica é fazê-lo através do valor UpdateSolver do SolverHandler, em vez de desativar/ativar o objeto. Este comportamento pode ser visto no cenário de exemplo através dos hooks baseados no editor acionados após os eventos ManipulationHandler "OnManipulationStarted/Ended" do menu anexado.

    • Parar a lógica de restrição manual: ao tentar definir o objeto restrito à mão para parar (ou não executar) a lógica de ativação/desativação, defina UpdateSolver como Falso em vez de desativar HandConstraintPalmUp.
      • Se pretender ativar a lógica de reanexação baseada em olhares fixos (ou mesmo não baseada no olhar), siga o passo ao chamar a função HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Esta chamada irá acionar um coroutine que, em seguida, continua a verificar se os critérios "IsValidController" são cumpridos e irá definir UpdateSolver como Verdadeiro assim que estiver (ou se o objeto estiver desativado).
    • Iniciar a lógica de restrição manual: ao tentar definir o objeto restrito à mão para começar a seguir novamente a sua mão (com base no facto de cumprir os critérios de ativação), defina UpdateSolver do SolverHandler como verdadeiro.
  • Voltar a ligar o Logic: atualmente, o HandConstraintPalmUp consegue voltar a anexar automaticamente o objeto de destino ao ponto controlado, independentemente de o UpdateSolver do SolverHandler ser Verdadeiro ou não. Este comportamento é processado através da chamada da função StartWorldLockReattachCheckCoroutine() do HandConstraintPalmUp, depois de ter sido bloqueada pelo mundo (o que, neste caso, está a definir efetivamente o UpdateSolver do SolverHandler como Falso).

Ver também