Entrada de realidad mixta (211): GestoMR Input 211: Gesture

Nota

Los tutoriales de Mixed Reality Academy se han diseñado teniendo en cuenta HoloLens (1.ª generación) y los cascos envolventes de realidad mixta.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles.They will be maintained to continue working on the supported devices. Se ha publicado una nueva serie de tutoriales para HoloLens 2.A new series of tutorials has been posted for HoloLens 2.

Los gestos convierten la intención del usuario en acción.Gestures turn user intention into action. Con los gestos, los usuarios pueden interactuar con los hologramas.With gestures, users can interact with holograms. En este curso, aprenderá a realizar un seguimiento de las manos del usuario, a responder a la entrada del usuario y a enviar comentarios al usuario en función del estado y la ubicación de la mano.In this course, we'll learn how to track the user's hands, respond to user input, and give feedback to the user based on hand state and location.

En los conceptos básicos de MR 101, usamos un sencillo gesto de TAP de aire para interactuar con los hologramas.In MR Basics 101, we used a simple air-tap gesture to interact with our holograms. Ahora, pasaremos más allá del gesto de TAP de aire y exploraremos los nuevos conceptos para:Now, we'll move beyond the air-tap gesture and explore new concepts to:

  • Detecta cuándo se realiza el seguimiento de la mano del usuario y proporciona comentarios al usuario.Detect when the user's hand is being tracked and provide feedback to the user.
  • Use un gesto de navegación para rotar los hologramas.Use a navigation gesture to rotate our holograms.
  • Proporcione comentarios cuando el usuario esté a punto de salir de la vista.Provide feedback when the user's hand is about to go out of view.
  • Use los eventos de manipulación para permitir que los usuarios muevan hologramas con sus manos.Use manipulation events to allow users to move holograms with their hands.

En este curso, volveremos a visitar el explorador de modelos de proyectos de Unity, que hemos creado en la entrada Mr 210.In this course, we'll revisit the Unity project Model Explorer, which we built in MR Input 210. Nuestro amigo Astronaut está de regreso para ayudarnos en nuestra exploración de estos nuevos conceptos de gestos.Our astronaut friend is back to assist us in our exploration of these new gesture concepts.

Importante

Los vídeos insertados en cada uno de los capítulos siguientes se grabaron con una versión anterior de Unity y el kit de herramientas de realidad mixta.The videos embedded in each of the chapters below were recorded using an older version of Unity and the Mixed Reality Toolkit. Aunque las instrucciones paso a paso son precisas y actuales, es posible que vea scripts y objetos visuales en los vídeos correspondientes que no están actualizados.While the step-by-step instructions are accurate and current, you may see scripts and visuals in the corresponding videos that are out-of-date. Los vídeos permanecen incluidos para posterity y porque todavía se aplican los conceptos descritos.The videos remain included for posterity and because the concepts covered still apply.

Compatibilidad con dispositivosDevice support

CursoCourse HoloLensHoloLens Cascos envolventesImmersive headsets
Entrada de realidad mixta (211): GestoMR Input 211: Gesture ✔️✔️ ✔️✔️

Antes de empezarBefore you start

Requisitos previosPrerequisites

Archivos de proyectoProject files

  • Descargue los archivos requeridos por el proyecto.Download the files required by the project. Requiere Unity 2017,2 o posterior.Requires Unity 2017.2 or later.
  • Elimine el archivo de los archivos en el escritorio o en otra ubicación de fácil acceso.Un-archive the files to your desktop or other easy to reach location.

Nota

Si desea examinar el código fuente antes de la descarga, está disponible en github.If you want to look through the source code before downloading, it's available on GitHub.

Erratas y notasErrata and Notes

  • "Habilitar Solo mi código" debe estar deshabilitado (desactivado) en Visual Studio en herramientas->opciones->depuración para alcanzar puntos de interrupción en el código."Enable Just My Code" needs to be disabled (unchecked) in Visual Studio under Tools->Options->Debugging in order to hit breakpoints in your code.

Capítulo 0: configuración de UnityChapter 0 - Unity Setup

InstructionsInstructions

  1. Inicie Unity.Start Unity.
  2. seleccione Open(Abrir).Select Open.
  3. Navegue hasta la carpeta de gestos que ha eliminado previamente.Navigate to the Gesture folder you previously un-archived.
  4. Busque y seleccione la carpeta de Inicio del / Explorador de modelos .Find and select the Starting/Model Explorer folder.
  5. Haga clic en el botón Seleccionar carpeta .Click the Select Folder button.
  6. En el panel proyecto , expanda la carpeta escenas .In the Project panel, expand the Scenes folder.
  7. Haga doble clic en ModelExplorer Scene para cargarlo en Unity.Double-click ModelExplorer scene to load it in Unity.

CompilaciónBuilding

  1. En Unity, seleccione archivo > configuración de compilación.In Unity, select File > Build Settings.
  2. Si Scenes/ModelExplorer no aparece en escenas en la compilación, haga clic en Agregar escenas abiertas para agregar la escena.If Scenes/ModelExplorer is not listed in Scenes In Build, click Add Open Scenes to add the scene.
  3. Si está desarrollando específicamente para HoloLens, establezca el dispositivo de destino en hololens.If you're specifically developing for HoloLens, set Target device to HoloLens. De lo contrario, déjelo en cualquier dispositivo.Otherwise, leave it on Any device.
  4. Asegúrese de que el tipo de compilación está establecido en D3D y que el SDK está establecido en la versión más reciente instalada (que debe ser SDK 16299 o posterior).Ensure Build Type is set to D3D and SDK is set to Latest installed (which should be SDK 16299 or newer).
  5. Haga clic en Generar.Click Build.
  6. Cree una nueva carpeta denominada "app".Create a New Folder named "App".
  7. Haga clic en la carpeta de la aplicación .Single click the App folder.
  8. Presione Seleccionar carpeta y Unity comenzará a compilar el proyecto para Visual Studio.Press Select Folder and Unity will start building the project for Visual Studio.

Cuando se haya realizado Unity, aparecerá una ventana del explorador de archivos.When Unity is done, a File Explorer window will appear.

  1. Abra la carpeta de la aplicación .Open the App folder.
  2. Abra la solución ModelExplorer de Visual Studio.Open the ModelExplorer Visual Studio Solution.

Si se implementa en HoloLens:If deploying to HoloLens:

  1. Con la barra de herramientas superior de Visual Studio, cambie el destino de Debug a Release y de ARM a x86.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to x86.
  2. Haga clic en la flecha desplegable situada junto al botón equipo local y seleccione equipo remoto.Click on the drop down arrow next to the Local Machine button, and select Remote Machine.
  3. Escriba la dirección IP del dispositivo HoloLens y establezca el modo de autenticación en universal (protocolo sin cifrar).Enter your HoloLens device IP address and set Authentication Mode to Universal (Unencrypted Protocol). Haga clic en Seleccionar.Click Select. Si no conoce la dirección IP del dispositivo, consulte configuración > redes & Internet > opciones avanzadas.If you do not know your device IP address, look in Settings > Network & Internet > Advanced Options.
  4. En la barra de menús superior, haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.In the top menu bar, click Debug -> Start Without debugging or press Ctrl + F5. Si esta es la primera vez que se implementa en el dispositivo, tendrá que emparejarla con Visual Studio.If this is the first time deploying to your device, you will need to pair it with Visual Studio.
  5. Cuando la aplicación se haya implementado, descartará el Fitbox con un gesto de selección.When the app has deployed, dismiss the Fitbox with a select gesture.

Si se implementa en un auricular envolvente:If deploying to an immersive headset:

  1. Con la barra de herramientas superior de Visual Studio, cambie el destino de Debug a Release y de ARM a x64.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to x64.
  2. Asegúrese de que el destino de implementación está establecido en equipo local.Make sure the deployment target is set to Local Machine.
  3. En la barra de menús superior, haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.In the top menu bar, click Debug -> Start Without debugging or press Ctrl + F5.
  4. Cuando la aplicación se haya implementado, descarte el Fitbox mediante la extracción del desencadenador en un controlador de movimiento.When the app has deployed, dismiss the Fitbox by pulling the trigger on a motion controller.

Nota

Es posible que observe algunos errores rojos en el panel de errores de Visual Studio.You might notice some red errors in the Visual Studio Errors panel. Es seguro ignorarlos.It is safe to ignore them. Cambie al panel de salida para ver el progreso real de la compilación.Switch to the Output panel to view actual build progress. Los errores en el panel de salida requerirán que se realice una corrección (la mayoría de las veces se deben a un error en un script).Errors in the Output panel will require you to make a fix (most often they are caused by a mistake in a script).

Capítulo 1: comentarios de la mano detectadosChapter 1 - Hand detected feedback

ObjetivosObjectives

  • Suscríbase a los eventos de seguimiento de la mano.Subscribe to hand tracking events.
  • Use los comentarios del cursor para mostrar a los usuarios Cuándo se realiza el seguimiento de una mano.Use cursor feedback to show users when a hand is being tracked.

Nota

En HoloLens 2, las manos detectadas se activan siempre que las manos están visibles (no solo cuando se señala un dedo).On HoloLens 2 , hands detected fires whenever hands are visible (not just when a finger is pointing up).

InstructionsInstructions

  • En el panel jerarquía , expanda el objeto InputManager .In the Hierarchy panel, expand the InputManager object.
  • Busque y seleccione el objeto GesturesInput .Look for and select the GesturesInput object.

El script InteractionInputSource.CS realiza estos pasos:The InteractionInputSource.cs script performs these steps:

  1. Se suscribe a los eventos InteractionSourceDetected y InteractionSourceLost.Subscribes to the InteractionSourceDetected and InteractionSourceLost events.
  2. Establece el estado de HandDetected.Sets the HandDetected state.
  3. Cancela la suscripción de los eventos InteractionSourceDetected y InteractionSourceLost.Unsubscribes from the InteractionSourceDetected and InteractionSourceLost events.

A continuación, actualizaremos el cursor de la entrada MR 210 a uno que muestra comentarios en función de las acciones del usuario.Next, we'll upgrade our cursor from MR Input 210 into one that shows feedback depending on the user's actions.

  1. En el panel jerarquía , seleccione el objeto cursor y elimínelo.In the Hierarchy panel, select the Cursor object and delete it.
  2. En el panel proyecto , busque CursorWithFeedback y arrástrelo al panel jerarquía .In the Project panel, search for CursorWithFeedback and drag it into the Hierarchy panel.
  3. Haga clic en InputManager en el panel de jerarquías y, a continuación, arrastre el objeto CursorWithFeedback desde la jerarquía al campo cursor de la SimpleSinglePointerSelector de InputManager, situado en la parte inferior del Inspector.Click on InputManager in the Hierarchy panel, then drag the CursorWithFeedback object from the Hierarchy into the InputManager's SimpleSinglePointerSelector's Cursor field, at the bottom of the Inspector.
  4. Haga clic en CursorWithFeedback en la jerarquía.Click on the CursorWithFeedback in the Hierarchy.
  5. En el panel Inspector , expanda datos de estado de cursor en el script de cursor de objeto .In the Inspector panel, expand Cursor State Data on the Object Cursor script.

Los datos de estado del cursor funcionan de la siguiente manera:The Cursor State Data works like this:

  • Cualquier estado observado significa que no se detecta ninguna mano y que el usuario simplemente está buscando.Any Observe state means that no hand is detected and the user is simply looking around.
  • Cualquier estado de interacción significa que se detecta una mano o un controlador.Any Interact state means that a hand or controller is detected.
  • Cualquier estado de mantener el mouse significa que el usuario está examinando un holograma.Any Hover state means the user is looking at a hologram.

Compilación e implementaciónBuild and Deploy

  • En Unity, use la configuración de compilación de > de archivos para recompilar la aplicación.In Unity, use File > Build Settings to rebuild the application.
  • Abra la carpeta de la aplicación .Open the App folder.
  • Si aún no está abierto, abra la solución ModelExplorer de Visual Studio.If it's not already open, open the ModelExplorer Visual Studio Solution.
    • (Si ya ha creado o implementado este proyecto en Visual Studio durante la configuración, puede abrir esa instancia de VS y hacer clic en "recargar todo" cuando se le solicite).(If you already built/deployed this project in Visual Studio during set-up, then you can open that instance of VS and click 'Reload All' when prompted).
  • En Visual Studio, haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.In Visual Studio, click Debug -> Start Without debugging or press Ctrl + F5.
  • Después de que la aplicación se implemente en HoloLens, descartará el fitbox con el gesto de punteo de aire.After the application deploys to the HoloLens, dismiss the fitbox using the air-tap gesture.
  • Mueva la mano a la vista y apunte el dedo del índice al cielo para iniciar el seguimiento de la mano.Move your hand into view and point your index finger to the sky to start hand tracking.
  • Mueva la mano a la izquierda, a la derecha, hacia arriba y hacia abajo.Move your hand left, right, up and down.
  • Observe cómo cambia el cursor cuando se detecta la mano y, a continuación, se pierde de la vista.Watch how the cursor changes when your hand is detected and then lost from view.
  • Si se encuentra en un casco envolvente, tendrá que conectar y desconectar el controlador.If you're on an immersive headset, you'll have to connect and disconnect your controller. Esta información es menos interesante en un dispositivo envolvente, ya que un controlador conectado siempre estará "disponible".This feedback becomes less interesting on an immersive device, as a connected controller will always be "available".

Capítulo 2: navegaciónChapter 2 - Navigation

ObjetivosObjectives

  • Use los eventos de gestos de navegación para rotar el Astronaut.Use Navigation gesture events to rotate the astronaut.

InstructionsInstructions

Para usar los gestos de navegación en nuestra aplicación, vamos a editar GestureAction.CS para girar objetos cuando se produce el gesto de navegación.To use Navigation gestures in our app, we are going to edit GestureAction.cs to rotate objects when the Navigation gesture occurs. Además, agregaremos comentarios al cursor para que se muestren cuando la navegación esté disponible.Additionally, we'll add feedback to the cursor to display when Navigation is available.

  1. En el panel jerarquía , expanda CursorWithFeedback.In the Hierarchy panel, expand CursorWithFeedback.
  2. En la carpeta hologramas , busque el recurso ScrollFeedback .In the Holograms folder, find the ScrollFeedback asset.
  3. Arrastre y coloque el recurso prefabricado de ScrollFeedback en CursorWithFeedback GameObject en la jerarquía.Drag and drop the ScrollFeedback prefab onto the CursorWithFeedback GameObject in the Hierarchy.
  4. Haga clic en CursorWithFeedback.Click on CursorWithFeedback.
  5. En el panel Inspector , haga clic en el botón Agregar componente .In the Inspector panel, click the Add Component button.
  6. En el menú, escriba en el cuadro de búsqueda CursorFeedback.In the menu, type in the search box CursorFeedback. Seleccione el resultado de la búsqueda.Select the search result.
  7. Arrastre y coloque el objeto ScrollFeedback de la jerarquía en la propiedad desplazamiento de objeto de juego detectado del componente cursor feedback en el Inspector.Drag and drop the ScrollFeedback object from the Hierarchy onto the Scroll Detected Game Object property in the Cursor Feedback component in the Inspector.
  8. En el panel jerarquía , seleccione el objeto AstroMan .In the Hierarchy panel, select the AstroMan object.
  9. En el panel Inspector , haga clic en el botón Agregar componente .In the Inspector panel, click the Add Component button.
  10. En el menú, escriba en la acción de gestos del cuadro de búsqueda.In the menu, type in the search box Gesture Action. Seleccione el resultado de la búsqueda.Select the search result.

A continuación, Abra GestureAction.CS en Visual Studio.Next, open GestureAction.cs in Visual Studio. En el ejercicio de codificación 2. c, edite el script para hacer lo siguiente:In coding exercise 2.c, edit the script to do the following:

  1. Gire el objeto AstroMan cada vez que se lleve a cabo un gesto de navegación.Rotate the AstroMan object whenever a Navigation gesture is performed.
  2. Calcule el valor de rotationFactor para controlar la cantidad de giro aplicada al objeto.Calculate the rotationFactor to control the amount of rotation applied to the object.
  3. Gire el objeto alrededor del eje y cuando el usuario mueva su mano a la izquierda o a la derecha.Rotate the object around the y-axis when the user moves their hand left or right.

Complete los ejercicios de codificación 2. c en el script o reemplace el código por la solución completada que aparece a continuación:Complete coding exercises 2.c in the script, or replace the code with the completed solution below:

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();
    }
}

Observará que los demás eventos de navegación ya se han rellenado con cierta información.You'll notice that the other navigation events are already filled in with some info. La GameObject se envía a la pila modal InputSystem's del kit de herramientas, por lo que el usuario no tiene que mantener el foco en el Astronaut una vez que se ha iniciado la rotación.We push the GameObject onto the Toolkit's InputSystem's modal stack, so the user doesn't have to maintain focus on the Astronaut once rotation has begun. En consecuencia, se extrae el GameObject de la pila una vez que se completa el gesto.Correspondingly, we pop the GameObject off the stack once the gesture is completed.

Compilación e implementaciónBuild and Deploy

  1. Vuelva a compilar la aplicación en Unity y, después, compile e implemente desde Visual Studio para ejecutarla en HoloLens.Rebuild the application in Unity and then build and deploy from Visual Studio to run it in the HoloLens.
  2. Mira el Astronaut, dos flechas deben aparecer a cada lado del cursor.Gaze at the astronaut, two arrows should appear on either side of the cursor. Este nuevo visual indica que el Astronaut se puede girar.This new visual indicates that the astronaut can be rotated.
  3. Coloque la mano en la posición listo (el dedo índice apunta hacia el cielo) para que HoloLens empiece a realizar un seguimiento de la mano.Place your hand in the ready position (index finger pointed towards the sky) so the HoloLens will start tracking your hand.
  4. Para girar el Astronaut, baje el dedo del índice a una posición de pinch y, a continuación, mueva la mano hacia la izquierda o hacia la derecha para desencadenar el gesto de NavigationX.To rotate the astronaut, lower your index finger to a pinch position, and then move your hand left or right to trigger the NavigationX gesture.

Capítulo 3: orientación a manoChapter 3 - Hand Guidance

ObjetivosObjectives

  • Use la puntuación de la Guía de mano para ayudar a predecir cuándo se perderá el seguimiento de manos.Use hand guidance score to help predict when hand tracking will be lost.
  • Proporcione comentarios sobre el cursor para mostrar Cuándo el usuario está cerca del borde de la cámara de la vista.Provide feedback on the cursor to show when the user's hand nears the camera's edge of view.

InstructionsInstructions

  1. En el panel jerarquía , seleccione el objeto CursorWithFeedback .In the Hierarchy panel, select the CursorWithFeedback object.
  2. En el panel Inspector , haga clic en el botón Agregar componente .In the Inspector panel, click the Add Component button.
  3. En el menú, escriba en la guía de mano del cuadro de búsqueda.In the menu, type in the search box Hand Guidance. Seleccione el resultado de la búsqueda.Select the search result.
  4. En la carpeta hologramas del panel de proyecto , busque el recurso HandGuidanceFeedback .In the Project panel Holograms folder, find the HandGuidanceFeedback asset.
  5. Arrastre y coloque el recurso HandGuidanceFeedback en la propiedad indicador de orientación a mano del panel Inspector .Drag and drop the HandGuidanceFeedback asset onto the Hand Guidance Indicator property in the Inspector panel.

Compilación e implementaciónBuild and Deploy

  • Vuelva a compilar la aplicación en Unity y, después, compile e implemente desde Visual Studio para experimentar la aplicación en HoloLens.Rebuild the application in Unity and then build and deploy from Visual Studio to experience the app on HoloLens.
  • Traiga su mano a la vista y eleve el dedo del índice para realizar el seguimiento.Bring your hand into view and raise your index finger to get tracked.
  • Empiece a girar Astronaut con el gesto de navegación (acerque el dedo del índice y Thumb juntos).Start rotating the astronaut with the Navigation gesture (pinch your index finger and thumb together).
  • Mueva la mano a la izquierda, a la derecha, hacia arriba y hacia abajo.Move your hand far left, right, up, and down.
  • A medida que su mano esté cerca del borde del marco de gestos, debe aparecer una flecha junto al cursor para avisarle de que se perderá el seguimiento de la mano.As your hand nears the edge of the gesture frame, an arrow should appear next to the cursor to warn you that hand tracking will be lost. La flecha indica la dirección a la que debe DESPLACESE para evitar que se pierda el seguimiento.The arrow indicates which direction to move your hand in order to prevent tracking from being lost.

Capítulo 4: manipulaciónChapter 4 - Manipulation

ObjetivosObjectives

  • Use los eventos de manipulación para trasladar el Astronaut con las manos.Use Manipulation events to move the astronaut with your hands.
  • Proporcione comentarios sobre el cursor para que el usuario sepa cuándo se puede usar la manipulación.Provide feedback on the cursor to let the user know when Manipulation can be used.

InstructionsInstructions

GestureManager.cs y AstronautManager.cs nos permiten hacer lo siguiente:GestureManager.cs and AstronautManager.cs will allow us to do the following:

  1. Use la palabra clave de voz "Move Astronaut" para habilitar los gestos de manipulación y "rotar Astronaut" para deshabilitarlos.Use the speech keyword "Move Astronaut" to enable Manipulation gestures and "Rotate Astronaut" to disable them.
  2. Cambie a responder al reconocedor de gestos de manipulación.Switch to responding to the Manipulation Gesture Recognizer.

Comencemos.Let's get started.

  1. En el panel jerarquía , cree un nuevo GameObject vacío.In the Hierarchy panel, create a new empty GameObject. Asígnele el nombre "AstronautManager".Name it "AstronautManager".
  2. En el panel Inspector , haga clic en el botón Agregar componente .In the Inspector panel, click the Add Component button.
  3. En el menú, escriba en el cuadro de búsqueda Astronaut Manager.In the menu, type in the search box Astronaut Manager. Seleccione el resultado de la búsqueda.Select the search result.
  4. En el panel Inspector , haga clic en el botón Agregar componente .In the Inspector panel, click the Add Component button.
  5. En el menú, escriba en el cuadro de búsqueda origen de entrada de voz.In the menu, type in the search box Speech Input Source. Seleccione el resultado de la búsqueda.Select the search result.

Ahora agregaremos los comandos de voz necesarios para controlar el estado de interacción de Astronaut.We'll now add the speech commands required to control the interaction state of the astronaut.

  1. Expanda la sección palabras clave en el Inspector.Expand the Keywords section in the Inspector.
  2. Haga clic + en el lado derecho para agregar una nueva palabra clave.Click the + on the right hand side to add a new keyword.
  3. Escriba la palabra clave como Move Astronaut.Type the Keyword as Move Astronaut. Si lo desea, no dude en agregar un método abreviado de teclado.Feel free to add a Key Shortcut if desired.
  4. Haga clic + en el lado derecho para agregar una nueva palabra clave.Click the + on the right hand side to add a new keyword.
  5. Escriba la palabra clave como rotar Astronaut.Type the Keyword as Rotate Astronaut. Si lo desea, no dude en agregar un método abreviado de teclado.Feel free to add a Key Shortcut if desired.
  6. El código de controlador correspondiente se puede encontrar en GestureAction.CS, en el controlador ISpeechHandler. OnSpeechKeywordRecognized .The corresponding handler code can be found in GestureAction.cs, in the ISpeechHandler.OnSpeechKeywordRecognized handler.

Cómo configurar el origen de entrada de voz para el capítulo 4

A continuación, configuraremos los comentarios de manipulación en el cursor.Next, we'll setup the manipulation feedback on the cursor.

  1. En la carpeta hologramas del panel de proyecto , busque el recurso PathingFeedback .In the Project panel Holograms folder, find the PathingFeedback asset.
  2. Arrastre y coloque el recurso prefabricado PathingFeedback en el objeto CursorWithFeedback de la jerarquía.Drag and drop the PathingFeedback prefab onto the CursorWithFeedback object in the Hierarchy.
  3. En el panel jerarquía , haga clic en CursorWithFeedback.In the Hierarchy panel, click on CursorWithFeedback.
  4. Arrastre y coloque el objeto PathingFeedback de la jerarquía en la propiedad del objeto de juego Thing detectado del componente cursor feedback del Inspector.Drag and drop the PathingFeedback object from the Hierarchy onto the Pathing Detected Game Object property in the Cursor Feedback component in the Inspector.

Ahora debemos agregar código a GestureAction.CS para habilitar lo siguiente:Now we need to add code to GestureAction.cs to enable the following:

  1. Agregue código a la función IManipulationHandler. OnManipulationUpdated , que moverá el Astronaut cuando se detecte un gesto de manipulación .Add code to the IManipulationHandler.OnManipulationUpdated function, which will move the astronaut when a Manipulation gesture is detected.
  2. Calcule el Vector de movimiento para determinar dónde se debe mover el Astronaut en función de la posición de la mano.Calculate the movement vector to determine where the astronaut should be moved to based on hand position.
  3. Mueva el Astronaut a la nueva posición.Move the astronaut to the new position.

Complete la codificación ejercicio 4. a en GestureAction.CS o use nuestra solución completada a continuación:Complete coding exercise 4.a in GestureAction.cs, or use our completed solution below:

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();
    }
}

Compilación e implementaciónBuild and Deploy

  • Recompile en Unity y, después, compile e implemente desde Visual Studio para ejecutar la aplicación en HoloLens.Rebuild in Unity and then build and deploy from Visual Studio to run the app in HoloLens.
  • Mueva la mano hacia delante de HoloLens y eleve el dedo del índice para que se pueda realizar el seguimiento.Move your hand in front of the HoloLens and raise your index finger so that it can be tracked.
  • Centre el cursor sobre el Astronaut.Focus the cursor over the astronaut.
  • Por ejemplo, "Move Astronaut" para trasladar Astronaut con un gesto de manipulación.Say 'Move Astronaut' to move the astronaut with a Manipulation gesture.
  • Deben aparecer cuatro flechas alrededor del cursor para indicar que el programa responderá ahora a los eventos de manipulación.Four arrows should appear around the cursor to indicate that the program will now respond to Manipulation events.
  • Baje el dedo del índice hasta el pulgar y manténgalos reducidos juntos.Lower your index finger down to your thumb, and keep them pinched together.
  • A medida que mueve la mano, el Astronaut se moverá también (esta es la manipulación).As you move your hand around, the astronaut will move too (this is Manipulation).
  • Eleve el dedo del índice para dejar de manipular el Astronaut.Raise your index finger to stop manipulating the astronaut.
  • Nota: Si no se indica "mover Astronaut" antes de mover la mano, se usará en su lugar el gesto de navegación.Note: If you do not say 'Move Astronaut' before moving your hand, then the Navigation gesture will be used instead.
  • Por ejemplo, "rotar Astronaut" para volver al estado Rotatable.Say 'Rotate Astronaut' to return to the rotatable state.

Capítulo 5: expansión del modeloChapter 5 - Model expansion

ObjetivosObjectives

  • Expanda el modelo Astronaut en varias partes más pequeñas con las que el usuario pueda interactuar.Expand the Astronaut model into multiple, smaller pieces that the user can interact with.
  • Mueva cada pieza individualmente mediante gestos de navegación y manipulación.Move each piece individually using Navigation and Manipulation gestures.

InstructionsInstructions

En esta sección, se realizarán las siguientes tareas:In this section, we will accomplish the following tasks:

  1. Agregue una nueva palabra clave "Expand Model" para expandir el modelo Astronaut.Add a new keyword "Expand Model" to expand the astronaut model.
  2. Agregue una nueva palabra clave "RESET Model" para devolver el modelo a su forma original.Add a new Keyword "Reset Model" to return the model to its original form.

Haremos esto agregando dos palabras clave más al origen de entrada de voz del capítulo anterior.We'll do this by adding two more keywords to the Speech Input Source from the previous chapter. También mostraremos otra manera de controlar los eventos de reconocimiento.We'll also demonstrate another way to handle recognition events.

  1. Haga clic en atrás en AstronautManager en el Inspector y expanda la sección palabras clave en el Inspector.Click back on AstronautManager in the Inspector and expand the Keywords section in the Inspector.
  2. Haga clic + en el lado derecho para agregar una nueva palabra clave.Click the + on the right hand side to add a new keyword.
  3. Escriba la palabra clave como modelo de expansión.Type the Keyword as Expand Model. Si lo desea, no dude en agregar un método abreviado de teclado.Feel free to add a Key Shortcut if desired.
  4. Haga clic + en el lado derecho para agregar una nueva palabra clave.Click the + on the right hand side to add a new keyword.
  5. Escriba la palabra clave como restablecer modelo.Type the Keyword as Reset Model. Si lo desea, no dude en agregar un método abreviado de teclado.Feel free to add a Key Shortcut if desired.
  6. En el panel Inspector , haga clic en el botón Agregar componente .In the Inspector panel, click the Add Component button.
  7. En el menú, escriba en el cuadro de búsqueda controlador de entrada de voz.In the menu, type in the search box Speech Input Handler. Seleccione el resultado de la búsqueda.Select the search result.
  8. Check es el agente de escucha global, ya que queremos que estos comandos funcionen independientemente de la GameObject a la que nos centramos.Check Is Global Listener, since we want these commands to work regardless of the GameObject we're focusing.
  9. Haga clic en el + botón y seleccione expandir modelo en la lista desplegable palabra clave.Click the + button and select Expand Model from the Keyword dropdown.
  10. Haga clic en en + respuesta y arrastre el AstronautManager desde la jerarquía hasta el campo ninguno (objeto) .Click the + under Response, and drag the AstronautManager from the Hierarchy into the None (Object) field.
  11. Ahora, haga clic en la lista desplegable no función , seleccione AstronautManager y ExpandModelCommand.Now, click the No Function dropdown, select AstronautManager, then ExpandModelCommand.
  12. Haga clic en el botón del controlador de entrada de voz + y seleccione restablecer modelo en la lista desplegable palabra clave.Click the Speech Input Handler's + button and select Reset Model from the Keyword dropdown.
  13. Haga clic en en + respuesta y arrastre el AstronautManager desde la jerarquía hasta el campo ninguno (objeto) .Click the + under Response, and drag the AstronautManager from the Hierarchy into the None (Object) field.
  14. Ahora, haga clic en la lista desplegable no función , seleccione AstronautManager y ResetModelCommand.Now, click the No Function dropdown, select AstronautManager, then ResetModelCommand.

Cómo configurar el origen y el controlador de entrada de voz para el capítulo 5

Compilación e implementaciónBuild and Deploy

  • ¡Pruébelo!Try it! Compile e implemente la aplicación en HoloLens.Build and deploy the app to the HoloLens.
  • Por ejemplo, expanda modelo para ver el modelo Astronaut expandido.Say Expand Model to see the expanded astronaut model.
  • Use la navegación para girar partes individuales del palo de Astronaut.Use Navigation to rotate individual pieces of the astronaut suit.
  • Por ejemplo, mueva Astronaut y, a continuación, use la manipulación para desplace partes individuales del palo de Astronaut.Say Move Astronaut and then use Manipulation to move individual pieces of the astronaut suit.
  • Por ejemplo, gire Astronaut para volver a girar las piezas.Say Rotate Astronaut to rotate the pieces again.
  • Por ejemplo, restablezca el modelo para devolver el Astronaut a su forma original.Say Reset Model to return the astronaut to its original form.

FinThe End

Felicidades.Congratulations! Ahora ha completado la entrada MR 211: gesto.You have now completed MR Input 211: Gesture.

  • Sabe cómo detectar y responder a los eventos de seguimiento, navegación y manipulación.You know how to detect and respond to hand tracking, navigation and manipulation events.
  • Comprende la diferencia entre los gestos de navegación y manipulación.You understand the difference between Navigation and Manipulation gestures.
  • Sabe cómo cambiar el cursor para proporcionar comentarios visuales sobre cuándo se detecta una mano, Cuándo se va a perder una mano y cuándo un objeto admite distintas interacciones (navegación frente a manipulación).You know how to change the cursor to provide visual feedback for when a hand is detected, when a hand is about to be lost, and for when an object supports different interactions (Navigation vs Manipulation).