HoloLens (1. generációs) Alapok 101E: Projekt befejezése emulátorral
Fontos
A Mixed Reality Academy oktatóanyagait a HoloLens (1. generációs), a Unity 2017 és a Mixed Reality modern headsetek szem előtt tartásával tervezték. Ezért fontosnak tartjuk, hogy ezeket az oktatóanyagokat megtartsuk azoknak a fejlesztőknek, akik továbbra is útmutatást keresnek az eszközök fejlesztéséhez. Ezek az oktatóanyagok nem frissülnek a legújabb eszközkészletekkel vagy interakciókkal, amelyeket HoloLens 2 használnak, és előfordulhat, hogy nem kompatibilisek a Unity újabb verzióival. A támogatott eszközökön való munka folytatásához megmaradnak. Új oktatóanyag-sorozat jelent meg a HoloLens 2.
Ez az oktatóanyag végigvezeti a Unitybe épített teljes projekten, amely bemutatja a HoloLens alapvető Windows Mixed Reality funkcióit, beleértve a tekintetet, a kézmozdulatokat, a hangbevitelt, a térbeli hangot és a térbeli leképezést. Az oktatóanyag körülbelül 1 órát vesz igénybe.
Eszköztámogatás
Tanfolyam | HoloLens | Modern headsetek |
---|---|---|
MR Basics 101E: Projekt befejezése emulátorral | ✔️ |
Előkészületek
Előfeltételek
- A megfelelő eszközökkel konfigurált Windows 10 számítógép.
Projektfájlok
- Töltse le a projekthez szükséges fájlokat . A Unity 2017.2-s vagy újabb verziójára van szükség.
- Ha továbbra is szüksége van a Unity 5.6-ra, használja ezt a kiadást.
- Ha továbbra is szüksége van a Unity 5.5-támogatásra, használja ezt a kiadást.
- Ha továbbra is szüksége van a Unity 5.4-támogatásra, használja ezt a kiadást.
- Törölje a fájlok archiválását az asztalra vagy más könnyen elérhető helyre. Tartsa meg a mappa nevét Origami néven.
Megjegyzés
Ha a letöltés előtt át szeretné tekinteni a forráskódot, az elérhető a GitHubon.
1. fejezet – "Holo" világ
Ebben a fejezetben beállítjuk az első Unity-projektet, és végigvezetjük a buildelési és üzembe helyezési folyamaton.
Célkitűzések
- A Unity beállítása holografikus fejlesztéshez.
- Hozzon létre egy hologramot.
- Tekintse meg a létrehozott hologramot.
Utasítások
- Indítsa el a Unityt.
- Válassza a Megnyitás lehetőséget.
- Adja meg a helyet a korábban archiválatlan Origami mappaként.
- Válassza az Origami lehetőséget, majd kattintson a Mappa kiválasztása elemre.
- Mentse az új jelenetet: Fájl / mentési jelenet másként.
- Nevezze el a jelenetet Origami néven, és nyomja le a Mentés gombot.
A fő kamera beállítása
- A Hierarchia panelen válassza a Fő kamera lehetőséget.
- Az Inspector0,0,0-ra állítja az átalakító pozíciót.
- Keresse meg a Jelzők törlése tulajdonságot, és módosítsa a legördülő listát SkyboxrólEgyszínűre.
- Kattintson a Háttér mezőre egy színválasztó megnyitásához.
- Állítsa az R, G, B és Aértéket 0-ra.
A jelenet beállítása
- A Hierarchia panelen kattintson a Létrehozás és az Üres létrehozása elemre.
- Kattintson a jobb gombbal az új GameObject elemre , és válassza az Átnevezés lehetőséget. Nevezze át a GameObject nevet OrigamiCollection névre.
- A ProjektpanelHologramok mappájából:
- Húzza a Szakaszt a hierarchiába, hogy az OrigamiCollection gyermeke legyen.
- Húzza a Sphere1-et a hierarchiába, hogy az OrigamiCollection gyermeke legyen.
- Húzza a Sphere2-t a hierarchiába, hogy az OrigamiCollection gyermeke legyen.
- Kattintson a jobb gombbal az Irányított fény objektumra a Hierarchia panelen , és válassza a Törlés parancsot.
- A Hologramok mappából húzza a Fényeket a Hierarchia panel gyökerébe.
- A Hierarchia területen válassza az OrigamiCollection lehetőséget.
- Az Inspectorben állítsa az átalakítás pozícióját 0, -0,5, 2,0 értékre.
- A Hologramok előnézetének megtekintéséhez nyomja le a Lejátszás gombot a Unityben.
- Az előnézeti ablakban meg kell jelennie az Origami objektumoknak.
- Nyomja le másodszor a Lejátszás gombot az előnézeti mód leállításához.
A projekt exportálása a Unityből a Visual Studióba
- A Unityben válassza a Fájl > buildelési beállításai lehetőséget.
- Válassza a Windows Áruház lehetőséget a Platform listában, és kattintson a Platformváltás elemre.
- Állítsa az SDK-tUniverzális 10 értékre, a buildtípustpedig D3D értékre.
- Ellenőrizze a Unity C#-projekteket.
- Kattintson a Jelenetek hozzáadása elemre a jelenet hozzáadásához.
- Kattintson a Lejátszó beállításai... elemre.
- Az Inspector panelen válassza a Windows Áruház emblémáját. Ezután válassza a Közzétételi beállítások lehetőséget.
- A Képességek szakaszban válassza ki a Mikrofon és a SpatialPerception képességeket.
- A Build Settings (Buildbeállítások) ablakban kattintson a Build (Build) elemre.
- Hozzon létre egy "App" nevű új mappát .
- Kattintson egyetlen kattintással az alkalmazásmappára.
- Nyomja le a Mappa kiválasztása gombot.
- Amikor a Unity elkészült, megjelenik egy Fájlkezelő ablak.
- Nyissa meg az Alkalmazás mappát.
- Nyissa meg az Origami Visual Studio-megoldást.
- A Visual Studio felső eszköztárának használatával módosítsa a célértéket Hibakeresésről Kiadásra , ARM-ről X86-ra.
- Kattintson az Eszköz gomb melletti nyílra, és válassza a HoloLens Emulator lehetőséget.
- Kattintson a Hibakeresés –> Indítás hibakeresés nélkül parancsra, vagy nyomja le a Ctrl + F5 billentyűkombinációt.
- Egy idő után az emulátor kezdődik az Origami projekt. Az emulátor első elindítása akár 15 percet is igénybe vehet, amíg az emulátor elindul. A kezdés után ne zárja be.
2. fejezet – Tekintet
Ebben a fejezetben bemutatjuk a hologramokkal való interakció három módszerének első módját– tekintetét.
Célkitűzések
- Vizualizálja a tekintetét egy világra zárolt kurzor használatával.
Utasítások
- Vissza a Unity-projekthez, és ha még nyitva van, zárja be a Beállítások összeállítása ablakot.
- Válassza ki a Hologramok mappát a Projekt panelen.
- Húzza a Kurzor objektumot a hierarchia panelre a gyökérszinten.
- Kattintson duplán a Kurzor objektumra, hogy közelebbről is megtekinthesse.
- Kattintson a jobb gombbal a Szkriptek mappára a Projekt panelen.
- Kattintson a Létrehozás almenüre.
- Válassza a C#-szkript lehetőséget.
- Nevezze el a szkriptet WorldCursor néven. Megjegyzés: A név megkülönbözteti a kis- és nagybetűktől. Nem kell hozzáadnia a .cs bővítményt.
- Válassza ki a Kurzor objektumot a Hierarchia panelen.
- Húzza a WorldCursor szkriptet az Inspector panelre.
- Kattintson duplán a WorldCursor szkriptre a Visual Studióban való megnyitásához.
- Másolja és illessze be ezt a kódot a WorldCursor.cs fájlba, és mentse az összeset.
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;
}
}
}
- Építse újra az alkalmazást a Fájl > buildelési beállításaiból.
- Térjen vissza az emulátorban korábban üzembe helyezéshez használt Visual Studio-megoldáshoz.
- Amikor a rendszer kéri, válassza az Összes betöltése lehetőséget.
- Kattintson a Hibakeresés –> Indítás hibakeresés nélkül parancsra, vagy nyomja le a Ctrl + F5 billentyűkombinációt.
- Az Xbox vezérlővel körülnézhet a jelenetben. Figyelje meg, hogy a kurzor hogyan kommunikál az objektumok alakzatával.
3. fejezet – Kézmozdulatok
Ebben a fejezetben támogatjuk a kézmozdulatokat. Amikor a felhasználó kiválaszt egy papírgömböt, a Unity fizikamotorjával bekapcsoljuk a gravitációt.
Célkitűzések
- A Hologramok vezérlése a Kijelölés kézmozdulattal.
Utasítások
Először hozzunk létre egy szkriptet, amely nem észleli a Select kézmozdulatot.
- A Szkriptek mappában hozzon létre egy GazeGestureManager nevű szkriptet.
- Húzza a GazeGestureManager szkriptet a Hierarchia OrigamiCollection objektumára.
- Nyissa meg a GazeGestureManager szkriptet a Visual Studióban, és adja hozzá a következő kódot:
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();
}
}
}
- Hozzon létre egy másik szkriptet a Szkriptek mappában, ezúttal SphereCommands néven.
- Bontsa ki az OrigamiCollection objektumot a Hierarchia nézetben.
- Húzza a SphereCommands szkriptet a Hierarchia panel Sphere1 objektumára.
- Húzza a SphereCommands szkriptet a Hierarchia panel Sphere2 objektumára.
- Nyissa meg a szkriptet szerkesztésre a Visual Studióban, és cserélje le az alapértelmezett kódot a következőre:
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;
}
}
}
- Exportálhatja, létrehozhatja és üzembe helyezheti az alkalmazást a HoloLens emulátorban.
- Nézzen körül a jelenetben, és középre az egyik gömbön.
- Nyomja le az A gombot az Xbox vezérlőn, vagy nyomja le a szóközbillentyűt a Select kézmozdulat szimulálásához.
4. fejezet – Hang
Ebben a fejezetben két hangparancs támogatását adjuk hozzá: a "Világ alaphelyzetbe állítása" parancsot, hogy az elvetett gömbök visszakerüljenek az eredeti helyükre, a "Drop sphere" pedig a gömb leeséséhez.
Célkitűzések
- Adjon hozzá hangparancsokat, amelyek mindig a háttérben hallgatnak.
- Hozzon létre egy hangparancsra reagáló hologramot.
Utasítások
- A Szkriptek mappában hozzon létre egy SpeechManager nevű szkriptet.
- Húzza a SpeechManager szkriptet a Hierarchia OrigamiCollection objektumára
- Nyissa meg a SpeechManager szkriptet a Visual Studióban.
- Másolja és illessze be ezt a kódot a SpeechManager.cs fájlba, és mentse az összeset:
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();
}
}
}
- Nyissa meg a SphereCommands szkriptet a Visual Studióban.
- Frissítse a szkriptet a következőképpen olvasásra:
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();
}
}
- Exportálhatja, létrehozhatja és üzembe helyezheti az alkalmazást a HoloLens emulátorban.
- Az emulátor támogatja a számítógép mikrofonját, és válaszol a hangjára: állítsa be a nézetet úgy, hogy a kurzor az egyik gömbön legyen, és mondja ki a "Drop Sphere" szöveget.
- Mondja ki a "Reset World" szót, hogy visszahozza őket a kezdeti pozíciójukba.
5. fejezet – Térbeli hang
Ebben a fejezetben zenét adunk hozzá az alkalmazáshoz, majd hangeffektusokat aktiválunk bizonyos műveletekhez. Térbeli hangot fogunk használni, hogy a hangok egy adott helyet adjanak a 3D térben.
Célkitűzések
- Hologramokat hallhat a világában.
Utasítások
- A Unityben válassza a felső menüBen a Projektbeállítások > szerkesztése > hang lehetőséget
- Keresse meg a Spatializer beépülő modul beállítást, és válassza az MS HRTF Spatializer lehetőséget.
- A Hologramok mappából húzza az Ambience objektumot a Hierarchia panel OrigamiCollection objektumára.
- Válassza az OrigamiCollection lehetőséget , és keresse meg a Hangforrás összetevőt. Módosítsa ezeket a tulajdonságokat:
- Ellenőrizze a Spatialize tulajdonságot.
- Ellenőrizze a Lejátszás ébren állapotban beállítást.
- Módosítsa a térbeli keverést3D-re a csúszka jobbra húzásával.
- Ellenőrizze a Loop tulajdonságot.
- Bontsa ki a 3D hangbeállítások elemet, és adja meg a 0.1 értéket a Doppler-szinthez.
- Állítsa a kötet-visszaállítástlogaritmikus rolloff értékre.
- Állítsa a Maximális távolságértékét 20-ra.
- A Szkriptek mappában hozzon létre egy SphereSounds nevű szkriptet.
- Húzza a SphereSounds elemet a Hierarchia Sphere1 és Sphere2 objektumaihoz.
- Nyissa meg a SphereSoundst a Visual Studióban, frissítse az alábbi kódot, és mentse az összeset.
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();
}
}
}
- Mentse a szkriptet, és térjen vissza a Unitybe.
- Exportálhatja, létrehozhatja és üzembe helyezheti az alkalmazást a HoloLens emulátorban.
- Viseljen fejhallgatót a teljes hatás eléréséhez, és lépjen közelebb és távolabb a Színpadtól a hangok változásának meghallgatásához.
6. fejezet – Térbeli leképezés
Most térbeli leképezéssel fogjuk elhelyezni a játéktáblát egy valós objektumra a való világban.
Célkitűzések
- Hozza a valós világát a virtuális világba.
- Helyezze a hologramokat oda, ahol a legfontosabbak önnek.
Utasítások
- Kattintson a Projekt panel Hologramok mappájára.
- Húzza a térbeli leképezési objektumot a hierarchia gyökerébe.
- Kattintson a Hierarchia Térbeli leképezés objektumára.
- Az Inspector panelen módosítsa a következő tulajdonságokat:
- Jelölje be a Vizuális hálók rajzolása jelölőnégyzetet .
- Keresse meg az Anyag rajzolása elemet, és kattintson a jobb oldali körre. Írja be a "drótváz" kifejezést a felül található keresőmezőbe. Kattintson az eredményre, majd zárja be az ablakot.
- Exportálhatja, létrehozhatja és üzembe helyezheti az alkalmazást a HoloLens emulátorban.
- Az alkalmazás futtatásakor egy korábban beolvasott valós nappali hálója drótvázban jelenik meg.
- Nézd meg, hogyan fog egy gördülő gömb leesni a színpadról, és a padlóra!
Most bemutatjuk, hogyan helyezheti át az OrigamiCollection-et egy új helyre:
- A Szkriptek mappában hozzon létre egy TapToPlaceParent nevű szkriptet.
- A Hierarchia területen bontsa ki az OrigamiCollection elemet , és válassza ki a Stage objektumot.
- Húzza a TapToPlaceParent szkriptet a Stage objektumra.
- Nyissa meg a TapToPlaceParent szkriptet a Visual Studióban, és frissítse a következőre:
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;
}
}
}
}
- Az alkalmazás exportálása, létrehozása és üzembe helyezése.
- Most már képesnek kell lennie arra, hogy egy adott helyre helyezze a játékot úgy, hogy megtekinti azt, a Select (A vagy Szóköz) kézmozdulattal, majd egy új helyre lép, és ismét a Kiválasztás kézmozdulatot használja.
Vége
És ez a vége ennek az oktatóanyagnak!
A következőket tanulta meg:
- Holografikus alkalmazás létrehozása a Unityben.
- Hogyan használhatja a tekintetet, a kézmozdulatot, a hangot, a hangokat és a térbeli leképezést.
- Alkalmazás létrehozása és üzembe helyezése a Visual Studióval.
Most már készen áll arra, hogy saját holografikus alkalmazásokat hozzon létre!