Compartilhar via


Hand coach — MRTK2

Hand Coach Menu

O hand coach é uma mão modelada em 3D que é disparada quando o sistema não detecta as mãos do usuário. Isso é implementado como um componente de "ensino" que ajuda a orientar o usuário quando o gesto não foi ensinado. Se os usuários não tiverem feito o gesto especificado por um período, as mãos farão loop com um atraso. O hand coach pode ser usado para representar pressionar um botão ou pegar um holograma.

O modelo de interação atual representa uma ampla variedade de controles de gesto, como rolagem, seleção distante e toque próximo. Abaixo está uma lista completa de exemplos existentes do Hand coach:

  • Toque próximo – usado para botões ou para fechar objetos interacionáveis
  • Seleção distante – usada para objetos que estão distantes
  • Mover – usado para mover um holograma no espaço
  • Girar – usado para mostrar como girar hologramas ou objetos
  • Escala – usado para mostrar como manipular hologramas para serem maiores ou menores
  • Inversão de mão – usado para criar um painel inicial da interface do usuário ou menus de mão
  • Palm up – usado para o momento de beija-flor na experiência pronta para uso. Outra sugestão pode ser abrir um painel inicial da interface do usuário
  • Rolagem – usado para rolar uma lista ou um documento longo

Cena de exemplo

Você pode encontrar exemplos na cena HandCoachExample em: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

Ativos 3D de mão

Você pode encontrar os ativos em: MixedRealityToolkit.SDK/Experimental/HandCoach

Qualidade

Se você observar distorções na malha esfolada, precisará garantir que seu projeto esteja usando a quantidade adequada de articulações. Acesse Editar > Configurações > do Projeto do Unity Qualidade > Outros > Pesos de Combinação. Verifique se "4 ossos" estão selecionados para ver Articulações Suaves. Configuração do Projeto

Scripts

Dica de interação

O InteractionHint.cs script fornece funcionalidade de wrapper para disparar animações e fades para a plataforma de mão.

Como configurar uma dica de interação

Para configurar uma dica de interação, é recomendável usar os pré-fabricados fornecidos "StaticHandCoachRoot_L.prefab" e "StaticHandCoachRoot_R.prefab". Essa pré-fabricado contém o script InteractionHint e a plataforma manual, bem como a hierarquia adequada para garantir que as animações de dica fornecidas funcionem conforme o esperado. Caso contrário, você precisará colocar o script em um gameObjeto um nível pai acima da plataforma de mão com o animador.

Propriedades do inspetor

  • HideIfHandTracked Esse booliano especifica se o estado de acompanhamento manual deve ser usado para ocultar visuais quando as mãos de um usuário estão sendo rastreadas. Se isso for definido como false, somente a propriedade de script "customShouldHideVisuals" será usada para determinar se deseja ocultar a dica.

  • MinDelay Essa propriedade especifica o atraso mínimo para mostrar os visuais. Por padrão, os visuais da mão aparecerão após esses muitos segundos se as mãos do usuário não estiverem sendo rastreadas.

  • MaxDelay Essa propriedade especifica o atraso máximo para mostrar os visuais. Por padrão, os visuais da mão aparecerão após esses muitos segundos, mesmo que as mãos do usuário estejam sendo rastreadas.

  • UseMaxTimer Se esse booliano estiver definido como false, ele desabilitará o temporizador máximo e só permitirá que a dica de mão seja mostrada quando as mãos do usuário estiverem fora de exibição ou a condição personalizada retornar false.

  • Repete Essa propriedade controla quantas vezes a animação de dica é reproduzida quando o temporizador mínimo ou máximo é passado. Em seguida, a dica oculta e aguarda o atraso novamente.

  • Ativar automaticamente Quando esse booliano for definido como true, a dica será executada automaticamente pela lógica do temporizador quando o GameObject do script estiver ativo na hierarquia e o script estiver habilitado. Isso só deve ser definido como false se você pretende controlar manualmente a aparência da dica e o desaparecimento por meio do código.

  • AnimationState O nome do estado de animação que deve ser reproduzido quando a dica estiver ativa. Isso deve ser definido antes que a função StartHintLoop() seja chamada (durante OnEnable se a Ativação Automática estiver marcada).

Controlando InteraçãoHint por meio de script

  • StartHintLoop Essa função iniciará o loop show/hide que, de outra forma, iniciará OnEnable se o sinalizador Desativar Automaticamente estiver definido como true.
  • StopHintLoop Essa função chamará o estado de animação fade out se ele não estiver sendo reproduzido no momento, desativará o loop show/hide e definirá a plataforma de mão inativa na hierarquia.
  • AnimationState Essa cadeia de caracteres determina qual estado de animação é reproduzido durante o loop. Você pode alterar essa cadeia de caracteres para alterar qual estado é reproduzido, mas deve fazê-lo depois de chamar StopHintLoop e chamar StartHintLoop novamente depois de alterar o estado.
  • CustomShouldHideVisuals Você pode definir isso com sua própria função, que deve retornar true quando quiser ocultar os visuais de mão (tenha em mente o MinMaxTimer, especificamente o parâmetro max)

Considerações sobre animação personalizada

Os fades são padronizados como 0,5 segundos, portanto, todas as animações personalizadas criadas para uso com a plataforma devem ser mínimas de 1,5 segundo para que qualquer informação significativa seja transmitida

Os estados de fade in e fade out padrão fornecidos, Fade_In e Fade_Out podem ser ajustados alterando o carimbo de data/hora do segundo quadro-chave para definir o comprimento do fade.

O animador e o script foram configurados de uma maneira que deve tornar a configuração o mais simples possível. Para adicionar novos estados de animação, basta importar seu fbx, garantir que o nome da animação seja definido com um nome distinto e arraste essa animação para o animador.

MoveToTarget

O script MoveToTarget.cs fornece funcionalidade para mover a dica de mão de uma posição de rastreamento para uma posição de destino ao longo do tempo.

Como configurar o MoveToTarget

Os pré-fabricados fornecidos "MovingHandCoachRoot_L.prefab" e "MovingHandCoachRoot_R.prefab" contêm um MoveToTarget em suas hierarquias. Se você quiser usar esse script em sua própria configuração, será necessário colocá-lo no conjunto de jogos raiz que contém o Animador para sua plataforma.

Propriedades do inspetor

  • TrackingObject Defina isso com o objeto que você deseja que a plataforma siga antes de iniciar seu movimento. É recomendável criar um GameObject vazio e movê-lo para uma posição específica para ajudá-lo a identificar o rastreamento.
  • Targetobject Defina isso com o objeto para o qual você deseja que a plataforma se mova durante o movimento. É recomendável criar um GameObject vazio e movê-lo para uma posição específica para ajudá-lo a identificar o rastreamento.
  • Rootobject Defina isso como um pai compartilhado entre o rastreamento e o objeto de destino para que as posições relativas possam ser calculadas corretamente. O prefab incluído tem objetos de rastreamento e de destino em sua hierarquia, mas você pode definir o objeto de destino como um gameObject fora do prefab e alterar o objeto raiz para um pai compartilhado.
  • Duração A quantidade de tempo que deve levar (em segundos) para passar de TrackingObject para TargetObject em segundos.
  • TargetOffset Um deslocamento ajustável para que o GameObject chegue à posição de destino certa. Isso será útil se a animação incluir um deslocamento de posição durante a animação.
  • AnimationCurve Isso é padronizado para uma curva linear, mas você pode alterar a curva para fornecer uma facilitação ao iniciar e parar o caminho de movimento.

Controlando MoveToTarget por meio de script

Em seu script personalizado, faça uma chamada para Follow() enquanto quiser que a plataforma de mão esteja seguindo TrackingObject e faça uma chamada para MoveToTargetPosition() quando quiser que a plataforma de mão inicie seu movimento para o TargetObject.

Controlando MoveToTarget por meio de animações

Na animação que precisa ser movida, defina dois eventos: um com uma chamada para Follow() e outro com uma chamada para MoveToTargetPosition(). Siga deve ser definido no primeiro quadro-chave, pois faz com que a plataforma de mão siga seu TrackingObject. MoveToTargetPosition deve ser definido no quadro-chave em que você deseja que a plataforma comece a se mover para o destino. É assim que a funcionalidade de script é usada nos pré-fabricados fornecidos.

RotateAroundPoint

O script RotateAroundPoint.cs fornece funcionalidade para girar a dica de mão em torno de um ponto dinâmico ao longo do tempo.

Como configurar RotateAroundPoint

Os pré-fabricados fornecidos "RotatingHandCoachRoot_L.prefab" e "RotatingHandCoachRoot_R.prefab" contêm um RotateAroundPoint em suas hierarquias. Se você quiser usar esse script em sua própria configuração, será necessário colocá-lo no conjunto de jogos raiz que contém o Animador para sua plataforma.

Propriedades do inspetor

  • CenteredParent Defina isso com o objeto pai que você deseja que a plataforma dinamize.
  • InverseParent Defina isso com o pai para girar inverso para centeredParent para manter a orientação da mão a mesma. Em geral, esse será o objeto pai com o script InteractionHint nele.
  • PivotPosition Defina isso como um ponto em que você deseja que a dica inicie o movimento.
  • Duração A quantidade de tempo que deve levar (em segundos) para girar ao redor do CenteredParent.
  • AnimationCurve Isso é padronizado para uma curva linear, mas você pode alterar a curva para fornecer uma facilitação ao iniciar e parar o caminho de movimento.
  • RotationVector Quantos graus devem ser girados ao longo de cada eixo.

Controlando RotateAroundPoint por meio de script

Em seu script personalizado, faça uma chamada para RotateToTarget() quando quiser que a plataforma de mão inicie sua rotação ao redor do CenteredParent. Quando você quiser que a posição seja redefinida para a PivotPosition original, faça uma chamada para ResetAndDeterminePivot().

Controlando RotateAroundPoint por meio de animações

Na animação que precisa ser movida, defina dois eventos: um com uma chamada para ResetAndDeterminePivot() e outro com uma chamada para RotateToTarget(). ResetAndDeterminePivot deve ser definido no primeiro quadro-chave, pois faz com que a plataforma de mão seja redefinida para a PivotPosition. RotateToTarget deve ser definido no quadro-chave em que você deseja que a plataforma comece a girar ao redor do CenteredParent. É assim que a funcionalidade de script é usada nos pré-fabricados fornecidos.