Treinador de mãos – MRTK2

Hand Coach Menu

O hand coach é uma mão modelada em 3D que é acionada quando o sistema não deteta as mãos do utilizador. Isto é implementado como um componente de "ensino" que ajuda a orientar o utilizador quando o gesto não foi ensinado. Se os utilizadores não tiverem feito o gesto especificado durante um período, as mãos irão fazer um ciclo com um atraso. O técnico de mãos pode ser utilizado para representar premir um botão ou recolher um holograma.

O modelo de interação atual representa uma grande variedade de controlos de gestos, como deslocamento, seleção de longe e quase toque. Abaixo encontra-se uma lista completa dos exemplos de Hand Coach existentes:

  • Quase toque – utilizado para botões ou fechar objetos interagiveis
  • Seleção distante – utilizado para objetos que estão longe
  • Mover – Utilizado para mover um holograma no espaço
  • Rodar – utilizado para mostrar como rodar hologramas ou objetos
  • Dimensionamento – utilizado para mostrar como manipular hologramas para serem maiores ou menores
  • Hand flip – utilizado para criar um painel inicial de IU ou Menus De Mãos
  • Palma da mão – utilizado para o momento do beija-flor na experiência fora da caixa. Outra sugestão poderia ser apresentar um painel de início da IU
  • Deslocamento – utilizado para deslocar uma lista ou um documento longo

Cena de exemplo

Pode encontrar exemplos na cena HandCoachExample em: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

Recursos 3D Da Mão

Pode encontrar os recursos em: MixedRealityToolkit.SDK/Experimental/HandCoach

Qualidade

Se notar distorções na malha esfolada, tem de se certificar de que o projeto está a utilizar a quantidade adequada de articulações. Aceda a Editar > Definições do Projeto Definições > de Projeto Qualidade > Outros > Pesos de Mistura. Certifique-se de que "4 ossos" estão selecionados para ver As Articulações Suaves. Definição do Projeto

Scripts

Sugestão de interação

O InteractionHint.cs script fornece funcionalidade de wrapper para acionar animações e desvanece-se para a plataforma manual.

Como configurar uma sugestão de interação

Para configurar uma sugestão de interação, é recomendado utilizar os prefábs fornecidos "StaticHandCoachRoot_L.prefab" e "StaticHandCoachRoot_R.prefab". Esta pré-base contém o script InteractionHint e a plataforma manual, bem como a hierarquia adequada para garantir que as animações de sugestões fornecidas funcionam conforme pretendido. Caso contrário, terá de colocar o script num gameObject um nível principal acima da sua plataforma manual com o animador.

Propriedades do inspetor

  • HideIfHandTracked Este valor booleano especifica se o estado de controlo manual deve ser utilizado para ocultar elementos visuais quando as mãos de um utilizador estão a ser controladas. Se estiver definido como falso, apenas a propriedade de scripting "customShouldHideVisuals" será utilizada para determinar se pretende ocultar a sugestão.

  • MinDelay Esta propriedade especifica o atraso mínimo para mostrar os elementos visuais. Por predefinição, os elementos visuais da mão serão apresentados após estes segundos se as mãos do utilizador não estiverem a ser controladas.

  • MaxDelay Esta propriedade especifica o atraso máximo para mostrar os elementos visuais. Por predefinição, os elementos visuais da mão serão apresentados após estes muitos segundos, mesmo que as mãos do utilizador estejam a ser controladas.

  • UseMaxTimer Se este valor booleano estiver definido como falso, desativa o temporizador máximo e só permite que a sugestão da mão seja apresentada quando as mãos do utilizador estão fora de vista ou a condição personalizada devolve falso.

  • Repetições Esta propriedade controla quantas vezes a animação de sugestão é reproduzida quando o temporizador mínimo ou máximo já passou. Em seguida, a sugestão oculta e aguarda novamente o atraso.

  • Ativar Automaticamente Quando este valor booleano é definido como verdadeiro, a sugestão será executada automaticamente através da lógica de temporizador quando o GameObject do script estiver ativo na hierarquia e o script estiver ativado. Isto só deve ser definido como falso se pretender controlar manualmente o aspeto e o desaparecimento da sugestão através de código.

  • AnimationState O nome do estado de animação que deve ser reproduzido quando a sugestão está ativa. Isto tem de ser definido antes de a função StartHintLoop() ser chamada (durante OnEnable se a opção Ativar Automaticamente estiver selecionada).

Controlar a InteraçãoHint através do script

  • StartHintLoop Esta função inicia o ciclo mostrar/ocultar que, caso contrário, inicia OnEnable se o sinalizador AutoActivate estiver definido como verdadeiro.
  • StopHintLoop Esta função chama o estado de animação de desvanecimento se não estiver atualmente a ser reproduzido, desativará o ciclo show/hide e definirá a plataforma manual inativa na hierarquia.
  • AnimationState Esta cadeia determina o estado de animação que é reproduzido durante o ciclo. Pode alterar esta cadeia para alterar o estado reproduzido, mas tem de o fazer depois de chamar StopHintLoop e tem de chamar StartHintLoop novamente depois de alterar o estado.
  • CustomShouldHideVisuals Pode definir isto com a sua própria função, que deve devolver verdadeiro quando quiser ocultar os elementos visuais manuais (tenha em atenção o MinMaxTimer, especificamente o parâmetro máximo)

Considerações de animação personalizadas

Os desvanecimentos são predefinidos para 0,5 segundos, pelo que quaisquer animações personalizadas criadas para utilização com a plataforma devem ser mínimas de 1,5 segundos para que quaisquer informações significativas sejam transmitidas

A predefinição fornecida desvanece-se nos estados, Fade_In e Fade_Out podem ser ajustadas ao alterar o carimbo de data/hora do segundo keyframe para definir o comprimento de desvanecimento.

O animador e o script foram configurados de uma forma que deve tornar a configuração o mais simples possível. Para adicionar novos estados de animação, importe simplesmente o fbx, certifique-se de que o nome da animação está definido com um nome distinto e arraste essa animação para o animador.

MoverToTarget

O script MoveToTarget.cs fornece funcionalidades para mover a sugestão de mão de uma posição de controlo 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 nas respetivas hierarquias. Se quiser utilizar este script na sua própria configuração, tem de colocá-lo no gameobject de raiz que contém o Animador para a sua plataforma.

Propriedades do inspetor

  • TrackingObject Defina esta opção com o objeto que pretende que a plataforma siga antes de iniciar o movimento. Recomenda-se criar um GameObject vazio e movê-lo para uma posição específica para o ajudar a identificar o controlo.
  • TargetObject Defina esta opção com o objeto para o qual pretende mover a plataforma durante o movimento. Recomenda-se criar um GameObject vazio e movê-lo para uma posição específica para o ajudar a identificar o controlo.
  • RootObject Defina isto como um elemento principal partilhado entre o controlo e o objeto de destino para que as posições relativas possam ser calculadas corretamente. O pré-fabricado incluído tem objetos de controlo e de destino na respetiva hierarquia, mas pode definir o objeto de destino como um gameObject fora do pré-fabricado e alterar o objeto raiz para um elemento principal partilhado.
  • Duração A quantidade de tempo que deve demorar (em segundos) a passar de TrackingObject para TargetObject em segundos.
  • TargetOffset Um desvio atum para fazer com que o GameObject chegue à posição de destino certa. Isto é útil se a animação incluir um desvio de posição durante a animação.
  • AnimationCurve Esta opção é predefinida para uma curva linear, mas pode alterar a curva para proporcionar um abrandamento ao iniciar e parar a trajetória de movimento.

Controlar o MoveToTarget através do script

No script personalizado, faça uma chamada para Follow() enquanto pretende que a plataforma manual siga o TrackingObject e, em seguida, faça uma chamada para MoveToTargetPosition() quando quiser que a plataforma manual inicie o movimento para o TargetObject.

Controlar o MoveToTarget através de animações

Na animação que precisa de ser movida, defina dois eventos: um com uma chamada para Follow() e outro com uma chamada para MoveToTargetPosition(). O seguimento deve ser definido no primeiro keyframe, uma vez que faz com que a plataforma manual siga o seu TrackingObject. MoveToTargetPosition deve ser definido no keyframe onde pretende que a plataforma comece a mover-se para o destino. É assim que a funcionalidade do script é utilizada nos pré-fabricados fornecidos.

RotateAroundPoint

O script RotateAroundPoint.cs fornece funcionalidades para rodar a sugestão de mão em torno de um ponto dinâmico ao longo do tempo.

Como configurar o RotateAroundPoint

Os pré-fabricados fornecidos "RotatingHandCoachRoot_L.prefab" e "RotatingHandCoachRoot_R.prefab" contêm um RotateAroundPoint nas respetivas hierarquias. Se quiser utilizar este script na sua própria configuração, tem de colocá-lo no gameobject de raiz que contém o Animador para a sua plataforma.

Propriedades do inspetor

  • CenteredParent Defina esta opção com o objeto principal que pretende que a plataforma gira.
  • InverseParent Defina esta opção com o elemento principal para rodar inversamente para centeredParent para manter a orientação da mão igual. Em geral, este será o objeto principal com o script InteractionHint no mesmo.
  • PivotPosition Defina esta opção para um ponto em que pretende que a sugestão inicie o movimento.
  • Duração A quantidade de tempo que deve demorar (em segundos) a rodar em torno do CenteredParent.
  • AnimationCurve Esta opção é predefinida para uma curva linear, mas pode alterar a curva para proporcionar um abrandamento ao iniciar e parar a trajetória de movimento.
  • RotaçãoVector Quantos graus rodar ao longo de cada eixo.

Controlar RotateAroundPoint através de script

No script personalizado, faça uma chamada para RotateToTarget() quando quiser que a plataforma manual inicie a rotação em torno do CenteredParent. Quando quiser que a posição seja reposta para a PivotPosition original, faça uma chamada para ResetAndDeterminePivot().

Controlar o RotateAroundPoint através de animações

Na animação que precisa de ser movida, defina dois eventos: um com uma chamada para ResetAndDeterminePivot() e outro com uma chamada para RotateToTarget(). ResetAndDeterminePivot deve ser definido no primeiro keyframe, uma vez que faz com que a plataforma manual seja reposta para aPosição Dinâmica. RotateToTarget deve ser definido no keyframe onde pretende que a plataforma comece a rodar em torno do CenteredParent. É assim que a funcionalidade do script é utilizada nos pré-fabricados fornecidos.