Treinador de mãos – MRTK2
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.
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.