HoloLens (första generationen) Indata 211: Gest

Viktigt

Självstudierna Mixed Reality Academy har utformats med HoloLens (första generationen), Unity 2017 och Mixed Reality integrerande headset i åtanke. Därför anser vi att det är viktigt att låta de här självstudierna vara kvar för utvecklare som fortfarande letar efter vägledning för att utveckla för dessa enheter. De här självstudierna uppdateras inte med de senaste verktygsuppsättningarna eller interaktionerna som används för HoloLens 2 och kanske inte är kompatibla med nyare versioner av Unity. De underhålls för att fortsätta arbeta på de enheter som stöds. En ny serie självstudier har publicerats för HoloLens 2.

Gester förvandlar användarens avsikt till handling. Med gester kan användarna interagera med hologram. I den här kursen får vi lära oss hur du spårar användarens händer, svarar på användarindata och ger feedback till användaren baserat på handtillstånd och plats.

I MR Basics 101 använde vi en enkel lufttryckningsgest för att interagera med våra hologram. Nu ska vi gå bortom lufttrycksgesten och utforska nya begrepp för att:

  • Identifiera när användarens hand spåras och ge feedback till användaren.
  • Använd en navigeringsgest för att rotera våra hologram.
  • Ge feedback när användarens hand är på väg att försvinna.
  • Använd manipulationshändelser för att tillåta användare att flytta hologram med händerna.

I den här kursen går vi tillbaka till Unity-projektet Model Explorer, som vi skapade i MR Input 210. Vår astronautvän är tillbaka för att hjälpa oss att utforska dessa nya gestbegrepp.

Viktigt

Videorna som är inbäddade i vart och ett av kapitlen nedan spelades in med hjälp av en äldre version av Unity och Mixed Reality Toolkit. Även om de stegvisa instruktionerna är korrekta och aktuella kan du se skript och visuella objekt i motsvarande videor som är inaktuella. Videorna förblir inkluderade för eftervärlden och eftersom de begrepp som beskrivs fortfarande gäller.

Stöd för enheter

Kurs HoloLens Integrerande headset
MR-indata 211: Gest ✔️ ✔️

Innan du börjar

Förutsättningar

Projektfiler

  • Ladda ned de filer som krävs av projektet. Kräver Unity 2017.2 eller senare.
  • Avarkivera filerna på skrivbordet eller på en annan plats som är enkel att nå.

Anteckning

Om du vill titta igenom källkoden innan du laddar ned den är den tillgänglig på GitHub.

Errata och anteckningar

  • "Aktivera Just My Code" måste inaktiveras (avmarkerat) i Visual Studio under Verktyg-Alternativ-Felsökning>> för att nå brytpunkter i koden.

Kapitel 0 – Unity-installation

Instruktioner

  1. Starta Unity.
  2. Välj Öppna.
  3. Navigera till den gestmapp som du tidigare avarkiverade.
  4. Leta upp och välj mappen Starta/modellutforskaren .
  5. Klicka på knappen Välj mapp .
  6. I projektpanelen expanderar du mappen Scener .
  7. Dubbelklicka på ModelExplorer-scenen för att läsa in den i Unity.

Byggnad

  1. I Unity väljer du Inställningar för filbygge>.
  2. Om Scenes/ModelExplorer inte visas i Scener i build klickar du på Lägg till öppna scener för att lägga till scenen.
  3. Om du utvecklar specifikt för HoloLens anger du Målenhet till HoloLens. Annars lämnar du den på Valfri enhet.
  4. Se till att versionstypen är inställd på D3D och att SDK är inställt på Senaste installerat (som ska vara SDK 16299 eller senare).
  5. Klicka på Skapa.
  6. Skapa en ny mapp med namnet "App".
  7. Klicka på mappen App .
  8. Tryck på Välj mapp så börjar Unity skapa projektet för Visual Studio.

När Unity är klart visas ett Utforskaren fönster.

  1. Öppna mappen App .
  2. Öppna Lösningen ModelExplorer Visual Studio.

Om du distribuerar till HoloLens:

  1. Använd det översta verktygsfältet i Visual Studio och ändra målet från Felsökning till Släpp och från ARM till x86.
  2. Klicka på listrutepilen bredvid knappen Lokal dator och välj Fjärrdator.
  3. Ange din HoloLens-enhets-IP-adress och ange Autentiseringsläge till Universellt (okrypterat protokoll). Klicka på Välj. Om du inte känner till enhetens IP-adress tittar du i Inställningar > Nätverk & Avancerade Internetalternativ>.
  4. I den översta menyraden klickar du på Felsöka –> Starta utan felsökning eller tryck på Ctrl + F5. Om det här är första gången du distribuerar till enheten måste du koppla den till Visual Studio.
  5. När appen har distribuerats stänger du Fitbox med en select-gest.

Om du distribuerar till ett uppslukande headset:

  1. Använd det översta verktygsfältet i Visual Studio och ändra målet från Felsökning till Släpp och från ARM till x64.
  2. Kontrollera att distributionsmålet är inställt på Lokal dator.
  3. I den översta menyraden klickar du på Felsöka –> Starta utan felsökning eller tryck på Ctrl + F5.
  4. När appen har distribuerats stänger du Fitbox genom att trycka på utlösaren på en rörelsestyrenhet.

Anteckning

Du kanske ser några röda fel på panelen Visual Studio-fel. Det är säkert att ignorera dem. Växla till panelen Utdata för att visa faktiska byggframsteg. Fel i utdatapanelen kräver att du gör en korrigering (oftast orsakas de av ett misstag i ett skript).

Kapitel 1 – Hand upptäckt feedback

Mål

  • Prenumerera på handspårningshändelser.
  • Använd markörfeedback för att visa användare när en hand spåras.

Anteckning

På HoloLens 2 identifieras händer bränder när händerna är synliga (inte bara när ett finger pekar upp).

Instruktioner

  • Expandera Objektet InputManager på panelen Hierarki.
  • Leta efter och välj objektet GesturesInput .

Skriptet InteractionInputSource.cs utför följande steg:

  1. Prenumererar på händelserna InteractionSourceDetected och InteractionSourceLost.
  2. Anger tillståndet HandDetected.
  3. Avregistrerar sig från InteractionSourceDetected- och InteractionSourceLost-händelserna.

Nu ska vi uppgradera markören från MR Input 210 till en som visar feedback beroende på användarens åtgärder.

  1. I panelen Hierarki väljer du markörobjektet och tar bort det.
  2. I projektpanelen söker du efter CursorWithFeedback och drar den till panelen Hierarki .
  3. Klicka på InputManager på panelen Hierarki och dra sedan objektet CursorWithFeedback från hierarkin till Fältet SimpleSinglePointerSelector i InputManagers markörfält längst ned i Inspector.
  4. Klicka på CursorWithFeedback i hierarkin.
  5. I panelen Kontroll expanderar du Markörtillståndsdata i objektmarkörskriptet .

Markörtillståndsdata fungerar så här:

  • Tillståndet Observera innebär att ingen hand identifieras och att användaren bara tittar runt.
  • Alla Interaktionstillstånd innebär att en hand eller kontrollant identifieras.
  • Ett hovringstillstånd innebär att användaren tittar på ett hologram.

Skapa och distribuera

  • I Unity använder du Inställningar för filskapning > för att återskapa programmet.
  • Öppna mappen App .
  • Om den inte redan är öppen öppnar du Visual Studio-lösningen ModelExplorer.
    • (Om du redan har skapat/distribuerat det här projektet i Visual Studio under konfigurationen kan du öppna den instansen av VS och klicka på Läs in alla igen när du uppmanas till det).
  • I Visual Studio klickar du på Felsöka –> Starta utan felsökning eller tryck på Ctrl + F5.
  • När programmet har distribuerats till HoloLens stänger du fitboxen med hjälp av lufttryckningsgesten.
  • Flytta din hand i sikte och peka ditt pekfinger mot himlen för att starta handspårning.
  • Flytta din hand åt vänster, höger, upp och ner.
  • Se hur markören ändras när din hand identifieras och sedan förloras från vyn.
  • Om du använder ett integrerande headset måste du ansluta och koppla från styrenheten. Den här feedbacken blir mindre intressant på en integrerande enhet, eftersom en ansluten styrenhet alltid kommer att vara "tillgänglig".

Kapitel 2 – Navigering

Mål

  • Använd Navigeringsgesthändelser för att rotera astronauten.

Instruktioner

Om du vill använda navigeringsgester i vår app ska vi redigera GestureAction.cs för att rotera objekt när navigeringsgesten inträffar. Dessutom lägger vi till feedback till markören som ska visas när navigering är tillgänglig.

  1. I panelen Hierarki expanderar du CursorWithFeedback.
  2. Leta reda på ScrollFeedback-tillgången i mappen Holograms.
  3. Dra och släpp prefab för ScrollFeedbackCursorWithFeedback GameObject i hierarkin.
  4. Klicka på CursorWithFeedback.
  5. I panelen Kontroll klickar du på knappen Lägg till komponent .
  6. I menyn skriver du i sökrutan CursorFeedback. Välj sökresultatet.
  7. Dra och släpp ScrollFeedback-objektet från hierarkin till egenskapen Scroll Detected Game Object i cursor feedback-komponenten i Inspector.
  8. I panelen Hierarki väljer du objektet AstroMan .
  9. I panelen Kontroll klickar du på knappen Lägg till komponent .
  10. I menyn skriver du i sökrutan Geståtgärd. Välj sökresultatet.

Öppna sedan GestureAction.cs i Visual Studio. I kodningsövning 2.c redigerar du skriptet för att göra följande:

  1. Rotera AstroMan-objektet när en navigeringsgest utförs.
  2. Beräkna rotationFactor för att kontrollera hur mycket rotation som tillämpas på objektet.
  3. Rotera objektet runt y-axeln när användaren flyttar handen åt vänster eller höger.

Slutför kodningsövningarna 2.c i skriptet eller ersätt koden med den färdiga lösningen nedan:

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

Du kommer att märka att de andra navigeringshändelserna redan är ifyllda med viss information. Vi push-överför GameObject till Toolkits inputsystems modala stack, så att användaren inte behöver behålla fokus på astronauten när rotationen har påbörjats. På motsvarande sätt tar vi bort GameObject från stacken när gesten har slutförts.

Skapa och distribuera

  1. Återskapa programmet i Unity och skapa och distribuera sedan från Visual Studio för att köra det i HoloLens.
  2. Blick på astronauten, två pilar bör visas på vardera sidan av markören. Det här nya visuella objektet anger att astronauten kan roteras.
  3. Placera handen i klar position (pekfingret pekar mot himlen) så att HoloLens börjar spåra din hand.
  4. Om du vill rotera astronauten sänker du pekfingret till en klämposition och flyttar sedan handen åt vänster eller höger för att utlösa NavigationX-gesten.

Kapitel 3 – Handvägledning

Mål

  • Använd handvägledningspoäng för att förutsäga när handspårning kommer att gå förlorad.
  • Ge feedback på markören för att visa när användarens hand närmar sig kamerans kant.

Instruktioner

  1. I panelen Hierarki väljer du objektet CursorWithFeedback .
  2. I panelen Kontroll klickar du på knappen Lägg till komponent .
  3. I menyn skriver du i sökrutan Handvägledning. Välj sökresultatet.
  4. I mappen Hologramsprojektpanelen letar du upp tillgången HandGuidanceFeedback.
  5. Dra och släpp tillgången HandGuidanceFeedback på egenskapen Indikator för handvägledningpanelen Kontroll .

Skapa och distribuera

  • Återskapa programmet i Unity och skapa och distribuera sedan från Visual Studio för att uppleva appen på HoloLens.
  • Ta din hand i sikte och höj ditt pekfinger för att spåras.
  • Börja rotera astronauten med navigeringsgesten (kläm ihop pekfingret och tummen).
  • Flytta din hand längst till vänster, höger, upp och ner.
  • När handen närmar sig kanten av gestramen bör en pil visas bredvid markören för att varna dig om att handspårning kommer att gå förlorad. Pilen anger i vilken riktning du vill flytta handen för att förhindra att spårning går förlorad.

Kapitel 4 – Manipulering

Mål

  • Använd manipulationshändelser för att flytta astronauten med händerna.
  • Ge feedback om markören för att meddela användaren när manipulering kan användas.

Instruktioner

GestureManager.cs och AstronautManager.cs gör att vi kan göra följande:

  1. Använd nyckelordet "Flytta astronaut" för att aktivera manipuleringsgester och "Rotera astronaut" för att inaktivera dem.
  2. Växla till att svara på manipulationsgestigenkänningen.

Nu sätter vi igång.

  1. I panelen Hierarki skapar du ett nytt tomt GameObject. Ge den namnet "AstronautManager".
  2. I panelen Kontroll klickar du på knappen Lägg till komponent .
  3. I menyn skriver du i sökrutan Astronaut Manager. Välj sökresultatet.
  4. I panelen Kontroll klickar du på knappen Lägg till komponent .
  5. I menyn skriver du i sökrutan Speech Input Source (Talindatakälla). Välj sökresultatet.

Nu ska vi lägga till de talkommandon som krävs för att kontrollera astronautens interaktionstillstånd.

  1. Expandera avsnittet Nyckelord i Inspector.
  2. + Klicka på till höger för att lägga till ett nytt nyckelord.
  3. Skriv nyckelordet som Flytta astronaut. Lägg gärna till en nyckelgenväg om du vill.
  4. + Klicka på till höger för att lägga till ett nytt nyckelord.
  5. Skriv nyckelordet som Rotate Astronaut (Rotera astronaut). Lägg gärna till en nyckelgenväg om du vill.
  6. Motsvarande hanterarkod finns i GestureAction.cs i hanteraren ISpeechHandler.OnSpeechKeywordRecognized .

Så här konfigurerar du Speech Input Source för kapitel 4

Därefter konfigurerar vi manipulationsfeedback på markören.

  1. Leta reda på pathingFeedback-tillgången i mappen Hologram påprojektpanelen.
  2. Dra och släpp prefab för PathingFeedback till objektet CursorWithFeedback i hierarkin.
  3. I hierarkipanelen klickar du på CursorWithFeedback.
  4. Dra och släpp objektet PathingFeedback från hierarkin till egenskapen Pathing Detected Game Object (Sök efter identifierat spelobjekt ) i markörfeedback-komponenten i Inspector.

Nu måste vi lägga till kod i GestureAction.cs för att aktivera följande:

  1. Lägg till kod i funktionen IManipulationHandler.OnManipulationUpdated , som flyttar astronauten när en manipulationsgest identifieras.
  2. Beräkna rörelsevektorn för att avgöra var astronauten ska flyttas baserat på handposition.
  3. Flytta astronauten till den nya positionen.

Slutför kodningsövning 4.a i GestureAction.cs eller använd vår färdiga lösning nedan:

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

Skapa och distribuera

  • Återskapa i Unity och skapa och distribuera sedan från Visual Studio för att köra appen i HoloLens.
  • Flytta handen framför HoloLens och höj pekfingret så att det kan spåras.
  • Fokusera markören över astronauten.
  • Säg "Flytta astronaut" för att flytta astronauten med en manipuleringsgest.
  • Fyra pilar bör visas runt markören för att indikera att programmet nu svarar på manipulationshändelser.
  • Sänk pekfingret till tummen och håll ihop dem.
  • När du flyttar din hand runt kommer astronauten också att röra sig (det här är manipulation).
  • Höj pekfingret för att sluta manipulera astronauten.
  • Obs! Om du inte säger Flytta astronaut innan du flyttar din hand används navigeringsgesten i stället.
  • Säg "Rotera astronaut" för att återgå till det roterande tillståndet.

Kapitel 5 – Modellexpansion

Mål

  • Expandera astronautmodellen till flera mindre delar som användaren kan interagera med.
  • Flytta varje del individuellt med hjälp av navigerings- och manipulationsgester.

Instruktioner

I det här avsnittet utför vi följande uppgifter:

  1. Lägg till ett nytt nyckelord "Expandera modell" för att expandera astronautmodellen.
  2. Lägg till ett nytt nyckelord "Återställ modell" för att returnera modellen till dess ursprungliga formulär.

Vi gör detta genom att lägga till ytterligare två nyckelord i Speech Input Source från föregående kapitel. Vi visar också ett annat sätt att hantera igenkänningshändelser.

  1. Klicka tillbaka på AstronautManager i Inspector och expandera avsnittet Nyckelord i Inspector.
  2. + Klicka på den högra sidan för att lägga till ett nytt nyckelord.
  3. Skriv nyckelordet som Expandera modell. Lägg gärna till en nyckelgenväg om du vill.
  4. + Klicka på den högra sidan för att lägga till ett nytt nyckelord.
  5. Ange nyckelordet som återställningsmodell. Lägg gärna till en nyckelgenväg om du vill.
  6. I panelen Kontroll klickar du på knappen Lägg till komponent .
  7. I menyn skriver du i sökrutan Speech Input Handler. Välj sökresultatet.
  8. Kontrollera Är global lyssnare, eftersom vi vill att dessa kommandon ska fungera oavsett vilket GameObject vi fokuserar på.
  9. + Klicka på knappen och välj Expandera modell i listrutan Nyckelord.
  10. + Klicka på under Svar och dra AstronautManager från hierarkin till fältet Ingen (objekt).
  11. Klicka nu på listrutan Ingen funktion , välj AstronautManager och sedan ExpandModelCommand.
  12. Klicka på knappen För talinmatningshanterare + och välj Återställ modell i listrutan Nyckelord.
  13. + Klicka på under Svar och dra AstronautManager från hierarkin till fältet Ingen (objekt).
  14. Klicka nu på listrutan Ingen funktion , välj AstronautManager och sedan ResetModelCommand.

Så här konfigurerar du speech input source and handler för kapitel 5

Skapa och distribuera

  • Prova! Skapa och distribuera appen till HoloLens.
  • Säg Expandera modell för att se den utökade astronautmodellen.
  • Använd Navigering för att rotera enskilda delar av astronautdräkten.
  • Säg Flytta astronaut och använd sedan manipulation för att flytta enskilda delar av astronautdräkten.
  • Säg Rotera astronaut för att rotera delarna igen.
  • Säg Återställ modell för att återställa astronauten till dess ursprungliga form.

Slutet

Grattis! Nu har du slutfört MR Input 211: Gesture.

  • Du vet hur du identifierar och svarar på handspårnings-, navigerings- och manipulationshändelser.
  • Du förstår skillnaden mellan navigerings- och manipulationsgester.
  • Du vet hur du ändrar markören för att ge visuell feedback för när en hand identifieras, när en hand håller på att gå förlorad och för när ett objekt stöder olika interaktioner (navigering kontra manipulation).