Aspectos básicos de realidad mixta (101): Proyecto completo con dispositivoMR Basics 101: Complete project with device


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.


Este tutorial le guiará a través de un proyecto completo, integrado en Unity, que muestra características básicas de Windows Mixed Reality en HoloLens, como mirados, gestos, entrada de voz, sonido espacial y asignación espacial.This tutorial will walk you through a complete project, built in Unity, that demonstrates core Windows Mixed Reality features on HoloLens including gaze, gestures, voice input, spatial sound and spatial mapping.

El tutorial tardará aproximadamente 1 hora en completarse.The tutorial will take approximately 1 hour to complete.

Compatibilidad con dispositivosDevice support

CursoCourse HoloLensHoloLens Cascos envolventesImmersive headsets
Aspectos básicos de realidad mixta (101): Proyecto completo con dispositivoMR Basics 101: Complete project with device ✔️✔️

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.
    • Si sigue necesitando compatibilidad con Unity 5,6, use esta versión.If you still need Unity 5.6 support, please use this release.
    • Si sigue necesitando compatibilidad con Unity 5,5, use esta versión.If you still need Unity 5.5 support, please use this release.
    • Si sigue necesitando compatibilidad con Unity 5,4, use esta versión.If you still need Unity 5.4 support, please use this release.
  • 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. Mantenga el nombre de la carpeta como origami.Keep the folder name as Origami.

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.

Capítulo 1: mundo "Hololens"Chapter 1 - "Holo" world

En este capítulo, se configurará el primer proyecto de Unity y se recorrerá el proceso de compilación e implementación.In this chapter, we'll setup our first Unity project and step through the build and deploy process.

ObjetivosObjectives

  • Configure Unity para el desarrollo holográfica.Set up Unity for holographic development.
  • Cree un holograma.Make a hologram.
  • Vea un holograma que haya realizado.See a hologram that you made.

InstructionsInstructions

  • Inicie Unity.Start Unity.
  • seleccione Open(Abrir).Select Open.
  • Escriba ubicación como la carpeta origami que ha eliminado previamente.Enter location as the Origami folder you previously un-archived.
  • Seleccione origami y haga clic en Seleccionar carpeta.Select Origami and click Select Folder.
  • Dado que el proyecto origami no contiene una escena, guarde la escena predeterminada vacía en un nuevo archivo con: archivo / Guardar escena como.Since the Origami project does not contain a scene, save the empty default scene to a new file using: File / Save Scene As.
  • Asigne a la nueva escena el nombre origami y haga clic en el botón Guardar .Name the new scene Origami and press the Save button.

Configuración de la cámara virtual principalSetup the main virtual camera

  • En Hierarchy Panel (Panel de jerarquía), seleccione Main Camera (Cámara principal).In the Hierarchy Panel, select Main Camera.
  • En el Inspector , establezca su posición de transformación en 0, 0,0.In the Inspector set its transform position to 0,0,0.
  • Busque la propiedad Borrar marcas y cambie la lista desplegable de SKYBOX a color sólido.Find the Clear Flags property, and change the dropdown from Skybox to Solid color.
  • Haga clic en el campo Background (Fondo) para abrir un selector de colores.Click on the Background field to open a color picker.
  • Establezca R, G, B, and A (R, G, B y A) en 0.Set R, G, B, and A to 0.

Configuración de la escenaSetup the scene

  • En el Panel jerarquía, haga clic en crear y crear vacío.In the Hierarchy Panel, click on Create and Create Empty.
  • Haga clic con el botón derecho en el nuevo GameObject y seleccione Cambiar nombre.Right-click the new GameObject and select Rename. Cambie el nombre de GameObject a OrigamiCollection.Rename the GameObject to OrigamiCollection.
  • En la carpeta hologramas del panel Proyecto (expanda activos y seleccione hologramas o haga doble clic en la carpeta hologramas en el panel Proyecto):From the Holograms folder in the Project Panel (expand Assets and select Holograms or double click the Holograms folder in the Project Panel):
    • Arrastre Stage hasta la jerarquía para que sea un elemento secundario de OrigamiCollection.Drag Stage into the Hierarchy to be a child of OrigamiCollection.
    • Arrastre Sphere1 a la jerarquía de para que sea un elemento secundario de OrigamiCollection.Drag Sphere1 into the Hierarchy to be a child of OrigamiCollection.
    • Arrastre Sphere2 a la jerarquía de para que sea un elemento secundario de OrigamiCollection.Drag Sphere2 into the Hierarchy to be a child of OrigamiCollection.
  • Haga clic con el botón secundario en el objeto de luz direccional en el Panel jerarquía y seleccione eliminar.Right-click the Directional Light object in the Hierarchy Panel and select Delete.
  • En la carpeta hologramas , arrastre Lights hasta la raíz del Panel de jerarquía.From the Holograms folder, drag Lights into the root of the Hierarchy Panel.
  • En la jerarquía, seleccione el OrigamiCollection.In the Hierarchy, select the OrigamiCollection.
  • En el Inspector, establezca la posición de la transformación en 0,-0,5, 2,0.In the Inspector, set the transform position to 0, -0.5, 2.0.
  • Presione el botón reproducir en Unity para obtener una vista previa de los hologramas.Press the Play button in Unity to preview your holograms.
  • Debería ver los objetos origami en la ventana de vista previa.You should see the Origami objects in the preview window.
  • Presione reproducir una segunda vez para detener el modo de vista previa.Press Play a second time to stop preview mode.

Exportar el proyecto de Unity a Visual StudioExport the project from Unity to Visual Studio

  • En Unity, seleccione archivo > configuración de compilación.In Unity select File > Build Settings.

  • Seleccione plataforma universal de Windows en la lista plataforma y haga clic en cambiar plataforma.Select Universal Windows Platform in the Platform list and click Switch Platform.

  • Establezca SDK en universal 10 y tipo de compilación en D3D.Set SDK to Universal 10 and Build Type to D3D.

  • Compruebe los proyectos de C# de Unity.Check Unity C# Projects.

  • Haga clic en Agregar escenas abiertas para agregar la escena.Click Add Open Scenes to add the scene.

  • Haga clic en Generar.Click Build.

  • En la ventana del explorador de archivos que aparece, cree una nueva carpeta denominada "app".In the file explorer window that appears, create a New Folder named "App".

  • Haga clic en la carpeta de la aplicación.Single click the App Folder.

  • Presione Seleccionar carpeta.Press Select Folder.

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

  • Abra la carpeta de la aplicación .Open the App folder.

  • Abra (doble clic) origami. sln.Open (double click) Origami.sln.

  • 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.

  • Haga clic en la flecha situada junto al botón dispositivo y seleccione equipo remoto para implementar a través de Wi-Fi.Click on the arrow next to the Device button, and select Remote Machine to deploy over Wi-Fi.

    • Establezca la Dirección en el nombre o la dirección IP de HoloLens.Set the Address to the name or IP address of your HoloLens. Si no conoce la dirección IP del dispositivo, consulte configuración > redes & Internet > opciones avanzadas o pregunte a Cortana , ¿cuál es mi dirección IP? " .If you do not know your device IP address, look in Settings > Network & Internet > Advanced Options or ask Cortana "Hey Cortana, What's my IP address?"
    • Si HoloLens está conectado a través de USB, puede seleccionar dispositivo para implementar a través de USB.If the HoloLens is attached over USB, you may instead select Device to deploy over USB.
    • Deje el modo de autenticación establecido en universal.Leave the Authentication Mode set to Universal.
    • Haga clic en seleccionarClick Select
  • Haga clic en Depurar > iniciar sin depurar o presione Ctrl + F5.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.

  • Ahora se compilará el proyecto origami, se implementará en HoloLens y, a continuación, se ejecutará.The Origami project will now build, deploy to your HoloLens, and then run.

  • Pon en tu HoloLens y mira tu vista para ver los nuevos hologramas.Put on your HoloLens and look around to see your new holograms.

Capítulo 2: mira hacia abajoChapter 2 - Gaze

En este capítulo, vamos a presentar la primera de las tres formas de interactuar con los hologramas: miramos.In this chapter, we are going to introduce the first of three ways of interacting with your holograms -- gaze.

ObjetivosObjectives

  • Visualice la mirada con un cursor de un mundo bloqueado.Visualize your gaze using a world-locked cursor.

InstructionsInstructions

  • Vuelva al proyecto de Unity y cierre la ventana de configuración de la compilación si aún está abierta.Go back to your Unity project, and close the Build Settings window if it's still open.
  • Seleccione la carpeta hologramas en el panel Proyecto.Select the Holograms folder in the Project panel.
  • Arrastre el objeto cursor al Panel jerarquía en el nivel raíz.Drag the Cursor object into the Hierarchy panel at the root level.
  • Haga doble clic en el objeto cursor para examinarlo más detenidamente.Double-click on the Cursor object to take a closer look at it.
  • Haga clic con el botón secundario en la carpeta scripts en el panel Proyecto.Right-click on the Scripts folder in the Project panel.
  • Haga clic en el submenú crear .Click the Create sub-menu.
  • Seleccione script de C#.Select C# Script.
  • Asigne al script el nombre WorldCursor.Name the script WorldCursor. Nota: el nombre distingue mayúsculas de minúsculas.Note: The name is case-sensitive. No es necesario agregar la extensión. cs.You do not need to add the .cs extension.
  • Seleccione el objeto cursor en el Panel jerarquía.Select the Cursor object in the Hierarchy panel.
  • Arrastre y coloque el script WorldCursor en el panel Inspector.Drag and drop the WorldCursor script into the Inspector panel.
  • Haga doble clic en el script WorldCursor para abrirlo en Visual Studio.Double-click the WorldCursor script to open it in Visual Studio.
  • Copie y pegue este código en WorldCursor.CS y guarde todo.Copy and paste this code into WorldCursor.cs and Save All.
using UnityEngine;

public class WorldCursor : MonoBehaviour
{
    private MeshRenderer meshRenderer;

    // Use this for initialization
    void Start()
    {
        // Grab the mesh renderer that's on the same object as this script.
        meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        // Do a raycast into the world based on the user's
        // head position and orientation.
        var headPosition = Camera.main.transform.position;
        var gazeDirection = Camera.main.transform.forward;

        RaycastHit hitInfo;

        if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
        {
            // If the raycast hit a hologram...
            // Display the cursor mesh.
            meshRenderer.enabled = true;

            // Move the cursor to the point where the raycast hit.
            this.transform.position = hitInfo.point;

            // Rotate the cursor to hug the surface of the hologram.
            this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
        }
        else
        {
            // If the raycast did not hit a hologram, hide the cursor mesh.
            meshRenderer.enabled = false;
        }
    }
}
  • Vuelva a compilar la aplicación desde el archivo > la configuración de compilación.Rebuild the app from File > Build Settings.
  • Vuelva a la solución de Visual Studio que se usó anteriormente para implementar en HoloLens.Return to the Visual Studio solution previously used to deploy to your HoloLens.
  • Seleccione "recargar todo" cuando se le solicite.Select 'Reload All' when prompted.
  • Haga clic en depurar-> iniciar sin depurar o presione Ctrl + F5.Click Debug -> Start Without debugging or press Ctrl + F5.
  • Ahora mire la escena y observe cómo interactúa el cursor con la forma de los objetos.Now look around the scene and notice how the cursor interacts with the shape of objects.

Capítulo 3: gestosChapter 3 - Gestures

En este capítulo, se agregará compatibilidad con gestos.In this chapter, we'll add support for gestures. Cuando el usuario selecciona una esfera de papel, haremos que la esfera se active al activar la gravedad mediante el motor físico de Unity.When the user selects a paper sphere, we'll make the sphere fall by turning on gravity using Unity's physics engine.

ObjetivosObjectives

  • Controle los hologramas con el gesto de selección.Control your holograms with the Select gesture.

InstructionsInstructions

Comenzaremos por crear un script y luego puede detectar el gesto de selección.We'll start by creating a script then can detect the Select gesture.

  • En la carpeta scripts , cree un script denominado GazeGestureManager.In the Scripts folder, create a script named GazeGestureManager.
  • Arrastre el script GazeGestureManager hasta el objeto OrigamiCollection de la jerarquía.Drag the GazeGestureManager script onto the OrigamiCollection object in the Hierarchy.
  • Abra el script GazeGestureManager en Visual Studio y agregue el código siguiente:Open the GazeGestureManager script in Visual Studio and add the following code:
using UnityEngine;
using UnityEngine.XR.WSA.Input;

public class GazeGestureManager : MonoBehaviour
{
    public static GazeGestureManager Instance { get; private set; }

    // Represents the hologram that is currently being gazed at.
    public GameObject FocusedObject { get; private set; }

    GestureRecognizer recognizer;

    // Use this for initialization
    void Awake()
    {
        Instance = this;

        // Set up a GestureRecognizer to detect Select gestures.
        recognizer = new GestureRecognizer();
        recognizer.Tapped += (args) =>
        {
            // Send an OnSelect message to the focused object and its ancestors.
            if (FocusedObject != null)
            {
                FocusedObject.SendMessageUpwards("OnSelect", SendMessageOptions.DontRequireReceiver);
            }
        };
        recognizer.StartCapturingGestures();
    }

    // Update is called once per frame
    void Update()
    {
        // Figure out which hologram is focused this frame.
        GameObject oldFocusObject = FocusedObject;

        // Do a raycast into the world based on the user's
        // head position and orientation.
        var headPosition = Camera.main.transform.position;
        var gazeDirection = Camera.main.transform.forward;

        RaycastHit hitInfo;
        if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
        {
            // If the raycast hit a hologram, use that as the focused object.
            FocusedObject = hitInfo.collider.gameObject;
        }
        else
        {
            // If the raycast did not hit a hologram, clear the focused object.
            FocusedObject = null;
        }

        // If the focused object changed this frame,
        // start detecting fresh gestures again.
        if (FocusedObject != oldFocusObject)
        {
            recognizer.CancelGestures();
            recognizer.StartCapturingGestures();
        }
    }
}
  • Cree otro script en la carpeta scripts, esta vez con el nombre SphereCommands.Create another script in the Scripts folder, this time named SphereCommands.
  • Expanda el objeto OrigamiCollection en la vista de jerarquía.Expand the OrigamiCollection object in the Hierarchy view.
  • Arrastre el script SphereCommands al objeto Sphere1 en el panel jerarquía.Drag the SphereCommands script onto the Sphere1 object in the Hierarchy panel.
  • Arrastre el script SphereCommands al objeto Sphere2 en el panel jerarquía.Drag the SphereCommands script onto the Sphere2 object in the Hierarchy panel.
  • Abra el script en Visual Studio para editarlo y reemplace el código predeterminado por este:Open the script in Visual Studio for editing, and replace the default code with this:
using UnityEngine;

public class SphereCommands : MonoBehaviour
{
    // Called by GazeGestureManager when the user performs a Select gesture
    void OnSelect()
    {
        // If the sphere has no Rigidbody component, add one to enable physics.
        if (!this.GetComponent<Rigidbody>())
        {
            var rigidbody = this.gameObject.AddComponent<Rigidbody>();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}
  • Exporte, compile e implemente la aplicación en su HoloLens.Export, build and deploy the app to your HoloLens.
  • Fíjese en uno de los esferas.Look at one of the spheres.
  • Realice el gesto seleccionar y observe la esfera que se coloca en la superficie siguiente.Perform the select gesture and watch the sphere drop onto the surface below.

Capítulo 4: vozChapter 4 - Voice

En este capítulo, se agregará compatibilidad con dos comandos de voz: "RESET World" para devolver los esferas quitados a su ubicación original y "Drop Sphere" para que la esfera quede.In this chapter, we'll add support for two voice commands: "Reset world" to return the dropped spheres to their original location, and "Drop sphere" to make the sphere fall.

ObjetivosObjectives

  • Agregue comandos de voz que siempre escuchan en segundo plano.Add voice commands that always listen in the background.
  • Cree un holograma que reaccione a un comando de voz.Create a hologram that reacts to a voice command.

InstructionsInstructions

  • En la carpeta scripts , cree un script denominado SpeechManager.In the Scripts folder, create a script named SpeechManager.
  • Arrastre el script SpeechManager hasta el objeto OrigamiCollection de la jerarquía.Drag the SpeechManager script onto the OrigamiCollection object in the Hierarchy
  • Abra el script SpeechManager en Visual Studio.Open the SpeechManager script in Visual Studio.
  • Copie y pegue este código en SpeechManager.CS y guarde todo:Copy and paste this code into SpeechManager.cs and Save All:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Windows.Speech;

public class SpeechManager : MonoBehaviour
{
    KeywordRecognizer keywordRecognizer = null;
    Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

    // Use this for initialization
    void Start()
    {
        keywords.Add("Reset world", () =>
        {
            // Call the OnReset method on every descendant object.
            this.BroadcastMessage("OnReset");
        });

        keywords.Add("Drop Sphere", () =>
        {
            var focusObject = GazeGestureManager.Instance.FocusedObject;
            if (focusObject != null)
            {
                // Call the OnDrop method on just the focused object.
                focusObject.SendMessage("OnDrop", SendMessageOptions.DontRequireReceiver);
            }
        });

        // Tell the KeywordRecognizer about our keywords.
        keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

        // Register a callback for the KeywordRecognizer and start recognizing!
        keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
        keywordRecognizer.Start();
    }

    private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        System.Action keywordAction;
        if (keywords.TryGetValue(args.text, out keywordAction))
        {
            keywordAction.Invoke();
        }
    }
}
  • Abra el script SphereCommands en Visual Studio.Open the SphereCommands script in Visual Studio.
  • Actualice el script para que se lea de la siguiente manera:Update the script to read as follows:
using UnityEngine;

public class SphereCommands : MonoBehaviour
{
    Vector3 originalPosition;

    // Use this for initialization
    void Start()
    {
        // Grab the original local position of the sphere when the app starts.
        originalPosition = this.transform.localPosition;
    }

    // Called by GazeGestureManager when the user performs a Select gesture
    void OnSelect()
    {
        // If the sphere has no Rigidbody component, add one to enable physics.
        if (!this.GetComponent<Rigidbody>())
        {
            var rigidbody = this.gameObject.AddComponent<Rigidbody>();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }

    // Called by SpeechManager when the user says the "Reset world" command
    void OnReset()
    {
        // If the sphere has a Rigidbody component, remove it to disable physics.
        var rigidbody = this.GetComponent<Rigidbody>();
        if (rigidbody != null)
        {
            rigidbody.isKinematic = true;
            Destroy(rigidbody);
        }

        // Put the sphere back into its original local position.
        this.transform.localPosition = originalPosition;
    }

    // Called by SpeechManager when the user says the "Drop sphere" command
    void OnDrop()
    {
        // Just do the same logic as a Select gesture.
        OnSelect();
    }
}
  • Exporte, compile e implemente la aplicación en su HoloLens.Export, build and deploy the app to your HoloLens.
  • Fíjese en uno de los esferas y en "colocar esfera".Look at one of the spheres, and say "Drop Sphere".
  • Por ejemplo, "restablecer mundo" para volver a colocarlos en sus posiciones iniciales.Say "Reset World" to bring them back to their initial positions.

Capítulo 5: sonido espacialChapter 5 - Spatial sound

En este capítulo, agregaremos música a la aplicación y, a continuación, desencadenaremos efectos sonoros en determinadas acciones.In this chapter, we'll add music to the app, and then trigger sound effects on certain actions. Usaremos el sonido espacial para proporcionar a los sonidos una ubicación específica en el espacio 3D.We'll be using spatial sound to give sounds a specific location in 3D space.

ObjetivosObjectives

  • Escuche los hologramas de su mundo.Hear holograms in your world.

InstructionsInstructions

  • En Unity, seleccione en el menú superior editar > configuración del proyecto > audioIn Unity select from the top menu Edit > Project Settings > Audio
  • En el panel Inspector del lado derecho, busque la configuración del complemento Spatializer y seleccione MS HRTF Spatializer.In the Inspector Panel on the right side, find the Spatializer Plugin setting and select MS HRTF Spatializer.
  • En la carpeta hologramas del panel Proyecto, arrastre el objeto ambiente hasta el objeto OrigamiCollection en el panel jerarquía.From the Holograms folder in the Project panel, drag the Ambience object onto the OrigamiCollection object in the Hierarchy Panel.
  • Seleccione OrigamiCollection y busque el componente origen de audio en el panel Inspector.Select OrigamiCollection and find the Audio Source component in the Inspector panel. Cambie estas propiedades:Change these properties:
    • Compruebe la propiedad Spatial .Check the Spatialize property.
    • Active la casilla reproducir en activo.Check the Play On Awake.
    • Cambie la mezcla espacial a 3D arrastrando el control deslizante hasta la derecha.Change Spatial Blend to 3D by dragging the slider all the way to the right. El valor debe cambiar de 0 a 1 cuando se mueve el control deslizante.The value should change from 0 to 1 when you move the slider.
    • Compruebe la propiedad Loop .Check the Loop property.
    • Expanda configuración de sonido 3D y escriba 0,1 para el nivel de Doppler.Expand 3D Sound Settings, and enter 0.1 for Doppler Level.
    • Establezca rolloff de volumen en rolloff logarítmica.Set Volume Rolloff to Logarithmic Rolloff.
    • Establezca la distancia máxima en 20.Set Max Distance to 20.
  • En la carpeta scripts , cree un script denominado SphereSounds.In the Scripts folder, create a script named SphereSounds.
  • Arrastre y coloque SphereSounds en los objetos Sphere1 y Sphere2 de la jerarquía.Drag and drop SphereSounds to the Sphere1 and Sphere2 objects in the Hierarchy.
  • Abra SphereSounds en Visual Studio, actualice el código siguiente y guarde todo.Open SphereSounds in Visual Studio, update the following code and Save All.
using UnityEngine;

public class SphereSounds : MonoBehaviour
{
    AudioSource impactAudioSource = null;
    AudioSource rollingAudioSource = null;

    bool rolling = false;

    void Start()
    {
        // Add an AudioSource component and set up some defaults
        impactAudioSource = gameObject.AddComponent<AudioSource>();
        impactAudioSource.playOnAwake = false;
        impactAudioSource.spatialize = true;
        impactAudioSource.spatialBlend = 1.0f;
        impactAudioSource.dopplerLevel = 0.0f;
        impactAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
        impactAudioSource.maxDistance = 20f;

        rollingAudioSource = gameObject.AddComponent<AudioSource>();
        rollingAudioSource.playOnAwake = false;
        rollingAudioSource.spatialize = true;
        rollingAudioSource.spatialBlend = 1.0f;
        rollingAudioSource.dopplerLevel = 0.0f;
        rollingAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
        rollingAudioSource.maxDistance = 20f;
        rollingAudioSource.loop = true;

        // Load the Sphere sounds from the Resources folder
        impactAudioSource.clip = Resources.Load<AudioClip>("Impact");
        rollingAudioSource.clip = Resources.Load<AudioClip>("Rolling");
    }

    // Occurs when this object starts colliding with another object
    void OnCollisionEnter(Collision collision)
    {
        // Play an impact sound if the sphere impacts strongly enough.
        if (collision.relativeVelocity.magnitude >= 0.1f)
        {
            impactAudioSource.Play();
        }
    }

    // Occurs each frame that this object continues to collide with another object
    void OnCollisionStay(Collision collision)
    {
        Rigidbody rigid = gameObject.GetComponent<Rigidbody>();

        // Play a rolling sound if the sphere is rolling fast enough.
        if (!rolling && rigid.velocity.magnitude >= 0.01f)
        {
            rolling = true;
            rollingAudioSource.Play();
        }
        // Stop the rolling sound if rolling slows down.
        else if (rolling && rigid.velocity.magnitude < 0.01f)
        {
            rolling = false;
            rollingAudioSource.Stop();
        }
    }

    // Occurs when this object stops colliding with another object
    void OnCollisionExit(Collision collision)
    {
        // Stop the rolling sound if the object falls off and stops colliding.
        if (rolling)
        {
            rolling = false;
            impactAudioSource.Stop();
            rollingAudioSource.Stop();
        }
    }
}
  • Guarde el script y vuelva a Unity.Save the script, and return to Unity.
  • Exporte, compile e implemente la aplicación en su HoloLens.Export, build and deploy the app to your HoloLens.
  • Desplácese más cerca y más lejos de la fase y vuelva al lado para oír el cambio de los sonidos.Move closer and further from the Stage and turn side-to-side to hear the sounds change.

Capítulo 6: asignación espacialChapter 6 - Spatial mapping

Ahora vamos a usar la asignación espacial para colocar el tablero de juego en un objeto real del mundo real.Now we are going to use spatial mapping to place the game board on a real object in the real world.

ObjetivosObjectives

  • Traiga su mundo real al mundo virtual.Bring your real world into the virtual world.
  • Coloque los hologramas donde más le importan.Place your holograms where they matter most to you.

InstructionsInstructions

  • En Unity, haga clic en la carpeta hologramas en el panel Proyecto.In Unity, click on the Holograms folder in the Project panel.
  • Arrastre el recurso de asignación espacial a la raíz de la jerarquía.Drag the Spatial Mapping asset into the root of the Hierarchy.
  • Haga clic en el objeto de asignación espacial en la jerarquía.Click on the Spatial Mapping object in the Hierarchy.
  • En el panel Inspector, cambie las siguientes propiedades:In the Inspector panel, change the following properties:
    • Active la casilla dibujar mallas visuales .Check the Draw Visual Meshes box.
    • Busque material de dibujo y haga clic en el círculo de la derecha.Locate Draw Material and click the circle on the right. Escriba "Wireframe" en el campo de búsqueda de la parte superior.Type "wireframe" into the search field at the top. Haga clic en el resultado y, a continuación, cierre la ventana.Click on the result and then close the window. Al hacerlo, el valor de Draw material debe establecerse en Wireframe.When you do this, the value for Draw Material should get set to Wireframe.
  • Exporte, compile e implemente la aplicación en su HoloLens.Export, build and deploy the app to your HoloLens.
  • Cuando se ejecuta la aplicación, una malla de alambres se superpone a su mundo real.When the app runs, a wireframe mesh will overlay your real world.
  • Vea cómo una esfera gradual se quedará fuera de la fase y en el suelo.Watch how a rolling sphere will fall off the stage, and onto the floor!

Ahora le mostraremos cómo trasladar el OrigamiCollection a una nueva ubicación:Now we'll show you how to move the OrigamiCollection to a new location:

  • En la carpeta scripts , cree un script denominado TapToPlaceParent.In the Scripts folder, create a script named TapToPlaceParent.
  • En la jerarquía, expanda OrigamiCollection y seleccione el objeto Stage .In the Hierarchy, expand the OrigamiCollection and select the Stage object.
  • Arrastre el script TapToPlaceParent hasta el objeto Stage.Drag the TapToPlaceParent script onto the Stage object.
  • Abra el script TapToPlaceParent en Visual Studio y actualícelo para que sea el siguiente:Open the TapToPlaceParent script in Visual Studio, and update it to be the following:
using UnityEngine;

public class TapToPlaceParent : MonoBehaviour
{
    bool placing = false;

    // Called by GazeGestureManager when the user performs a Select gesture
    void OnSelect()
    {
        // On each Select gesture, toggle whether the user is in placing mode.
        placing = !placing;

        // If the user is in placing mode, display the spatial mapping mesh.
        if (placing)
        {
            SpatialMapping.Instance.DrawVisualMeshes = true;
        }
        // If the user is not in placing mode, hide the spatial mapping mesh.
        else
        {
            SpatialMapping.Instance.DrawVisualMeshes = false;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // If the user is in placing mode,
        // update the placement to match the user's gaze.

        if (placing)
        {
            // Do a raycast into the world that will only hit the Spatial Mapping mesh.
            var headPosition = Camera.main.transform.position;
            var gazeDirection = Camera.main.transform.forward;

            RaycastHit hitInfo;
            if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
                30.0f, SpatialMapping.PhysicsRaycastMask))
            {
                // Move this object's parent object to
                // where the raycast hit the Spatial Mapping mesh.
                this.transform.parent.position = hitInfo.point;

                // Rotate this object's parent object to face the user.
                Quaternion toQuat = Camera.main.transform.localRotation;
                toQuat.x = 0;
                toQuat.z = 0;
                this.transform.parent.rotation = toQuat;
            }
        }
    }
}
  • Exportar, compilar e implementar la aplicación.Export, build and deploy the app.
  • Ahora debería poder colocar el juego en una ubicación específica Gazing en él, con el gesto seleccionar y, a continuación, pasar a una nueva ubicación y volver a usar el gesto seleccionar.Now you should now be able to place the game in a specific location by gazing at it, using the Select gesture and then moving to a new location, and using the Select gesture again.

Capítulo 7: diversión de holográficaChapter 7 - Holographic fun

ObjetivosObjectives

  • Revela la entrada a un mundo holográfica.Reveal the entrance to a holographic underworld.

InstructionsInstructions

Ahora le mostraremos cómo descubrir el mundo holográfica:Now we'll show you how to uncover the holographic underworld:

  • En la carpeta hologramas del panel Proyecto:From the Holograms folder in the Project Panel:
    • Arrastre el submundo a la jerarquía para que sea un elemento secundario de OrigamiCollection.Drag Underworld into the Hierarchy to be a child of OrigamiCollection.
  • En la carpeta scripts , cree un script denominado HitTarget.In the Scripts folder, create a script named HitTarget.
  • En la jerarquía, expanda OrigamiCollection.In the Hierarchy, expand the OrigamiCollection.
  • Expanda el objeto fase y seleccione el objeto de destino (ventilador azul).Expand the Stage object and select the Target object (blue fan).
  • Arrastre el script HitTarget al objeto de destino .Drag the HitTarget script onto the Target object.
  • Abra el script HitTarget en Visual Studio y actualícelo para que sea el siguiente:Open the HitTarget script in Visual Studio, and update it to be the following:
using UnityEngine;

public class HitTarget : MonoBehaviour
{
    // These public fields become settable properties in the Unity editor.
    public GameObject underworld;
    public GameObject objectToHide;

    // Occurs when this object starts colliding with another object
    void OnCollisionEnter(Collision collision)
    {
        // Hide the stage and show the underworld.
        objectToHide.SetActive(false);
        underworld.SetActive(true);

        // Disable Spatial Mapping to let the spheres enter the underworld.
        SpatialMapping.Instance.MappingEnabled = false;
    }
}
  • En Unity, seleccione el objeto de destino .In Unity, select the Target object.
  • Ahora hay dos propiedades públicas visibles en el componente de destino de aciertos y necesitan hacer referencia a los objetos de nuestra escena:Two public properties are now visible on the Hit Target component and need to reference objects in our scene:
    • Arrastre el subámbito del panel jerarquía a la propiedad subworld del componente destino de la visita.Drag Underworld from the Hierarchy panel to the Underworld property on the Hit Target component.
    • Arrastre fase desde el panel jerarquía hasta el objeto para ocultar la propiedad en el componente de destino de la visita .Drag Stage from the Hierarchy panel to the Object to Hide property on the Hit Target component.
  • Exportar, compilar e implementar la aplicación.Export, build and deploy the app.
  • Coloque la colección origami en el plano inferior y, a continuación, use el gesto seleccionar para hacer una colocación de esfera.Place the Origami Collection on the floor, and then use the Select gesture to make a sphere drop.
  • Cuando la esfera alcanza el destino (ventilador azul), se producirá una explosión.When the sphere hits the target (blue fan), an explosion will occur. La colección se ocultará y aparecerá un hueco para el mundo.The collection will be hidden and a hole to the underworld will appear.

FinThe end

Y este es el final de este tutorial.And that's the end of this tutorial!

Ha aprendido:You learned:

  • Cómo crear una aplicación holográfica en Unity.How to create a holographic app in Unity.
  • Cómo hacer uso de fijamente, gestos, voz, sonido y asignación espacial.How to make use of gaze, gesture, voice, sound, and spatial mapping.
  • Cómo compilar e implementar una aplicación con Visual Studio.How to build and deploy an app using Visual Studio.

Ya está listo para empezar a crear su propia experiencia holográfica.You are now ready to start creating your own holographic experience!

Consulte tambiénSee also