Gestos no Unity
Há duas maneiras principais de agir em seu olhar no Unity, gestos com as mãos e controladores de movimento no HoloLens e no HMD imersivo. Você acessa os dados de ambas as fontes de entrada espacial por meio das mesmas APIs no Unity.
O Unity fornece duas maneiras principais de acessar dados de entrada espacial para Windows Mixed Reality. As APIs comuns Input.GetButton/Input.GetAxis funcionam em vários SDKs do Unity XR, enquanto a API InteractionManager/GestureRecognizer específica do Windows Mixed Reality expõe o conjunto completo de dados de entrada espacial.
APIs de gestos compostos de alto nível (GestureRecognizer)
Namespace: UnityEngine.XR.WSA.Input
Tipos: GestureRecognizer, GestureSettings, InteractionSourceKind
Seu aplicativo também pode reconhecer gestos compostos de nível superior para fontes de entrada espacial, gestos de Tocar, Segurar, Manipulação e Navegação. Você pode reconhecer esses gestos compostos em ambas as mãos e controladores de movimento usando o GestureRecognizer.
Cada evento Gesture no GestureRecognizer fornece o SourceKind para a entrada, bem como o raio de cabeça de direcionamento no momento do evento. Alguns eventos fornecem informações adicionais específicas do contexto.
Há apenas algumas etapas necessárias para capturar gestos usando um Reconhecimento de Gestos:
- Criar um novo Reconhecedor de Gestos
- Especifique quais gestos observar
- Inscrever-se em eventos para esses gestos
- Comece a capturar gestos
Criar um novo Reconhecedor de Gestos
Para usar o GestureRecognizer, você deve ter criado um GestureRecognizer:
GestureRecognizer recognizer = new GestureRecognizer();
Especifique quais gestos observar
Especifique em quais gestos você está interessado por meio de SetRecognizableGestures():
recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);
Inscrever-se em eventos para esses gestos
Inscreva-se em eventos para os gestos nos quais você está interessado.
void Start()
{
recognizer.Tapped += GestureRecognizer_Tapped;
recognizer.HoldStarted += GestureRecognizer_HoldStarted;
recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}
Observação
Os gestos de navegação e manipulação são mutuamente exclusivos em uma instância de um GestureRecognizer.
Comece a capturar gestos
Por padrão, um GestureRecognizer não monitora a entrada até que StartCapturingGestures() seja chamado. É possível que um evento de gesto seja gerado depois que StopCapturingGestures() for chamado se a entrada tiver sido executada antes do quadro em que StopCapturingGestures() foi processado. O GestureRecognizer lembrará se ele estava ativado ou desativado durante o quadro anterior em que o gesto realmente ocorreu e, portanto, é confiável iniciar e parar o monitoramento de gestos com base no direcionamento do olhar desse quadro.
recognizer.StartCapturingGestures();
Pare de capturar gestos
Para interromper o reconhecimento de gestos:
recognizer.StopCapturingGestures();
Removendo um reconhecedor de gestos
Lembre-se de cancelar a assinatura de eventos assinados antes de destruir um objeto GestureRecognizer .
void OnDestroy()
{
recognizer.Tapped -= GestureRecognizer_Tapped;
recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}
Renderizando o modelo do controlador de movimento no Unity
Modelo do controlador de movimento e teletransporte
Para renderizar controladores de movimento em seu aplicativo que correspondam aos controladores físicos que seus usuários estão segurando e articulam à medida que vários botões são pressionados, você pode usar o MotionController pré-fabricado no Realidade Misturada Toolkit. Esse pré-fabricado carrega dinamicamente o modelo glTF correto em runtime do driver do controlador de movimento instalado no sistema. É importante carregar esses modelos dinamicamente em vez de importá-los manualmente no editor, para que seu aplicativo mostre modelos 3D fisicamente precisos para todos os controladores atuais e futuros que seus usuários possam ter.
- Siga as instruções de Introdução para baixar o Realidade Misturada Toolkit e adicioná-lo ao seu projeto do Unity.
- Se você substituiu sua câmera pelo pré-fabricado MixedRealityCameraParent como parte das etapas de Introdução, você está pronto para ir! Esse pré-fabricado inclui renderização do controlador de movimento. Caso contrário, adicione Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab à cena do painel Projeto. Você desejará adicionar esse pré-fabricado como filho de qualquer objeto pai que você use para mover a câmera quando o usuário se teletransportar dentro de sua cena, para que os controladores venham junto com o usuário. Se o seu aplicativo não envolver teletransporte, basta adicionar o pré-fabricado na raiz da sua cena.
Jogando objetos
Jogar objetos em realidade virtual é um problema mais difícil do que pode parecer à primeira vista. Como acontece com a maioria das interações físicas, ao jogar atos de jogo de maneira inesperada, é imediatamente óbvio e quebra a imersão. Passamos algum tempo pensando profundamente sobre como representar um comportamento de arremesso fisicamente correto e criamos algumas diretrizes, habilitadas por meio de atualizações em nossa plataforma, que gostaríamos de compartilhar com você.
Você pode encontrar um exemplo de como recomendamos implementar o lançamento aqui. Este exemplo segue estas quatro diretrizes:
Use a velocidade do controlador em vez da posição. Na atualização de novembro para o Windows, introduzimos uma mudança no comportamento quando no estado de rastreamento posicional ''Aproximado''. Quando neste estado, as informações de velocidade sobre o controlador continuarão a ser relatadas enquanto acreditarmos que sua alta precisão, que geralmente é maior do que a posição, permanece com alta precisão.
Incorpore a velocidade angular do controlador. Essa lógica está toda contida no
throwing.cs
arquivo noGetThrownObjectVelAngVel
método estático, dentro do pacote vinculado acima:Como a velocidade angular é conservada, o objeto arremessado deve manter a mesma velocidade angular que tinha no momento do arremesso:
objectAngularVelocity = throwingControllerAngularVelocity;
Como o centro de massa do objeto arremessado provavelmente não está na origem da pose de alça, ele provavelmente tem uma velocidade diferente da do controlador no quadro de referência do usuário. A porção da velocidade do objeto contribuída dessa maneira é a velocidade tangencial instantânea do centro de massa do objeto arremessado em torno da origem do controlador. Essa velocidade tangencial é o produto vetorial da velocidade angular do controlador com o vetor representando a distância entre a origem do controlador e o centro de massa do objeto arremessado.
Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos; Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
A velocidade total do objeto arremessado é a soma da velocidade do controlador e esta velocidade tangencial:
objectVelocity = throwingControllerVelocity + tangentialVelocity;
Preste muita atenção ao tempo em que aplicamos a velocidade. Quando um botão é pressionado, pode levar até 20 ms para que esse evento apareça através do Bluetooth para o sistema operacional. Isso significa que, se você sondar uma alteração de estado do controlador de pressionado para não pressionado ou vice-versa, as informações de pose do controlador que você obtém com ele estarão realmente à frente dessa alteração de estado. Além disso, a pose do controlador apresentada por nossa API de sondagem é prevista para refletir uma pose provável no momento em que o quadro será exibido, o que pode ser mais de 20 ms no futuro. Isso é bom para renderizar objetos retidos, mas agrava nosso problema de tempo para direcionar o objeto à medida que calculamos a trajetória para o momento em que o usuário lançou o arremesso. Felizmente, com a atualização de novembro, quando um evento do Unity como InteractionSourcePressed ou InteractionSourceReleased é enviado, o estado inclui os dados históricos de pose de quando o botão foi pressionado ou liberado. Para obter a renderização e o direcionamento do controlador mais precisos durante os lançamentos, você deve usar corretamente a sondagem e o evento, conforme apropriado:
- Para renderizar cada quadro do controlador, seu aplicativo deve posicionar o GameObject do controlador na pose do controlador prevista para o tempo de fóton do quadro atual. Você obtém esses dados de APIs de sondagem do Unity, como XR. InputTracking.GetLocalPosition ou XR. WSA. Input.InteractionManager.GetCurrentReading.
- Para o direcionamento do controlador em uma imprensa ou versão, seu aplicativo deve fazer raycast e calcular trajetórias com base na pose histórica do controlador para esse evento de imprensa ou versão. Você obtém esses dados de APIs de eventos do Unity, como InteractionManager.InteractionSourcePressed.
Use a pose de alça. A velocidade angular e a velocidade são relatadas em relação à pose de alça, não à pose do ponteiro.
O lançamento continuará a melhorar com futuras atualizações do Windows, e você pode esperar encontrar mais informações sobre isso aqui.
Controladores de gesto e movimento no MRTK
Você pode acessar o controlador de gestos e movimentos no gerenciador de entrada.
Acompanhe com tutoriais
Tutoriais passo a passo, com exemplos de personalização mais detalhados, estão disponíveis na Mixed Reality Academy:
Entrada MR 213 - Controlador de movimento
Próximo ponto de verificação de desenvolvimento
Se você estiver seguindo a jornada de desenvolvimento do Unity que apresentamos, estará explorando os principais blocos de construção do MRTK. Deste ponto, você pode prosseguir para o próximo bloco de construção:
Ou vá diretamente para as funcionalidades e APIs da plataforma de Realidade Misturada:
Você sempre pode voltar para os pontos de verificação de desenvolvimento do Unity a qualquer momento.