Systèmes de coordonnées dans Unity

Windows Mixed Reality prend en charge les applications sur un large éventail d’échelles d’expérience, depuis les applications d’orientation uniquement et de mise à l’échelle assise jusqu’aux 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 l’échelle d’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 mondiales d’Unity pour suivre le cadre de référence stationnaire. En mode de suivi stationnaire, le contenu placé dans l’éditeur juste devant l’emplacement par défaut de la caméra (avant est -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 d’orientation pure, telle qu’une visionneuse vidéo à 360 degrés (où les mises à jour de la tête de position gâcheraient l’illusion), vous pouvez ensuite définir XR. InputTracking.disablePositionalTracking to true :

InputTracking.disablePositionalTracking = true;

Pour une expérience de mise à l’échelle assise, pour permettre à l’utilisateur de recentrer ultérieurement l’origine des sièges, vous pouvez appeler le XR. Méthode InputTracking.Recenter :

InputTracking.Recenter();

Création d’une expérience à l’échelle permanente ou à l’échelle de la salle

Espace de noms :UnityEngine.XR
Type :XRDevice

Pour une expérience à l’échelle permanente ou à l’échelle de la salle, vous devez placer le contenu par rapport à l’étage. Vous raisonnerez l’étage de l’utilisateur à l’aide de la phase spatiale, qui représente l’origine au niveau de l’étage définie par l’utilisateur et la limite de salle facultative, configurées lors de la première exécution.

Pour vous assurer qu’Unity fonctionne avec son système de coordonnées mondiales au niveau du plancher, 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 true, Unity a correctement basculé son système de coordonnées mondiales pour suivre le cadre de référence de l’étape.
  • Si SetTrackingSpaceType retourne la valeur false, Unity n’a pas pu basculer vers le cadre 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, cela peut se produire si la phase est configurée dans une autre salle et que l’appareil est déplacé vers la salle actuelle 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 s’affiche au sol. L’origine à 0, 0, 0 sera l’emplacement spécifique sur l’étage où l’utilisateur s’est tenu pendant la configuration de la salle, avec -Z représentant la direction vers l’avant qu’il ait été orienté pendant la configuration.

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 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.

Notes

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 physiquement atteindre 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 allez utiliser 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 parcourue par l’utilisateur, 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 ses coordonnées de monde Unity s’ajuster légèrement au fil du temps pour garantir cet alignement physique. Utilisez la persistance pour retrouver cet emplacement ancré dans une session d’application ultérieure.

Suppression d’une ancre mondiale

Si vous ne souhaitez plus que l’objet GameObject soit verrouillé à un emplacement du monde physique et que vous n’avez pas l’intention de le déplacer dans ce cadre, 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 mondial ancré

GameObject ne peut pas être déplacé tant qu’une ancre mondiale est dessus. Si vous devez déplacer le GameObject ce cadre, vous devez :

  1. DestroyImmediate le composant World Anchor
  2. Déplacer le GameObject
  3. Ajoutez un nouveau composant World Anchor à 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. Si vous ne gérez pas le changement de locatabilité, l’objet n’apparaît pas à l’emplacement physique approprié dans le monde.

Pour être averti des modifications de locatabilité :

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

L’événement OnTrackingChanged est appelé chaque fois que l’ancre spatiale sous-jacente change entre un état 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 sont situées immédiatement. Dans ce cas, cette propriété isLocated de l’ancre est définie sur true lorsque AddComponent<WorldAnchor>() est retourné. 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 avoir attaché une ancre.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Partage d’ancres entre 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 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 en train d’explorer les Mixed Reality blocs de construction de base. À partir de là, vous pouvez passer au module 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