Systèmes de coordonnées dans Unity

Windows Mixed Reality prend en charge les applications à travers une large gamme d’expériences, des applications en orientation uniquement et à l’échelle à l’échelle jusqu’à des applications à l’échelle de la place. sur HoloLens, vous pouvez aller plus loin et créer des applications à l’échelle mondiale qui permettent aux utilisateurs d’aller au-delà de 5 mètres, en explorant un étage entier d’un immeuble 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 ciblée par votre application.

Création d’une expérience d’orientation seule ou de mise à l’échelle installée

Espace de noms : UnityEngine. XR
Type : XRDevice

Pour créer une expérience d' orientation uniquement ou de mise à l' échelle assise, vous devez définir Unity sur le type d’espace de suivi fixe. Espace de suivi fixe définit le système de coordonnées universelles de l’unité pour suivre le cadre stationnaire de référence. Dans le mode de suivi fixe, le contenu placé dans l’éditeur juste devant l’emplacement par défaut de l’appareil photo (Forward is-Z) s’affiche devant l’utilisateur au lancement de l’application.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Espace de noms : UnityEngine. XR
Type : InputTracking

Pour une expérience purement en orientation uniquement telle qu’une visionneuse vidéo de 360 degrés (où les mises à jour de la tête de position dépasseraient l’illusion), vous pouvez définir XR. InputTracking. disablePositionalTracking sur true :

InputTracking.disablePositionalTracking = true;

Pour une expérience de mise à l' échelle assiste, pour permettre à l’utilisateur de recentrer plus tard l’origine assise, vous pouvez appeler XR. Méthode InputTracking. recenter :

InputTracking.Recenter();

Création d’une expérience de mise à l’échelle permanente ou à l’échelle de l’espace

Espace de noms : UnityEngine. XR
Type : XRDevice

Pour une expérience à l’échelle permanente ou à l’échelle de l' espace, vous devez placer du contenu par rapport à l’étage. Vous avez raison de l’étage de l’utilisateur à l’aide de la Phase spatiale, qui représente l’origine de l’utilisateur et la limite facultative de l’espace, configurées lors de la première exécution.

Pour vous assurer que Unity fonctionne avec son système de coordonnées universel à l’étage, vous pouvez définir et tester qu’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 universel pour suivre le cadre de la phase de référence.
  • Si SetTrackingSpaceType retourne la valeur false, Unity n’a pas pu basculer vers le cadre de la phase de référence, probablement parce que l’utilisateur n’a pas configuré d’étage dans son environnement. Bien qu’une valeur de retour false ne soit pas courante, elle peut se produire si l’étape est configurée dans une salle différente et que l’appareil est déplacé dans la salle actuelle sans que l’utilisateur ne configure une nouvelle étape.

Une fois que votre application a correctement défini le type d’espace de suivi RoomScale, le contenu placé sur le plan y = 0 s’affiche sur le plancher. L’origine à 0, 0 correspond à l’emplacement spécifique sur le plancher où l’utilisateur a pris la main pendant la configuration de la salle, avec-Z représentant la direction vers l’avant pendant la configuration.

Espace de noms : UnityEngine. expérimentale. XR
Type : limite

Dans le code de script, vous pouvez ensuite appeler la méthode TryGetGeometry sur le type UnityEngine. expérimentale. 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 récupérez une liste de vertex), il est possible de fournir une expérience de mise à l’échelle de l' espace à l’utilisateur, où il peut se déplacer dans la scène que vous créez.

Notes

Le système affiche automatiquement la limite lorsque l’utilisateur l’approche. Votre application n’a pas besoin d’utiliser ce polygone pour restituer la limite elle-même. Toutefois, vous pouvez choisir de disposer vos objets de scène à l’aide de ce polygone limite pour vous assurer que l’utilisateur peut atteindre physiquement ces objets sans téléportage :

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 les expériences réelles à l’échelle mondiale sur les 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 place. Une technique clé que vous allez utiliser consiste à créer une ancre spatiale pour verrouiller un cluster d’hologrammes précisément en place dans le monde physique, quel que soit le degré d’itinérance de l’utilisateur, puis retrouvez 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 universelle, appelez AddComponent () 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 désormais ancré à son emplacement actuel dans le monde physique : vous pouvez constater que ses coordonnées universelles s’ajustent légèrement au fil du temps pour garantir l’alignement physique. Utilisez la persistance pour rechercher à nouveau cet emplacement d’ancrage dans une session d’application future.

Suppression d’une ancre mondiale

Si vous ne souhaitez plus que les GameObject soient verrouillés sur un emplacement géographique physique et que vous n’envisagez pas de déplacer ce cadre, vous pouvez simplement appeler Destroy sur le composant d’ancrage du monde.

Destroy(gameObject.GetComponent<WorldAnchor>());

Si vous souhaitez déplacer le GameObject ce frame, vous devez appeler DestroyImmediate à la place.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Déplacement d’un GameObject ancré dans le monde

Les GameObject ne peuvent pas être déplacées pendant qu’une ancre mondiale y est. Si vous devez déplacer le GameObject ce frame, vous devez :

  1. DestroyImmediate le composant d’ancrage universel
  2. Déplacer le GameObject
  3. Ajoutez un nouveau composant d’ancrage du monde au GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Gestion des modifications de localisabilité

Un WorldAnchor peut ne pas être localisable 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. Si la modification de la localisation n’est pas prise en charge, l’objet n’apparaîtra pas à l’emplacement physique approprié dans le monde.

Pour être informé des changements de localisation :

  1. S’abonner à l’événement OnTrackingChanged
  2. Gérer l’événement

L’événement OnTrackingChanged est appelé chaque fois que l’ancrage spatial sous-jacent change entre un État localisable et n’est pas localisable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Ensuite, gérez 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 sera définie sur true lorsque AddComponent () retourne. Par conséquent, l’événement OnTrackingChanged n’est pas déclenché. Un modèle propre serait d’appeler votre gestionnaire OnTrackingChanged avec l’état initial de IsLocated après avoir attaché une ancre.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Partage d’ancres sur plusieurs appareils

utilisez les ancres spatiales Azure 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 Démarrages rapides de 5 minutes d' Unity spatiales Azure Unity.

Une fois que vous êtes opérationnel avec les ancres spatiales Azure, vous pouvez créer et localiser des ancres dans Unity.

Point de contrôle de développement suivant

Si vous suivez le parcours du point de contrôle de développement Unity que nous avons mis en place, vous êtes au cœur de l’exploration des blocs de construction de la 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.

Voir aussi