Partilhar via


Gestos em Unidade

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 o Windows Mixed Reality. As APIs comuns Input.GetButton/Input.GetAxis funcionam em vários SDKs 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)

Espaço de nomes: 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 Toque, Espera, Manipulação e Navegação. Você pode reconhecer esses gestos compostos nas mãos e nos 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 segmentação 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. Especificar quais gestos observar
  3. Inscreva-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();

Especificar quais gestos observar

Especifique em quais gestos você está interessado via SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Inscreva-se em eventos para esses gestos

Inscreva-se em eventos para os gestos em que está interessado.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Nota

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 possa ser gerado após StopCapturingGestures() ser chamado se a entrada foi executada antes do quadro onde StopCapturingGestures() foi processado. O GestureRecognizer irá lembrar-se se esteve ligado ou desligado durante o quadro anterior em que o gesto realmente ocorreu, pelo que é fiável iniciar e parar a monitorização de gestos com base na segmentação do olhar deste quadro.

recognizer.StartCapturingGestures();

Parar de capturar gestos

Para parar o reconhecimento de gestos:

recognizer.StopCapturingGestures();

Remover um reconhecedor de gestos

Lembre-se de cancelar a assinatura de eventos inscritos antes de destruir um objeto GestureRecognizer .

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Renderização do modelo do controlador de movimento no Unity

Modelo de controlador de movimento e teletransporte
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 articular à medida que vários botões são pressionados, você pode usar o pré-fabricado MotionController no Kit de Ferramentas de Realidade Mista. Este pré-fabricado carrega dinamicamente o modelo glTF correto em tempo de execução a partir do driver do controlador de movimento instalado do sistema. É importante carregar esses modelos dinamicamente em vez de importá-los manualmente no editor, para que seu aplicativo mostre modelos 3D fisicamente precisos para quaisquer controladores atuais e futuros que seus usuários possam ter.

  1. Siga as instruções de Introdução para baixar o Kit de Ferramentas de Realidade Mista e adicioná-lo ao seu projeto Unity.
  2. Se você substituiu sua câmera pelo pré-fabricado MixedRealityCameraParent como parte das etapas de Introdução, está pronto! Esse pré-fabricado inclui renderização do controlador de movimento. Caso contrário, adicione Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab à sua cena a partir do painel Projeto. Você vai querer adicionar esse pré-fabricado como um filho de qualquer objeto pai que você usa para mover a câmera quando o usuário se teletransporta 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.

Arremesso de objetos

Jogar objetos em realidade virtual é um problema mais difícil do que pode parecer à primeira vista. Tal como acontece com a maioria das interações físicas, quando o jogo age de uma forma inesperada, é imediatamente óbvio e quebra a imersão. Passamos algum tempo pensando profundamente sobre como representar um comportamento de arremesso fisicamente correto e elaboramos 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 muitas vezes é mais longa do que a posição, permanece alta precisão.

  • Incorpore a velocidade angular do controlador. Esta 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 lançado deve manter a mesma velocidade angular que tinha no momento do lançamento: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Como o centro de massa do objeto lançado provavelmente não está na origem da pose de aderência, ele provavelmente tem uma velocidade diferente da do controlador no quadro de referência do usuário. A parte da velocidade do objeto contribuída desta forma é a velocidade tangencial instantânea do centro de massa do objeto lançado em torno da origem do controlador. Esta velocidade tangencial é o produto cruzado da velocidade angular do controlador com o vetor representando a distância entre a origem do controlador e o centro de massa do objeto lançado.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. A velocidade total do objeto lançado é a soma da velocidade do controlador e esta velocidade tangencial: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Preste muita atenção ao momento em que aplicamos a velocidade. Quando um botão é pressionado, pode levar até 20 ms para que esse evento borbulhe através do Bluetooth para o sistema operacional. Isso significa que, se você pesquisar por uma mudança de estado do controlador de pressionado para não pressionado ou o contrário, as informações de pose do controlador que você obtém com ele estarão realmente à frente dessa mudança de estado. Além disso, a pose do controlador apresentada pela nossa API de sondagem está prevista para refletir uma pose provável no momento em que o quadro será exibido, que pode ser de mais de 20 ms no futuro. Isso é bom para renderizar objetos retidos, mas agrava nosso problema de tempo para segmentar o objeto à medida que calculamos a trajetória para o momento em que o usuário liberou o lançamento. Felizmente, com a atualização de novembro, quando um evento Unity como InteractionSourcePressed ou InteractionSourceReleased é enviado, o estado inclui os dados históricos de pose de volta quando o botão foi pressionado ou liberado. Para obter a renderização e a segmentação do controlador mais precisas durante os lançamentos, você deve usar corretamente a sondagem e o evento, conforme apropriado:

    • Para renderizar cada quadro, seu aplicativo deve posicionar o GameObject do controlador na pose do controlador prevista para o futuro para o tempo de fóton do quadro atual. Você obtém esses dados de APIs de sondagem Unity, como XR. InputTracking.GetLocalPosition ou XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Para a segmentação do controlador em uma imprensa ou lançamento, seu aplicativo deve raycast e calcular trajetórias com base na pose histórica do controlador para esse evento de imprensa ou lançamento. Você obtém esses dados de APIs de eventos Unity, como InteractionManager.InteractionSourcePressed.
  • Use a pose de pega. A velocidade angular e a velocidade são relatadas em relação à postura de preensão, não à pose de ponteiro.

O lançamento continuará a melhorar com futuras atualizações do Windows, e você pode esperar encontrar mais informações sobre ele aqui.

Controladores de gestos e movimentos em MRTK

Pode aceder ao controlador de gestos e movimentos a partir do gestor de entradas.

Acompanhe os tutoriais

Tutoriais passo a passo, com exemplos de personalização mais detalhados, estão disponíveis na Academia de Realidade Mista:

MR Input 213 - Controlador de movimento
MR Input 213 - Controlador de movimento

Próximo ponto de verificação de desenvolvimento

Se você está seguindo a jornada de desenvolvimento Unity que estabelecemos, você está no meio da exploração dos blocos de construção principais do MRTK. A partir daqui, você pode continuar para o próximo bloco de construção:

Ou pule para os recursos e APIs da plataforma de Realidade Mista:

Você sempre pode voltar aos pontos de verificação de desenvolvimento Unity a qualquer momento.

Consulte também