Controladores de movimento na unidade

Existem duas maneiras fundamentais de agir no seu olhar na Unidade,gestos de mão e controladores de movimento em HoloLens e HMD imersivo. Aceda aos dados para ambas as fontes de entrada espacial através das mesmas APIs em Unidade.

A unidade fornece duas formas primárias de aceder aos dados de entrada espacial para Windows Mixed Reality. A API de Input.GetButton/Input.GetAxis funciona em múltiplos SDKs De Unidade XR, enquanto a API API de InteractionManager/GestureRecognizer específica para Windows Mixed Reality expõe o conjunto completo de dados de entrada espacial.

APIs de entrada de unidade XR

Para novos projetos, recomendamos a utilização das novas APIs de entrada de XR desde o início.

Pode encontrar mais informações sobre as APIs do XR aqui.

Tabela de mapeamento de botão/eixo de unidade

O Input Manager da Unidade para controladores de movimento Windows Mixed Reality suporta os IDs de botão e eixo listados abaixo através das APIs input.GetButton/GetAxis. A coluna "Windows específica mr"refere-se a propriedades disponíveis fora do tipo InteractionSourceState. Cada uma destas APIs é descrita em detalhe nas secções abaixo.

Os mapeamentos de ID de botão/eixo para Windows Mixed Reality geralmente correspondem aos IDs do botão/eixo Oculus.

Os mapeamentos de ID de botão/eixo para Windows Mixed Reality diferem dos mapeamentos da OpenVR de duas maneiras:

  1. O mapeamento utiliza IDs de touchpad distintos do polegar, para suportar controladores com polegares e touchpads.
  2. O mapeamento evita sobrecarregar os IDs dos botões A e X para os botões menu para deixá-los disponíveis para os botões físicos ABXY.
EntradaAPIs de Unidade Comum
(Input.GetButton/GetAxis)
Windows API de entrada específica para MR
(XR. A WSA. Entrada)
Mão esquerda Mão direita
Selecione gatilho pressionado Eixo 9 = 1.0 Eixo 10 = 1.0 selecionar Comprimido
Selecione o valor analógico do gatilho Eixo 9 Eixo 10 selectPressedAmount
Selecione o gatilho parcialmente pressionado Botão 14 (gamepad compat) Botão 15 (gamepad compat) selectPressedAmount > 0.0
Botão de menu pressionado Botão 6* Botão 7* menuSa
Botão de aperto pressionado Eixo 11 = 1.0 (sem valores analógicos)
Botão 4 (gamepad compat)
Eixo 12 = 1.0 (sem valores analógicos)
Botão 5 (gamepad compat)
apreendido
Polegar X (esquerda: -1.0, direita: 1.0) Eixo 1 Eixo 4 thumbstickPosition.x
Polegar Y (em cima: -1.0, em baixo: 1.0) Eixo 2 Eixo 5 polegarPosition.y
Polegar pressionado Botão 8 Botão 9 polegar comprimido
Touchpad X (à esquerda: -1.0, direita: 1.0) Eixo 17* Eixo 19* touchpadPosition.x
Touchpad Y (em cima: -1.0, em baixo: 1.0) Eixo 18* Eixo 20* touchpadPosition.y
Touchpad tocado Botão 18* Botão 19* touchpadTocado
Touchpad pressionado Botão 16* Botão 17* touchpadSA
6Posição de aderência ou pose de ponteiro Pose de aderência apenas: XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Passe Grip ou Pointer como argumento: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Estado de rastreio Precisão de posição e risco de perda de fonte apenas disponível através de API específica mr sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Nota

Estes IDs de botão/eixo diferem dos IDs que a Unidade utiliza para o OpenVR devido a colisões nos mapeamentos utilizados pelos gamepads, Oculus Touch e OpenVR.

OpenXR

Para conhecer o básico sobre interações de realidade mista na Unidade, visite o Manual de Unidade para a Entrada XR unidade. Esta documentação de unidade abrange os mapeamentos de entradas específicas do controlador para inputsmais generalizáveis, como as entradas XR disponíveis podem ser identificadas e categorizadas, como ler dados a partir destas entradas, e muito mais.

O Plugin OpenXR de Realidade Mista fornece perfis de interação de entrada adicionais, mapeados para inputfeatureSages padrão como descrito abaixo:

InputFeatureUsage Controlador HP Reverb G2 (OpenXR) mão HoloLens (OpenXR)
primário2DAxis Joystick
primário2DAxisClick Joystick - Clique
gatilho Acionador
aderência Aderência Toque de ar ou espreme
butão primário [X/A] - Pressione Toque no ar
SecundárioButton [Y/B] - Prima
gripButton Aderência - Pressione
triggerButton Gatilho - Pressione
menuButton Menu

Pose de aderência vs. pose apontando

Windows Mixed Reality suporta controladores de movimento numa variedade de fatores de forma. O design de cada controlador difere na sua relação entre a posição da mão do utilizador e a direção natural "para a frente" que as aplicações devem utilizar para apontar ao renderizar o controlador.

Para melhor representar estes controladores, existem dois tipos de poses que pode investigar para cada fonte de interação, a pose de aderência e a pose do ponteiro. Tanto a pose de aderência como as coordenadas de posição de ponteiro são expressas por todas as APIs de unidade nas coordenadas globais do mundo da Unidade.

Pose de aperto

A posição de aderência representa a localização da palma da mão dos utilizadores, detetada por um HoloLens ou segurando um controlador de movimento.

Nos auscultadores imersivos, a pose de aderência é melhor utilizada para tornar a mão do utilizador ou um objeto na mão do utilizador. A pose de aderência também é usada ao visualizar um controlador de movimento. O modelo renderizável fornecido por Windows para um controlador de movimento utiliza a pose de aderência como origem e centro de rotação.

A pose de aderência é definida especificamente da seguinte forma:

  • Posição de aderência: A palma centroid quando segura o controlador naturalmente, ajustado para a esquerda ou direita para centrar a posição dentro da pega. No controlador de movimento Windows Mixed Reality, esta posição geralmente alinha-se com o botão Agarrar.
  • O eixo direito da orientação da aderência: Quando abre completamente a mão para formar uma pose plana de 5 dedos, o raio que é normal à palma da mão (para a frente da palma da esquerda, para trás da palma da direita)
  • O eixo da orientação da aderência: Quando fecha parcialmente a mão (como se segurasse o controlador), o raio que aponta "para a frente" através do tubo formado pelos dedos não polegares.
  • O eixo up da orientação de aderência: O eixo ascendente implícito pelas definições de Direita e Para a Frente.

Pode aceder à pose de aderência através da entrada de um fornecedor transversal da Unidade API(XR). InputTracking. GetLocalPosition/Rotation) ou através da API específica Windows MR(sourceState.sourcePose.TryGetPosition/Rotation, solicitando dados de pose para o nó de aderência).

Pose de ponteiro

A pose do ponteiro representa a ponta do controlador apontando para a frente.

A pose de ponteiro fornecida pelo sistema é melhor utilizada para o raycast quando está a renderizar o próprio modelo do controlador. Se estiver a renderizar algum outro objeto virtual no lugar do controlador, como uma arma virtual, deve apontar com um raio que seja mais natural para esse objeto virtual, como um raio que viaja ao longo do cano do modelo de arma definido pela aplicação. Como os utilizadores podem ver o objeto virtual e não o controlador físico, apontar com o objeto virtual será provavelmente mais natural para quem usa a sua app.

Atualmente, a pose do ponteiro está disponível em Unidade apenas através do Windows API específica mr,sourcePose.tryGetPosition/Rotation,passando em InteractionSourceNode.Pointer como argumento.

OpenXR

Tem acesso a dois conjuntos de poses através de interações de entrada OpenXR:

  • As poses de aderência para renderizar objetos na mão
  • O objetivo é apontar para o mundo.

Mais informações sobre este design e as diferenças entre as duas poses podem ser encontradas na Especificação OpenXR - Subpatas de entrada.

As poses fornecidas pela InputFeatureUsages DevicePosition, DeviceRotation,DeviceVelocitye DeviceAngularVelocity representam a posição de aderência OpenXR. InputFeatureSages relacionados com poses de aderência são definidos nas CommonUsagesda Unidade .

As poses fornecidas pela InputFeatureUsages PointerPosition, PointerRotation,PointerVelocitye PointerAngularVelocity representam a pose de mira OpenXR. Estes inputFeatureUsages não estão definidos em nenhum ficheiro C# incluído, por isso terá de definir os seus próprios InputFeatureUsages da seguinte forma:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Hápticos

Para obter informações sobre a utilização de hápticos no sistema de entrada XR da Unidade, a documentação pode ser encontrada no Manual de Unidade para Unidade XR Input - Haptics.

Estado de rastreio do controlador

Tal como os auscultadores, o controlador de movimento Windows Mixed Reality não necessita de configuração de sensores externos de rastreio. Em vez disso, os controladores são rastreados por sensores nos próprios auscultadores.

Se o utilizador tirar os controladores do campo de visão do auricular, Windows continua a inferir posições do controlador na maioria dos casos. Quando o controlador tiver perdido o rastreio visual durante tempo suficiente, as posições do controlador baixarão para posições de precisão aproximada.

Neste ponto, o sistema irá bloquear o controlador ao utilizador, rastreando a posição do utilizador à medida que se deslocam, enquanto expõe a verdadeira orientação do controlador utilizando os seus sensores de orientação interna. Muitas aplicações que usam controladores para apontar e ativar elementos de UI podem funcionar normalmente enquanto em precisão aproximada sem que o utilizador perceba.

Raciocínio sobre o estado de rastreio explicitamente

As aplicações que desejem tratar posições de forma diferente com base no estado de rastreio podem ir mais longe e inspecionar propriedades no estado do controlador, tais como SourceLossRisk e PositionAccuracy:

Estado de rastreio SourceLossRisk PosiçãoAccuciação TryGetPosition
Alta precisão < 1.0 Alto true
Alta precisão (em risco de perder) == 1.0 Alto true
Precisão aproximada == 1.0 Aproximação true
Sem posição == 1.0 Aproximação false

Estes estados de rastreio do controlador de movimento são definidos da seguinte forma:

  • Alta precisão: Embora o controlador de movimento esteja dentro do campo de visão do auricular, geralmente fornecerá posições de alta precisão, com base no rastreio visual. Um controlador móvel que, momentaneamente, sai do campo de visão ou é momentaneamente obscurecido dos sensores dos auscultadores (por exemplo, por outra mão do utilizador) continuará a devolver poses de alta precisão durante um curto período de tempo, com base no rastreio inercial do próprio controlador.
  • Alta precisão (em risco de perder): Quando o utilizador deslocar o controlador de movimento para além da borda do campo de visão do auricular, o auricular em breve não será capaz de rastrear visualmente a posição do controlador. A aplicação sabe quando o controlador atingiu este limite FOV vendo o SourceLossRisk chegar a 1.0. Nessa altura, a aplicação pode optar por interromper gestos de controlador que requerem um fluxo constante de poses de alta qualidade.
  • Precisão aproximada: Quando o controlador tiver perdido o rastreio visual durante tempo suficiente, as posições do controlador baixarão para posições de precisão aproximada. Neste ponto, o sistema irá bloquear o controlador ao utilizador, rastreando a posição do utilizador à medida que se deslocam, enquanto expõe a verdadeira orientação do controlador utilizando os seus sensores de orientação interna. Muitas aplicações que usam controladores para apontar e ativar elementos de UI podem funcionar normalmente enquanto em precisão aproximada sem que o utilizador perceba. As aplicações com requisitos de entrada mais pesados podem optar por sentir esta queda de alta precisão para precisão Aproximada, inspecionando a propriedade PositionAccuracy, por exemplo, para dar ao utilizador uma caixa de entrada mais generosa em alvos fora do ecrã durante este período.
  • Sem posição: Embora o controlador possa funcionar com uma precisão aproximada durante muito tempo, às vezes o sistema sabe que mesmo uma posição de bloqueio corporal não tem significado no momento. Por exemplo, um controlador que foi ligado pode nunca ter sido observado visualmente, ou um utilizador pode colocar um controlador que é depois recolhido por outra pessoa. Nessas alturas, o sistema não fornecerá qualquer posição à aplicação, e o TryGetPosition devolverá falso.

APIs de unidade comum (Input.GetButton/GetAxis)

Espaço de nome:UnityEngine, UnityEngine.XR
Tipos: Entrada,XR. InputTracking

A Unidade utiliza atualmente o seu Input.GetButton/Input.GetAxis APIs para expor a entrada para o Oculus SDK,o OpenVR SDK e Windows Mixed Reality, incluindo controladores de mãos e movimento. Se a sua aplicação utilizar estes APIs para entrada, pode suportar facilmente controladores de movimento em vários XR SDKs, incluindo Windows Mixed Reality.

Obter um botão lógico é o estado pressionado

Para utilizar as APIs de entrada geral de unidade, normalmente começará por ligar botões e eixos a nomes lógicos no Gestor de Entradas de Unidade,ligando um botão ou IDs de eixo a cada nome. Em seguida, pode escrever código que se refere a esse nome lógico do botão/eixo.

Por exemplo, para mapear o botão de gatilho do controlador de movimento esquerdo para a ação Enviar, vá para editar Project Definições > Entrada dentro da Unidade e expanda as propriedades da secção Submeter em Eixos. Mude o botão positivo ou a propriedade "Botão Alt Positivo" para ler o botão joystick 14, assim:

InputManager da Unidade
InputManager de Unidade

O seu script pode então verificar a ação de submissão utilizando o Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

Pode adicionar botões mais lógicos alterando a propriedade Tamanho em Machados.

Obter um botão físico pressionado diretamente

Também pode aceder manualmente aos botões pelo seu nome totalmente qualificado, utilizando o Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

Obter uma pose de mão ou controlador de movimento

Pode aceder à posição e à rotação do controlador, utilizando XR. Pista de Entrada:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Nota

O código acima representa a posição de aderência do controlador (onde o utilizador detém o controlador), o que é útil para a colocação de uma espada ou arma na mão do utilizador ou um modelo do próprio controlador.

A relação entre esta pose de aderência e a pose do ponteiro (onde a ponta do controlador está a apontar) pode diferir entre os controladores. Neste momento, o acesso à pose do ponteiro do controlador só é possível através da API de entrada específica mr-specific, descrita nas secções abaixo.

APIs específicos Windows (XR). A WSA. Entrada)

Atenção

Se o seu projeto estiver a usar algum dos XR. APIs WSA, estes estão sendo eliminados gradualmente a favor do XR SDK em futuras libertações de Unidade. Para novos projetos, recomendamos a utilização do XR SDK desde o início. Pode encontrar mais informações sobre o sistema de entrada XR e APIs aqui.

Espaço de nome:UnityEngine.xr.wsa.input
Tipos: InteractionManager, InteractionSourceState,InteractionSource,InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Para obter informações mais detalhadas sobre a entrada manual Windows Mixed Reality (para HoloLens) e controladores de movimento, pode optar por utilizar as APIs de entrada espacial específicas Windows sob o espaço de nome UnityEngine.XR.WSA.Input. Isto permite-lhe aceder a informações adicionais, tais como a precisão da posição ou o tipo de fonte, permitindo-lhe distinguir as mãos e os controladores.

Sondagem para o estado das mãos e controladores de movimento

Pode sondar o estado deste quadro para cada fonte de interação (controlador de mão ou movimento) utilizando o método GetCurrentReading.

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Cada InteractionSourceState que recebe representa uma fonte de interação no momento atual do tempo. O InteractionSourceState expõe informações como:

  • Quais tipos de prensas estão a ocorrer (Selecione/Menu/Agarrar/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Outros dados específicos dos controladores de movimento, tais como o touchpad e/ou as coordenadas XY do polegar e o estado tocado

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • A InteractionSourceKind para saber se a fonte é uma mão ou um controlador de movimento

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Sondagem para poses de renderização antecipadas

  • Ao sondar dados de fonte de interação de mãos e controladores, as poses que obtém são poses previsíveis para o momento em que os fotões deste quadro chegarão aos olhos do utilizador. As poses previstas para a frente são mais utilizadas para renderizar o controlador ou um objeto seguro em cada quadro. Se estiver a direcionar uma determinada imprensa ou comunicado com o controlador, isso será mais exato se utilizar as APIs do evento histórico descritas abaixo.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Também pode obter a pose da cabeça prevista para a frente para este quadro atual. Tal como acontece com a pose de origem, isto é útil para renderizar um cursor, embora direcionar uma determinada imprensa ou comunicado será mais preciso se utilizar as APIs do evento histórico descrito abaixo.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Lidar com eventos de origem de interação

Para lidar com eventos de entrada à medida que acontecem com os seus dados históricos precisos, você pode lidar com eventos de origem de interação em vez de sondagens.

Para lidar com eventos de origem de interação:

  • Registe-se para um evento de entrada InteractionManager. Para cada tipo de evento de interações em que está interessado, precisa subscrevê-lo.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Lide com o evento. Uma vez que tenha subscrito um evento de interação, receberá a chamada quando apropriado. No exemplo SourcePressed, esta será depois de a fonte ter sido detetada e antes de ser libertada ou perdida.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

Como parar de lidar com um evento

Tens de parar de lidar com um evento quando já não estás interessado no evento ou estás a destruir o objeto que subscreveu o evento. Para parar de lidar com o evento, você cancelará a subscrição do evento.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Lista de eventos de origem de interação

Os eventos de origem de interação disponíveis são:

  • InteractionSourceDetected (a fonte torna-se ativa)
  • InteractionSourceLost (torna-se inativo)
  • InteractionSourcePressed (toque, prima o botão ou "Selecione" pronunciado)
  • InteractionSourceReleased (fim de um toque, botão libertado ou fim de "Select" pronunciado)
  • InteractionSourceUpdated (move-se ou altera algum estado)

Eventos para poses de alvo histórico que correspondem com precisão a uma imprensa ou comunicado

As APIs de sondagens descritas anteriormente dão à sua aplicação poses antecipadas. Embora as poses previstas sejam melhores para renderizar o controlador ou um objeto portátil virtual, as poses futuras não são ideais para o alvo, por duas razões fundamentais:

  • Quando o utilizador carrega num botão num controlador, pode haver cerca de 20 ms de latência sem fios durante Bluetooth antes de o sistema receber a prensa.
  • Então, se estiver a usar uma pose prevista para a frente, haveria mais 10-20 ms de previsão avançada aplicada para atingir o momento em que os fotões do quadro atual chegarão aos olhos do utilizador.

Isto significa que as sondagens dão-lhe uma pose de origem ou pose de cabeça que é 30-40 ms para a frente de onde a cabeça e as mãos do utilizador estavam realmente de volta quando a imprensa ou o comunicado aconteceu. Para HoloLens entrada manual, embora não haja atraso na transmissão sem fios, há um atraso de processamento semelhante para detetar a imprensa.

Para direcionar com precisão com base na intenção original do utilizador para uma pressão de mão ou controlador, deve utilizar a pose de origem histórica ou a pose da cabeça a partir desse evento de entrada InteractionSourcePressed ou InteractionSourceReleased.

Pode direcionar uma prensa ou comunicado com dados históricos da cabeça do utilizador ou do seu controlador:

  • A pose da cabeça no momento em que ocorreu um gesto ou uma prensa controladora, que pode ser usada para direcionar para determinar o que o utilizador estava a olhar:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • A fonte coloca no momento em que ocorreu uma pressão do controlador de movimento, que pode ser usada para direcionar para determinar o que o utilizador estava a apontar para o controlador. Este será o estado do controlador que experimentou a imprensa. Se estiver a renderizar o controlador em si, pode solicitar a pose do ponteiro em vez da pose de aderência, para disparar o raio de mira do que o utilizador considerará a ponta natural desse controlador renderizado:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Exemplo de manipuladores de eventos

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Controladores de movimento em MRTK

Pode aceder ao controlador de gestos e movimentos do gestor de entrada.

Acompanhe os tutoriais

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

Entrada MR 213 - Controlador de movimento
Entrada MR 213 - Controlador de movimento

Próximo checkpoint de desenvolvimento

Se está a seguir a jornada de desenvolvimento da Unidade que estabelecemos, está no meio de explorar os blocos de construção do MRTK. A partir daqui, pode continuar até ao próximo bloco de construção:

Ou saltar para as capacidades da plataforma de realidade mista e APIs:

Pode sempre voltar aos postos de controlo de desenvolvimento da Unidade a qualquer momento.

Ver também