Systèmes de coordonnées dans Unity
Windows Mixed Reality prend en charge les applications sur un large éventail d’échelles d’expérience, à partir d’applications d’orientation uniquement et de mise à l’échelle assises via des applications à l’échelle de la salle. Sur HoloLens, vous pouvez aller plus loin et créer des applications à l’échelle mondiale qui permettent aux utilisateurs de marcher au-delà de 5 mètres, en explorant un étage entier d’un bâtiment et au-delà.
La première étape de la création d’une expérience de réalité mixte dans Unity consiste à comprendre les systèmes de coordonnées et à choisir la mise à l’échelle de l’expérience que votre application ciblera.
Création d’une expérience d’orientation uniquement ou d’échelle assise
Espace de noms : UnityEngine.XR
Type : XRDevice
Pour créer une expérience d’orientation uniquement ou d’échelle assise, vous devez définir Unity sur le type d’espace de suivi stationnaire. L’espace de suivi stationnaire définit le système de coordonnées mondial d’Unity pour suivre le cadre stationnaire de référence. Dans le mode de suivi stationnaire, le contenu placé dans l’éditeur juste devant l’emplacement par défaut de la caméra (avant est -Z) apparaît devant l’utilisateur lorsque l’application démarre.
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
Espace de noms : UnityEngine.XR
Type : InputTracking
Pour une expérience d’orientation pure uniquement telle qu’une visionneuse vidéo de 360 degrés (où les mises à jour de la tête positionnelle ruineraient l’illusion), vous pouvez ensuite définir XR. InputTracking.disablePositionalTracking sur true :
InputTracking.disablePositionalTracking = true;
Pour une expérience de mise à l’échelle assise, pour permettre à l’utilisateur plus tard de récenter l’origine assise, vous pouvez appeler le XR. Méthode InputTracking.Recenter :
InputTracking.Recenter();
Création d’une expérience à l’échelle debout ou à l’échelle de la salle
Espace de noms : UnityEngine.XR
Type : XRDevice
Pour une expérience à l’échelle debout ou à l’échelle de la salle, vous devez placer du contenu par rapport à l’étage. Vous raisonner sur l’étage de l’utilisateur à l’aide de la phase spatiale, qui représente l’origine au niveau du sol définie par l’utilisateur et la limite facultative de la salle, configurée pendant la première exécution.
Pour vous assurer que Unity fonctionne avec son système de coordonnées mondial au niveau du sol, vous pouvez définir et tester que Unity utilise le type d’espace de suivi RoomScale :
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
- Si SetTrackingSpaceType retourne la valeur true, Unity a correctement basculé son système de coordonnées mondial pour suivre l’image intermédiaire de référence.
- Si SetTrackingSpaceType retourne false, Unity n’a pas pu basculer vers le cadre intermédiaire de référence, probablement parce que l’utilisateur n’a pas configuré de plancher dans son environnement. Si une valeur de retour false n’est pas courante, elle peut se produire si la phase est configurée dans une autre salle et que l’appareil est déplacé vers la salle active sans que l’utilisateur configure une nouvelle étape.
Une fois que votre application a correctement définit le type d’espace de suivi RoomScale, le contenu placé sur le plan y=0 apparaît sur le sol. L’origine à 0, 0, 0 sera l’endroit spécifique sur l’étage où l’utilisateur se tenait pendant la configuration de la salle, avec -Z représentant la direction vers l’avant qu’ils étaient exposés lors de l’installation.
Espace de noms : UnityEngine.Experimental.XR
Type : Limite
Dans le code de script, vous pouvez ensuite appeler la méthode TryGetGeometry sur le type UnityEngine.Experimental.XR.Boundary pour obtenir un polygone de limite, en spécifiant un type de limite de TrackedArea. Si l’utilisateur a défini une limite (vous obtenez une liste de sommets), il est sûr de fournir une expérience à l’échelle de la salle à l’utilisateur, où il peut parcourir la scène que vous créez.
Remarque
Le système affiche automatiquement la limite lorsque l’utilisateur l’approche. Votre application n’a pas besoin d’utiliser ce polygone pour afficher la limite elle-même. Toutefois, vous pouvez choisir de disposer vos objets de scène à l’aide de ce polygone de limites pour vous assurer que l’utilisateur peut atteindre physiquement ces objets sans téléporter :
var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
// Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}
Création d’une expérience à l’échelle mondiale
Espace de noms : UnityEngine.XR.WSA
Type : WorldAnchor
Pour de véritables expériences à l’échelle mondiale sur HoloLens qui permettent aux utilisateurs d’aller au-delà de 5 mètres, vous aurez besoin de nouvelles techniques au-delà de celles utilisées pour les expériences à l’échelle de la salle. Une technique clé que vous utiliserez consiste à créer une ancre spatiale pour verrouiller un cluster d’hologrammes précisément en place dans le monde physique, quelle que soit la distance que l’utilisateur a routée, puis de retrouver ces hologrammes dans les sessions ultérieures.
Dans Unity, vous créez une ancre spatiale en ajoutant le composant WorldAnchor Unity à un GameObject.
Ajout d’une ancre mondiale
Pour ajouter une ancre mondiale, appelez AddComponent<WorldAnchor>() sur l’objet de jeu avec la transformation que vous souhaitez ancrer dans le monde réel.
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Et voilà ! Cet objet de jeu sera maintenant ancré à son emplacement actuel dans le monde physique. Vous pouvez voir que ses coordonnées du monde Unity s’ajustent légèrement au fil du temps pour vous assurer que l’alignement physique. Utilisez la persistance pour rechercher à nouveau cet emplacement ancré dans une session d’application ultérieure.
Suppression d’une ancre mondiale
Si vous ne souhaitez plus que gameObject soit verrouillé dans un emplacement physique et que vous n’avez pas l’intention de le déplacer, vous pouvez simplement appeler Destroy sur le composant World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Si vous souhaitez déplacer le GameObject dans ce cadre, vous devez appeler DestroyImmediate à la place.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
Déplacement d’un GameObject ancré dans le monde
GameObject ne peut pas être déplacé alors qu’une ancre mondiale est sur celle-ci. Si vous devez déplacer le GameObject dans ce cadre, vous devez :
- DestroyImmediate le composant World Anchor
- Déplacer le GameObject
- Ajoutez un nouveau composant World Anchor au GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Gestion des modifications de locatabilité
Un WorldAnchor peut ne pas être locatable dans le monde physique à un moment donné. Si cela se produit, Unity ne met pas à jour la transformation de l’objet ancré. Cela peut également changer pendant l’exécution d’une application. L’échec de la gestion de la modification de la locatabilité entraîne l’apparition de l’objet dans l’emplacement physique correct dans le monde.
Pour être informé des modifications de locatabilité :
- S’abonner à l’événement OnTrackingChanged
- Gérer l’événement
L’événement OnTrackingChanged est appelé chaque fois que l’ancre spatiale sous-jacente change entre un état d’être locatable et non locatable.
anchor.OnTrackingChanged += Anchor_OnTrackingChanged;
Gérez ensuite l’événement :
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Parfois, les ancres se trouvent immédiatement. Dans ce cas, cette propriété isLocated de l’ancre est définie sur true lorsque AddComponent<WorldAnchor>() retourne. Par conséquent, l’événement OnTrackingChanged ne sera pas déclenché. Un modèle propre consiste à appeler votre gestionnaire OnTrackingChanged avec l’état IsLocated initial après l’attachement d’une ancre.
Anchor_OnTrackingChanged(anchor, anchor.isLocated);
Partage d’ancres sur les appareils
Utilisez Azure Spatial Anchors pour créer une ancre cloud durable à partir d’un WorldAnchor local, que votre application peut ensuite localiser sur plusieurs appareils HoloLens, iOS et Android. En partageant une ancre spatiale commune sur plusieurs appareils, chaque utilisateur peut voir le contenu affiché par rapport à cette ancre dans le même emplacement physique. Cette technique autorise les expériences partagées en temps réel.
Pour commencer à créer des expériences partagées dans Unity, essayez les guides de démarrage rapide Azure Spatial Anchors Unity de 5 minutes.
Une fois que vous êtes opérationnel avec Azure Spatial Anchors, vous pouvez ensuite créer et localiser des ancres dans Unity.
Point de contrôle de développement suivant
Si vous suivez le parcours de point de contrôle de développement Unity que nous avons mis en place, vous êtes au milieu de l’exploration des blocs de construction principaux de réalité mixte. À partir d’ici, vous pouvez passer au composant suivant :
Ou accéder aux API et fonctionnalités de la plateforme Mixed Reality :
Vous pouvez revenir aux points de contrôle de développement Unity à tout moment.