Compartilhar via


Entrada 211 do HoloLens (1ª geração): Gesto

Importante

Os tutoriais do Realidade Misturada Academy foram projetados com o HoloLens (1ª geração), o Unity 2017 e Realidade Misturada headsets imersivos em mente. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses dispositivos. Esses tutoriais não serão atualizados com os conjuntos de ferramentas ou interações mais recentes que estão sendo usados para HoloLens 2 e podem não ser compatíveis com versões mais recentes do Unity. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis. Uma nova série de tutoriais foi postada para o HoloLens 2.

Gestos transformam a intenção do usuário em ação. Com gestos, os usuários podem interagir com os hologramas. Neste curso, aprenderemos a acompanhar as mãos do usuário, responder à entrada do usuário e fornecer comentários ao usuário com base no estado e na localização da mão.

No MR Basics 101, usamos um gesto simples de tocar no ar para interagir com nossos hologramas. Agora, vamos além do gesto de tocar no ar e explorar novos conceitos para:

  • Detecte quando a mão do usuário está sendo rastreada e forneça comentários ao usuário.
  • Use um gesto de navegação para girar nossos hologramas.
  • Forneça comentários quando a mão do usuário estiver prestes a sair da exibição.
  • Use eventos de manipulação para permitir que os usuários movam hologramas com as mãos.

Neste curso, revisitaremos o projeto do Unity Model Explorer, que criamos no MR Input 210. Nosso amigo astronauta está de volta para nos ajudar na exploração desses novos conceitos de gestos.

Importante

Os vídeos inseridos em cada um dos capítulos abaixo foram gravados usando uma versão mais antiga do Unity e o kit de ferramentas Realidade Misturada. Embora as instruções passo a passo sejam precisas e atuais, você pode ver scripts e visuais nos vídeos correspondentes desatualizados. Os vídeos permanecem incluídos para posteridade e porque os conceitos abordados ainda se aplicam.

Suporte a dispositivos

Curso HoloLens Headsets imersivos
Entrada do MR 211: Gesto ✔️ ✔️

Antes de começar

Pré-requisitos

Arquivos de projeto

  • Baixe os arquivos exigidos pelo projeto. Requer o Unity 2017.2 ou posterior.
  • Cancele o arquivamento dos arquivos na área de trabalho ou em outro local de fácil acesso.

Observação

Se você quiser examinar o código-fonte antes de baixar, ele estará disponível no GitHub.

Errata e Observações

  • "Habilitar Apenas Meu Código" precisa ser desabilitado (desmarcado) no Visual Studio em Ferramentas-Opções-Depuração>> para atingir pontos de interrupção em seu código.

Capítulo 0 – Configuração do Unity

Instruções

  1. Inicie o Unity.
  2. Selecione Abrir.
  3. Navegue até a pasta Gesto que você cancelou anteriormente de arquivar.
  4. Localize e selecione a pastaExplorer ModeloInicial/.
  5. Clique no botão Selecionar Pasta .
  6. No painel Projeto , expanda a pasta Cenas .
  7. Clique duas vezes na cena ModelExplorer para carregá-la no Unity.

Construção

  1. No Unity, selecione Configurações de Build de Arquivo>.
  2. Se Scenes/ModelExplorer não estiver listado em Cenas no Build, clique em Adicionar Cenas Abertas para adicionar a cena.
  3. Se você estiver desenvolvendo especificamente para o HoloLens, defina Dispositivo de destino como HoloLens. Caso contrário, deixe-o em Qualquer dispositivo.
  4. Verifique se o Tipo de Build está definido como D3D e se o SDK está definido como Mais recente instalado (que deve ser o SDK 16299 ou mais recente).
  5. Clique em Compilar.
  6. Crie uma nova pasta chamada "App".
  7. Clique com um único clique na pasta Aplicativo .
  8. Pressione Selecionar Pasta e o Unity começará a compilar o projeto para o Visual Studio.

Quando o Unity for concluído, uma janela Explorador de Arquivos será exibida.

  1. Abra a pasta Aplicativo .
  2. Abra a Solução ModelExplorer do Visual Studio.

Se estiver implantando no HoloLens:

  1. Usando a barra de ferramentas superior no Visual Studio, altere o destino de Depurar para Versão e de ARM para x86.
  2. Clique na seta suspensa ao lado do botão Computador Local e selecione Computador Remoto.
  3. Insira o endereço IP do dispositivo HoloLens e defina Modo de Autenticação como Universal (Protocolo Não Criptografado). Clique em Selecionar. Se você não souber o endereço IP do dispositivo, procure Configurações Rede & Opções Avançadas > da Internet>.
  4. Na barra de menus superior, clique em Depurar –> Iniciar Sem depuração ou pressione Ctrl + F5. Se esta for a primeira vez que você implantar em seu dispositivo, será necessário emparelhá-lo com o Visual Studio.
  5. Quando o aplicativo tiver sido implantado, ignore o Fitbox com um gesto de seleção.

Se estiver implantando em um headset imersivo:

  1. Usando a barra de ferramentas superior no Visual Studio, altere o destino de Depurar para Versão e de ARM para x64.
  2. Verifique se o destino de implantação está definido como Computador Local.
  3. Na barra de menus superior, clique em Depurar –> Iniciar Sem depuração ou pressione Ctrl + F5.
  4. Quando o aplicativo tiver sido implantado, ignore o Fitbox puxando o gatilho em um controlador de movimento.

Observação

Você pode notar alguns erros vermelhos no painel Erros do Visual Studio. É seguro ignorá-los. Alterne para o painel Saída para exibir o progresso real do build. Os erros no painel Saída exigirão que você faça uma correção (na maioria das vezes, eles são causados por um erro em um script).

Capítulo 1 – Comentários detectados à mão

Objetivos

  • Assine eventos de acompanhamento manual.
  • Use comentários de cursor para mostrar aos usuários quando uma mão está sendo rastreada.

Observação

Em HoloLens 2 , as mãos detectadas disparam sempre que as mãos estão visíveis (não apenas quando um dedo está apontando para cima).

Instruções

  • No painel Hierarquia , expanda o objeto InputManager .
  • Procure e selecione o objeto GesturesInput .

O script InteractionInputSource.cs executa estas etapas:

  1. Assina os eventos InteractionSourceDetected e InteractionSourceLost.
  2. Define o estado HandDetected.
  3. Cancela a assinatura dos eventos InteractionSourceDetected e InteractionSourceLost.

Em seguida, atualizaremos nosso cursor do MR Input 210 para um que mostre comentários dependendo das ações do usuário.

  1. No painel Hierarquia , selecione o objeto Cursor e exclua-o.
  2. No painel Projeto , pesquise CursorWithFeedback e arraste-o para o painel Hierarquia .
  3. Clique em InputManager no painel Hierarquia e arraste o objeto CursorWithFeedback da Hierarquia para o campo CursorsimpleSinglePointerSelector do InputManager, na parte inferior do Inspetor.
  4. Clique no CursorWithFeedback na Hierarquia.
  5. No painel Inspetor , expanda Dados de Estado do Cursor no script do Cursor de Objeto .

Os Dados de Estado do Cursor funcionam da seguinte maneira:

  • Qualquer estado observe significa que nenhuma mão é detectada e o usuário está simplesmente olhando ao redor.
  • Qualquer estado de Interação significa que uma mão ou controlador é detectado.
  • Qualquer estado hover significa que o usuário está olhando para um holograma.

Compilar e implantar

  • No Unity, use Configurações de Build de Arquivo > para recompilar o aplicativo.
  • Abra a pasta Aplicativo .
  • Se ainda não estiver aberto, abra a Solução ModelExplorer do Visual Studio.
    • (Se você já tiver criado/implantado esse projeto no Visual Studio durante a configuração, poderá abrir essa instância do VS e clicar em 'Recarregar Tudo' quando solicitado).
  • No Visual Studio, clique em Depurar –> Iniciar sem depuração ou pressione Ctrl + F5.
  • Depois que o aplicativo for implantado no HoloLens, ignore a caixa de ajuste usando o gesto de toque aéreo.
  • Mova a mão para a vista e aponte o dedo indicador para o céu para iniciar o rastreamento manual.
  • Mova a mão para a esquerda, para a direita, para cima e para baixo.
  • Observe como o cursor muda quando sua mão é detectada e, em seguida, perdida da exibição.
  • Se você estiver em um headset imersivo, precisará se conectar e desconectar o controlador. Esses comentários se tornam menos interessantes em um dispositivo imersivo, pois um controlador conectado sempre estará "disponível".

Capítulo 2 – Navegação

Objetivos

  • Use eventos de gesto de navegação para girar o astronauta.

Instruções

Para usar gestos de navegação em nosso aplicativo, vamos editar GestureAction.cs para girar objetos quando o gesto de Navegação ocorrer. Além disso, adicionaremos comentários ao cursor a serem exibidos quando a Navegação estiver disponível.

  1. No painel Hierarquia , expanda CursorWithFeedback.
  2. Na pasta Hologramas , localize o ativo ScrollFeedback .
  3. Arraste e solte o prefab ScrollFeedback para o CursorWithFeedback GameObject na Hierarquia.
  4. Clique em CursorWithFeedback.
  5. No painel Inspetor , clique no botão Adicionar Componente .
  6. No menu, digite na caixa de pesquisa CursorFeedback. Selecione o resultado da pesquisa.
  7. Arraste e solte o objeto ScrollFeedback da Hierarquia até a propriedade Scroll Detected Game Object no componente Cursor Feedback no Inspetor.
  8. No painel Hierarquia , selecione o objeto AstroMan .
  9. No painel Inspetor , clique no botão Adicionar Componente .
  10. No menu, digite na caixa de pesquisa Ação de Gesto. Selecione o resultado da pesquisa.

Em seguida, abra GestureAction.cs no Visual Studio. No exercício de codificação 2.c, edite o script para fazer o seguinte:

  1. Gire o objeto AstroMan sempre que um gesto de Navegação for executado.
  2. Calcule o rotationFactor para controlar a quantidade de rotação aplicada ao objeto .
  3. Gire o objeto ao redor do eixo y quando o usuário mover a mão para a esquerda ou para a direita.

Conclua os exercícios de codificação 2.c no script ou substitua o código pela solução concluída abaixo:

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

Você observará que os outros eventos de navegação já estão preenchidos com algumas informações. Enviamos o GameObject por push para a pilha modal do InputSystem do Kit de Ferramentas, para que o usuário não precise manter o foco no Astronauta depois que a rotação tiver começado. Correspondentemente, pop-off the GameObject off the stack once the gesture is completed.

Compilar e implantar

  1. Recompile o aplicativo no Unity e, em seguida, crie e implante do Visual Studio para executá-lo no HoloLens.
  2. Olhe para o astronauta, duas setas devem aparecer em ambos os lados do cursor. Este novo visual indica que o astronauta pode ser girado.
  3. Coloque a mão na posição pronta (dedo indicador apontado para o céu) para que o HoloLens comece a rastrear sua mão.
  4. Para girar o astronauta, baixe o dedo indicador para uma posição de pinçagem e mova a mão para a esquerda ou para a direita para disparar o gesto NavigationX.

Capítulo 3 – Orientação manual

Objetivos

  • Use a pontuação de orientação manual para ajudar a prever quando o acompanhamento manual será perdido.
  • Forneça comentários sobre o cursor para mostrar quando a mão do usuário se aproxima da borda de exibição da câmera.

Instruções

  1. No painel Hierarquia , selecione o objeto CursorWithFeedback .
  2. No painel Inspetor , clique no botão Adicionar Componente .
  3. No menu, digite na caixa de pesquisa Orientação manual. Selecione o resultado da pesquisa.
  4. Na pasta Hologramas do painel Projeto, localize o ativo HandGuidanceFeedback.
  5. Arraste e solte o ativo HandGuidanceFeedback na propriedade Indicador de Orientação da Mão no painel Inspetor .

Compilar e implantar

  • Recompile o aplicativo no Unity e, em seguida, crie e implante do Visual Studio para experimentar o aplicativo no HoloLens.
  • Coloque a mão à vista e levante o dedo indicador para ser rastreado.
  • Comece a girar o astronauta com o gesto navegação (pinçar o dedo indicador e o polegar juntos).
  • Mova sua mão para a esquerda, direita, para cima e para baixo.
  • À medida que sua mão se aproxima da borda do quadro de gestos, uma seta deve aparecer ao lado do cursor para avisá-lo de que o rastreamento de mão será perdido. A seta indica qual direção mover sua mão para evitar que o rastreamento seja perdido.

Capítulo 4 – Manipulação

Objetivos

  • Use eventos de manipulação para mover o astronauta com as mãos.
  • Forneça comentários sobre o cursor para informar ao usuário quando a Manipulação pode ser usada.

Instruções

GestureManager.cs e AstronautManager.cs nos permitirão fazer o seguinte:

  1. Use o palavra-chave de fala "Mover Astronauta" para habilitar gestos de manipulação e "Girar Astronauta" para desabilitá-los.
  2. Alterne para responder ao Reconhecimento de Gestos de Manipulação.

Vamos começar.

  1. No painel Hierarquia , crie um novo GameObject vazio. Nomeie-o como "AstronautManager".
  2. No painel Inspetor , clique no botão Adicionar Componente .
  3. No menu, digite na caixa de pesquisa Gerenciador de Astronautas. Selecione o resultado da pesquisa.
  4. No painel Inspetor , clique no botão Adicionar Componente .
  5. No menu, digite na caixa de pesquisa Fonte de Entrada de Fala. Selecione o resultado da pesquisa.

Agora, adicionaremos os comandos de fala necessários para controlar o estado de interação do astronauta.

  1. Expanda a seção Palavras-chave no Inspetor.
  2. Clique no + lado direito para adicionar um novo palavra-chave.
  3. Digite a palavra-chave como Mover Astronauta. Fique à vontade para adicionar um Atalho de Chave, se desejado.
  4. Clique no + lado direito para adicionar um novo palavra-chave.
  5. Digite a palavra-chave como Girar Astronauta. Fique à vontade para adicionar um Atalho de Chave, se desejado.
  6. O código do manipulador correspondente pode ser encontrado em GestureAction.cs, no manipulador ISpeechHandler.OnSpeechKeywordRecognized .

Como configurar a fonte de entrada de fala para o capítulo 4

Em seguida, configuraremos os comentários de manipulação no cursor.

  1. Na pasta Hologramas do painel Projeto, localize o ativo PathingFeedback.
  2. Arraste e solte o prefab PathingFeedback para o objeto CursorWithFeedback na Hierarquia.
  3. No painel Hierarquia , clique em CursorWithFeedback.
  4. Arraste e solte o objeto PathingFeedback da Hierarquia para a propriedade Pathing Detected Game Object no componente Cursor Feedback no Inspetor.

Agora, precisamos adicionar código a GestureAction.cs para habilitar o seguinte:

  1. Adicione código à função IManipulationHandler.OnManipulationUpdated , que moverá o astronauta quando um gesto de Manipulação for detectado.
  2. Calcule o vetor de movimento para determinar para onde o astronauta deve ser movido com base na posição da mão.
  3. Mova o astronauta para a nova posição.

Conclua o exercício de codificação 4.a em GestureAction.cs ou use nossa solução concluída abaixo:

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
            transform.position = manipulationOriginalPosition + eventData.CumulativeDelta;
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

Compilar e implantar

  • Recompile no Unity e, em seguida, crie e implante no Visual Studio para executar o aplicativo no HoloLens.
  • Mova a mão na frente do HoloLens e levante o dedo indicador para que ele possa ser rastreado.
  • Concentre o cursor sobre o astronauta.
  • Diga "Mover Astronauta" para mover o astronauta com um gesto de manipulação.
  • Quatro setas devem aparecer ao redor do cursor para indicar que o programa agora responderá aos eventos de manipulação.
  • Baixe o dedo indicador até o polegar e mantenha-os presos juntos.
  • Ao mover sua mão, o astronauta também se moverá (isso é Manipulação).
  • Levante o dedo indicador para parar de manipular o astronauta.
  • Observação: se você não disser "Mover Astronauta" antes de mover a mão, o gesto navegação será usado.
  • Diga "Girar Astronauta" para retornar ao estado rotacionável.

Capítulo 5 – Expansão do modelo

Objetivos

  • Expanda o modelo Astronauta em várias partes menores com as quais o usuário pode interagir.
  • Mova cada peça individualmente usando gestos de Navegação e Manipulação.

Instruções

Nesta seção, realizaremos as seguintes tarefas:

  1. Adicione um novo palavra-chave "Expandir Modelo" para expandir o modelo de astronauta.
  2. Adicione uma nova palavra-chave "Redefinir Modelo" para retornar o modelo ao formulário original.

Faremos isso adicionando mais duas palavras-chave à Fonte de Entrada de Fala do capítulo anterior. Também demonstraremos outra maneira de lidar com eventos de reconhecimento.

  1. Clique novamente em AstronautManager no Inspetor e expanda a seção Palavras-chave no Inspetor.
  2. Clique no + lado direito para adicionar um novo palavra-chave.
  3. Digite a palavra-chave como Expandir Modelo. Fique à vontade para adicionar um Atalho de Chave, se desejado.
  4. Clique no + lado direito para adicionar um novo palavra-chave.
  5. Digite a palavra-chave como Redefinir Modelo. Fique à vontade para adicionar um Atalho de Chave, se desejado.
  6. No painel Inspetor , clique no botão Adicionar Componente .
  7. No menu, digite na caixa de pesquisa Manipulador de Entrada de Fala. Selecione o resultado da pesquisa.
  8. Check Is Global Listener, pois queremos que esses comandos funcionem independentemente do GameObject que estamos focando.
  9. Clique no + botão e selecione Expandir Modelo na lista suspensa Palavra-chave.
  10. Clique no + em Resposta e arraste o AstronautManager da Hierarquia para o campo Nenhum (Objeto ).
  11. Agora, clique na lista suspensa Sem Função , selecione AstronautManager e ExpandModelCommand.
  12. Clique no botão Manipulador de Entrada de + Fala e selecione Redefinir Modelo na lista suspensa Palavra-chave.
  13. Clique no + em Resposta e arraste o AstronautManager da Hierarquia para o campo Nenhum (Objeto ).
  14. Agora, clique na lista suspensa Sem Função , selecione AstronautManager e, em seguida, ResetModelCommand.

Como configurar a origem e o manipulador de entrada de fala para o capítulo 5

Compilar e implantar

  • Experimente! Crie e implante o aplicativo no HoloLens.
  • Digamos Expandir Modelo para ver o modelo de astronauta expandido.
  • Use Navegação para girar partes individuais do traje de astronauta.
  • Digamos Mover Astronauta e, em seguida, usar Manipulação para mover peças individuais do traje de astronauta.
  • Digamos Girar Astronauta para girar as peças novamente.
  • Digamos Redefinir Modelo para retornar o astronauta à sua forma original.

Fim

Parabéns! Você concluiu a entrada mr 211: gesto.

  • Você sabe como detectar e responder a eventos de controle manual, navegação e manipulação.
  • Você entende a diferença entre gestos de Navegação e Manipulação.
  • Você sabe como alterar o cursor para fornecer comentários visuais para quando uma mão é detectada, quando uma mão está prestes a ser perdida e para quando um objeto dá suporte a interações diferentes (Navegação versus Manipulação).