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:
- Criar um novo Reconhecedor de Gestos
- Especificar quais gestos observar
- Inscreva-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();
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 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.
- Siga as instruções de Introdução para baixar o Kit de Ferramentas de Realidade Mista e adicioná-lo ao seu projeto Unity.
- 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 noGetThrownObjectVelAngVel
método estático, dentro do pacote vinculado acima:Como a velocidade angular é conservada, o objeto lançado deve manter a mesma velocidade angular que tinha no momento do lançamento:
objectAngularVelocity = throwingControllerAngularVelocity;
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);
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
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.