Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ważne
Samouczki Mixed Reality Academy zostały zaprojektowane z myślą o urządzeniach HoloLens (1. generacji), Unity 2017 i Mixed Reality immersywnych zestawów słuchawkowych. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków w miejscu dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania dla tych urządzeń. Te samouczki nie zostaną zaktualizowane przy użyciu najnowszych zestawów narzędzi ani interakcji używanych do HoloLens 2 i mogą nie być zgodne z nowszymi wersjami aparatu Unity. Będą one utrzymywane w celu kontynuowania pracy na obsługiwanych urządzeniach. Opublikowano nową serię samouczków dla HoloLens 2.
Ten samouczek przeprowadzi Cię przez kompletny projekt wbudowany w aparat Unity, który demonstruje podstawowe funkcje Windows Mixed Reality na urządzeniu HoloLens, w tym spojrzenie, gesty, dane wejściowe głosu, dźwięk przestrzenny i mapowanie przestrzenne. Ukończenie tego samouczka potrwa około 1 godziny.
Obsługa urządzeń
| Kurs | HoloLens | Immersyjne zestawy nagłowne |
|---|---|---|
| MR Basics 101E: Ukończ projekt za pomocą emulatora | ✔️ |
Przed rozpoczęciem
Wymagania wstępne
- Komputer Windows 10 skonfigurowany z zainstalowanymi odpowiednimi narzędziami.
Pliki projektu
- Pobierz pliki wymagane przez projekt. Wymaga aparatu Unity 2017.2 lub nowszego.
- Jeśli nadal potrzebujesz obsługi aparatu Unity 5.6, skorzystaj z tej wersji.
- Jeśli nadal potrzebujesz obsługi aparatu Unity 5.5, skorzystaj z tej wersji.
- Jeśli nadal potrzebujesz obsługi aparatu Unity 5.4, skorzystaj z tej wersji.
- Cofnij archiwizowanie plików na pulpicie lub innych łatwych w dotarciu do lokalizacji. Zachowaj nazwę folderu jako Origami.
Uwaga
Jeśli chcesz przejrzeć kod źródłowy przed pobraniem, jest on dostępny w witrynie GitHub.
Rozdział 1 — Świat "Holo"
W tym rozdziale skonfigurujemy nasz pierwszy projekt aparatu Unity i przejdziemy przez proces kompilacji i wdrażania.
Cele
- Konfigurowanie aparatu Unity na potrzeby programowania holograficznego.
- Utwórz hologram.
- Zobacz wykonany hologram.
Instrukcje
- Uruchom aparat Unity.
- Wybierz pozycję Otwórz.
- Wprowadź lokalizację jako folder Origami , który wcześniej nie został zarchiwizowany.
- Wybierz pozycję Origami i kliknij pozycję Wybierz folder.
- Zapisz nową scenę:Zapisz scenęjako. /
- Nazwij scenę Origami i naciśnij przycisk Zapisz .
Konfigurowanie głównego aparatu fotograficznego
- W Panelu hierarchii wybierz pozycję Aparat główny.
- W inspektorze ustaw pozycję przekształcenia na 0,0,0.
- Znajdź właściwość Clear Flags i zmień listę rozwijaną z Skybox na Kolor stały.
- Kliknij pole Tło , aby otworzyć selektor kolorów.
- Ustaw wartości R, G, B i A na 0.
Konfigurowanie sceny
- W panelu Hierarchy (Hierarchia) kliknij pozycję Create and Create Empty (Utwórz i utwórz puste).
- Kliknij prawym przyciskiem myszy nowy obiekt GameObject i wybierz polecenie Zmień nazwę. Zmień nazwę obiektu GameObject na OrigamiCollection.
- Z folderu Holograms w panelu projektu:
- Przeciągnij element Stage do hierarchii, aby być elementem podrzędnym kolekcji OrigamiCollection.
- Przeciągnij element Sphere1 do hierarchii, aby być elementem podrzędnym origamiCollection.
- Przeciągnij element Sphere2 do hierarchii, aby być elementem podrzędnym origamiCollection.
- Kliknij prawym przyciskiem myszy obiekt Directional Light w panelu hierarchii i wybierz polecenie Usuń.
- Z folderu Holograms przeciągnij pozycję Lights do katalogu głównego panelu hierarchii.
- W obszarze Hierarchy (Hierarchia) wybierz pozycję OrigamiCollection.
- W inspektorze ustaw pozycję przekształcania na 0, -0,5, 2,0.
- Naciśnij przycisk Odtwórz w a unity, aby wyświetlić podgląd hologramów.
- Obiekty Origami powinny być widoczne w oknie podglądu.
- Naciśnij pozycję Odtwórz po raz drugi, aby zatrzymać tryb podglądu.
Eksportowanie projektu z aparatu Unity do programu Visual Studio
- W akrocie Unity wybierz pozycję Ustawienia kompilacji pliku>.
- Wybierz pozycję Sklep Windows na liście Platforma , a następnie kliknij pozycję Przełącz platformę.
- Ustaw zestaw SDK na wartość Universal 10 , a typ kompilacji na D3D.
- Sprawdź projekty języka C# aparatu Unity.
- Kliknij pozycję Dodaj otwarte sceny , aby dodać scenę.
- Kliknij pozycję Ustawienia odtwarzacza....
- W Panelu inspektora wybierz logo Sklepu Windows. Następnie wybierz pozycję Ustawienia publikowania.
- W sekcji Możliwości wybierz możliwości Mikrofon i SpatialPerception .
- Po powrocie do okna Ustawienia kompilacji kliknij pozycję Kompiluj.
- Utwórz nowy folder o nazwie "Aplikacja".
- Jednym kliknięciem folderu aplikacji.
- Naciśnij pozycję Wybierz folder.
- Po zakończeniu działania aparatu Unity zostanie wyświetlone okno Eksplorator plików.
- Otwórz folder Aplikacja .
- Otwórz rozwiązanie Origami Visual Studio.
- Za pomocą górnego paska narzędzi w programie Visual Studio zmień element docelowy z Debuguj na Wydanie i z ARM na X86.
- Kliknij strzałkę obok przycisku Urządzenie i wybierz pozycję Emulator urządzenia HoloLens.
- Kliknij pozycję Debuguj —> rozpocznij bez debugowania lub naciśnij klawisze Ctrl + F5.
- Po pewnym czasie emulator rozpocznie się od projektu Origami. Po pierwszym uruchomieniu emulatora uruchomienie emulatora może potrwać nawet 15 minut. Po uruchomieniu nie zamykaj go.
Rozdział 2 — Spojrzenie
W tym rozdziale przedstawimy pierwsze z trzech sposobów interakcji z hologramami - spojrzenie.
Cele
- Wizualizowanie spojrzenia przy użyciu kursora zablokowanego na świecie.
Instrukcje
- Wstecz do projektu aparatu Unity i zamknij okno Ustawienia kompilacji, jeśli jest ono nadal otwarte.
- Wybierz folder Hologramy w panelu Projekt.
- Przeciągnij obiekt Cursor do panelu Hierarchy na poziomie głównym.
- Kliknij dwukrotnie obiekt Cursor , aby przyjrzeć się temu obiektowi.
- Kliknij prawym przyciskiem myszy folder Scripts (Skrypty ) na panelu Project (Projekt).
- Kliknij podmenu Utwórz .
- Wybierz pozycję Skrypt języka C#.
- Nadaj skryptowi nazwę WorldCursor. Uwaga: nazwa jest uwzględniana w wielkości liter. Nie trzeba dodawać rozszerzenia cs.
- Wybierz obiekt Kursor w panelu Hierarchia.
- Przeciągnij i upuść skrypt WorldCursor na panelu Inspektor.
- Kliknij dwukrotnie skrypt WorldCursor , aby otworzyć go w programie Visual Studio.
- Skopiuj i wklej ten kod do pliku WorldCursor.cs i zapisz wszystko.
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 thecursor 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;
}
}
}
- Ponownie skompiluj aplikację z ustawień kompilacji plików>.
- Wróć do rozwiązania programu Visual Studio użytego wcześniej do wdrożenia w emulatorze.
- Po wyświetleniu monitu wybierz pozycję "Załaduj ponownie wszystko".
- Kliknij pozycję Debuguj —> rozpocznij bez debugowania lub naciśnij klawisze Ctrl + F5.
- Użyj kontrolera Xbox, aby rozglądać się po scenie. Zwróć uwagę, jak kursor współdziała z kształtem obiektów.
Rozdział 3 — Gesty
W tym rozdziale dodamy obsługę gestów. Gdy użytkownik wybierze sferę papierową, spadniemy sferę, włączając grawitację przy użyciu aparatu fizyki aparatu unity.
Cele
- Steruj hologramami za pomocą gestu Wybierz.
Instrukcje
Zaczniemy od utworzenia skryptu, niż można wykryć gest Wybierz.
- W folderze Scripts utwórz skrypt o nazwie GazeGestureManager.
- Przeciągnij skrypt GazeGestureManager do obiektu OrigamiCollection w hierarchii.
- Otwórz skrypt GazeGestureManager w programie Visual Studio i dodaj następujący kod:
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 Start()
{
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();
}
}
}
- Utwórz inny skrypt w folderze Scripts (Skrypty), tym razem o nazwie SphereCommands.
- Rozwiń obiekt OrigamiCollection w widoku Hierarchia.
- Przeciągnij skrypt SphereCommands na obiekt Sphere1 w panelu Hierarchia.
- Przeciągnij skrypt SphereCommands na obiekt Sphere2 na panelu Hierarchia.
- Otwórz skrypt w programie Visual Studio do edycji i zastąp domyślny kod następującą pozycją:
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;
}
}
}
- Eksportowanie, kompilowanie i wdrażanie aplikacji w emulatorze urządzenia HoloLens.
- Rozejrzyj się po scenie i wyśrodkuj na jednej z sfer.
- Naciśnij przycisk A na kontrolerze Xbox lub naciśnij klawisz Spacja, aby zasymulować gest Wybierz.
Rozdział 4 — Głos
W tym rozdziale dodamy obsługę dwóch poleceń głosowych: "Resetuj świat", aby zwracać porzucone kule do ich oryginalnej lokalizacji i "Drop sphere", aby spaść sferę.
Cele
- Dodaj polecenia głosowe, które zawsze nasłuchują w tle.
- Utwórz hologram reagujący na polecenie głosowe.
Instrukcje
- W folderze Scripts utwórz skrypt o nazwie SpeechManager.
- Przeciągnij skrypt SpeechManager do obiektu OrigamiCollection w hierarchii
- Otwórz skrypt SpeechManager w programie Visual Studio.
- Skopiuj i wklej ten kod do pliku SpeechManager.cs i zapisz wszystko:
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();
}
}
}
- Otwórz skrypt SphereCommands w programie Visual Studio.
- Zaktualizuj skrypt w następujący sposób:
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();
}
}
- Eksportowanie, kompilowanie i wdrażanie aplikacji w emulatorze urządzenia HoloLens.
- Emulator będzie obsługiwać mikrofon komputera i odpowiadać na głos: dostosuj widok, aby kursor był na jednej z sfer i powiedział "Drop Sphere".
- Powiedz "Reset World", aby przywrócić je do swoich początkowych pozycji.
Rozdział 5 . Dźwięk przestrzenny
W tym rozdziale dodamy muzykę do aplikacji, a następnie wywołamy efekty dźwiękowe na określone akcje. Będziemy używać dźwięku przestrzennego do nadawania dźwięków określonej lokalizacji w przestrzeni 3D.
Cele
- Posłuchaj hologramów na świecie.
Instrukcje
- W afiszcie Unity wybierz z górnego menu Edytowanie > dźwięku ustawień > projektu
- Znajdź ustawienie wtyczki Spatializer i wybierz pozycję MS HRTF Spatializer.
- W folderze Holograms przeciągnij obiekt Wyśmień na obiekt OrigamiCollection w panelu hierarchii.
- Wybierz pozycję OrigamiCollection i znajdź składnik Źródło audio . Zmień następujące właściwości:
- Sprawdź właściwość Spatialize .
- Sprawdź pozycję Play On Awake (Odtwórz na przebudzeniu).
- Zmień program Spatial Blend na 3D , przeciągając suwak w prawo.
- Sprawdź właściwość Loop .
- Rozwiń pozycję Ustawienia dźwięku 3D i wprowadź wartość 0.1 w polu Poziom dopplera.
- Ustaw wartość Rolloff woluminu na wycofywanie logarytmyczne.
- Ustaw wartość Maksymalna odległość na 20.
- W folderze Scripts utwórz skrypt o nazwie SphereSounds.
- Przeciągnij obiekty SphereSounds do obiektów Sphere1 i Sphere2 w hierarchii.
- Open SphereSounds w programie Visual Studio zaktualizuj następujący kod i zapisz wszystko.
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();
}
}
}
- Zapisz skrypt i wróć do aparatu Unity.
- Eksportowanie, kompilowanie i wdrażanie aplikacji w emulatorze urządzenia HoloLens.
- Nosić słuchawki, aby uzyskać pełny efekt, i poruszać się bliżej i dalej od sceny, aby usłyszeć zmiany dźwięków.
Rozdział 6 — Mapowanie przestrzenne
Teraz użyjemy mapowania przestrzennego , aby umieścić tablicę gry na prawdziwym obiekcie w świecie rzeczywistym.
Cele
- Przynieś swój rzeczywisty świat do świata wirtualnego.
- Umieść swoje hologramy, gdzie mają największe znaczenie dla Ciebie.
Instrukcje
- Kliknij folder Holograms w panelu Projekt.
- Przeciągnij zasób Mapowanie przestrzenne do katalogu głównego hierarchii.
- Kliknij obiekt Mapowanie przestrzenne w hierarchii.
- W panelu Inspector (Inspektor) zmień następujące właściwości:
- Zaznacz pole Rysuj siatki wizualne .
- Znajdź pozycję Rysuj materiał i kliknij okrąg po prawej stronie. Wpisz ciąg "wireframe" w polu wyszukiwania u góry. Kliknij wynik, a następnie zamknij okno.
- Eksportowanie, kompilowanie i wdrażanie aplikacji w emulatorze urządzenia HoloLens.
- Po uruchomieniu aplikacji siatka wcześniej zeskanowanego rzeczywistego salonu zostanie renderowana w szkieletie.
- Zobacz, jak kula tocząca się spadnie ze sceny i na podłogę!
Teraz pokażemy, jak przenieść element OrigamiCollection do nowej lokalizacji:
- W folderze Scripts utwórz skrypt o nazwie TapToPlaceParent.
- W hierarchii rozwiń obiekt OrigamiCollection i wybierz obiekt Stage .
- Przeciągnij skrypt TapToPlaceParent na obiekt Stage.
- Otwórz skrypt TapToPlaceParent w programie Visual Studio i zaktualizuj go tak, aby był następujący:
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;
}
}
}
}
- Eksportowanie, kompilowanie i wdrażanie aplikacji.
- Teraz powinno być możliwe umieszczenie gry w określonej lokalizacji, patrząc na nią, za pomocą gestu Select (A lub Spacja), a następnie przejść do nowej lokalizacji i ponownie za pomocą gestu Wybierz.
Koniec
I to koniec tego samouczka!
Wiesz teraz:
- Jak utworzyć aplikację holograficzną w środowisku Unity.
- Jak korzystać z spojrzenia, gestu, głosu, dźwięków i mapowania przestrzennego.
- Jak skompilować i wdrożyć aplikację przy użyciu programu Visual Studio.
Teraz możesz rozpocząć tworzenie własnych aplikacji holograficznych!