Compartilhar via


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:

  1. Criar um novo Reconhecedor de Gestos
  2. Especifique quais gestos observar
  3. Inscrever-se em eventos para esses gestos
  4. 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 e teletransporte do Controlador de Movimento
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.

  1. Siga as instruções de Introdução para baixar o Realidade Misturada Toolkit e adicioná-lo ao seu projeto do Unity.
  2. 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 no GetThrownObjectVelAngVel método estático, dentro do pacote vinculado acima:

    1. Como a velocidade angular é conservada, o objeto arremessado deve manter a mesma velocidade angular que tinha no momento do arremesso: objectAngularVelocity = throwingControllerAngularVelocity;

    2. 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);
      
    3. 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
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.

Confira também