Systèmes de coordonnées dans UnityCoordinate systems in Unity

Windows Mixed Reality prend en charge les applications à travers une large gamme d' expériences, des applications en orientation seule et à l’échelle à l’échelle jusqu’à des applications à l’échelle de la place.Windows Mixed Reality supports apps across a wide range of experience scales, from orientation-only and seated-scale apps up through room-scale apps. 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à.On HoloLens, you can go further and build world-scale apps that let users walk beyond 5 meters, exploring an entire floor of a building and beyond.

La première étape de la création d’une expérience de réalité mixte dans Unity consiste à déterminer la mise à l' échelle ciblée par votre application.Your first step in building a mixed reality experience in Unity is to determine which experience scale your app will target.

Création d’une expérience d’orientation seule ou de mise à l’échelle installéeBuilding an orientation-only or seated-scale experience

Espace de noms : UnityEngine. XRNamespace: UnityEngine.XR
Type : XRDeviceType: 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.To build an orientation-only or seated-scale experience, you need to set Unity to the Stationary tracking space type. 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.Stationary tracking space sets Unity's world coordinate system to track the stationary frame of reference. 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.In the Stationary tracking mode, content placed in the editor just in front of the camera's default location (forward is -Z) will appear in front of the user when the app launches.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Espace de noms : UnityEngine. XRNamespace: UnityEngine.XR
Type : InputTrackingType: 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 :For a pure orientation-only experience such as a 360-degree video viewer (where positional head updates would ruin the illusion), you can then set XR.InputTracking.disablePositionalTracking to 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 :For a seated-scale experience, to let the user later recenter the seated origin, you can call the XR.InputTracking.Recenter method:

InputTracking.Recenter();

Création d’une expérience de mise à l’échelle permanente ou à l’échelle de l’espaceBuilding a standing-scale or room-scale experience

Espace de noms : UnityEngine. XRNamespace: UnityEngine.XR
Type : XRDeviceType: XRDevice

Pour une expérience à l’échelle permanente ou à l’échelle de l' espace, vous devez placer du contenu par rapport à l’étage.For a standing-scale or room-scale experience, you'll need to place content relative to the floor. 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.You reason about the user's floor using the spatial stage, which represents the user's defined floor-level origin and optional room boundary, set up during first run.

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 :To ensure that Unity is operating with its world coordinate system at floor-level, you can set and test that Unity is using the RoomScale tracking space type:

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.If SetTrackingSpaceType returns true, Unity has successfully switched its world coordinate system to track the stage frame of reference.
  • 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.If SetTrackingSpaceType returns false, Unity was unable to switch to the stage frame of reference, likely because the user has not set up a floor in their environment. 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.While a false return value isn't common, it can happen if the stage is set up in a different room and the device is moved to the current room without the user setting up a new stage.

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.Once your app successfully sets the RoomScale tracking space type, content placed on the y=0 plane will appear on the floor. 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.The origin at 0, 0, 0 will be the specific place on the floor where the user stood during room setup, with -Z representing the forward direction they were facing during setup.

Espace de noms : UnityEngine. expérimentale. XRNamespace: UnityEngine.Experimental.XR
Type : limiteType: Boundary

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.In script code, you can then call the TryGetGeometry method on the UnityEngine.Experimental.XR.Boundary type to get a boundary polygon, specifying a boundary type of 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.If the user defined a boundary (you get back a list of vertices), it's safe to deliver a room-scale experience to the user, where they can walk around the scene you create.

Notes

Le système affiche automatiquement la limite lorsque l’utilisateur l’approche.The system will automatically render the boundary when the user approaches it. Votre application n’a pas besoin d’utiliser ce polygone pour restituer la limite elle-même.Your app doesn't need to use this polygon to render the boundary itself. 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 :However, you may choose to lay out your scene objects using this boundary polygon, to ensure the user can physically reach those objects without teleporting:

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 mondialeBuilding a world-scale experience

Espace de noms : UnityEngine. XR. WSANamespace: UnityEngine.XR.WSA
Type : WorldAnchorType: WorldAnchor

Pour les expériences réelles à 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 place.For true world-scale experiences on HoloLens that let users wander beyond 5 meters, you'll need new techniques beyond those used for room-scale experiences. 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.One key technique you'll use is to create a spatial anchor to lock a cluster of holograms precisely in place in the physical world, no matter how far the user has roamed, and then find those holograms again in later sessions.

Dans Unity, vous créez une ancre spatiale en ajoutant le composant WorldAnchor Unity à un GameObject.In Unity, you create a spatial anchor by adding the WorldAnchor Unity component to a GameObject.

Ajout d’une ancre mondialeAdding a World Anchor

Pour ajouter une ancre universelle, appelez AddComponent () sur l’objet de jeu avec la transformation que vous souhaitez ancrer dans le monde réel.To add a world anchor, call AddComponent() on the game object with the transform you want to anchor in the real world.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

C’est tout !That's it! 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.This game object will now be anchored to its current location in the physical world - you may see its Unity world coordinates adjust slightly over time to ensure that physical alignment. Utilisez la persistance pour rechercher à nouveau cet emplacement d’ancrage dans une session d’application future.Use persistence to find this anchored location again in a future app session.

Suppression d’une ancre mondialeRemoving a World Anchor

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.If you no longer want the GameObject locked to a physical world location and don't intend on moving it this frame, then you can just call Destroy on the World Anchor component.

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

Si vous souhaitez déplacer le GameObject ce frame, vous devez appeler DestroyImmediate à la place.If you want to move the GameObject this frame, you need to call DestroyImmediate instead.

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

Déplacement d’un GameObject ancré dans le mondeMoving a World Anchored GameObject

Les GameObject ne peuvent pas être déplacées pendant qu’une ancre mondiale y est.GameObject's cannot be moved while a World Anchor is on it. Si vous devez déplacer le GameObject ce frame, vous devez :If you need to move the GameObject this frame, you need to:

  1. DestroyImmediate le composant d’ancrage universelDestroyImmediate the World Anchor component
  2. Déplacer le GameObjectMove the GameObject
  3. Ajoutez un nouveau composant d’ancrage du monde au GameObject.Add a new World Anchor component to the GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Gestion des modifications de localisabilitéHandling Locatability Changes

Un WorldAnchor peut ne pas être localisable dans le monde physique à un moment donné.A WorldAnchor may not be locatable in the physical world at a point in time. Si cela se produit, Unity ne met pas à jour la transformation de l’objet ancré.If that occurs, Unity won't be updating the transform of the anchored object. Cela peut également changer pendant l’exécution d’une application.This also can change while an app is running. 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.Failure to handle the change in locatability will cause the object to not appear in the correct physical location in the world.

Pour être informé des changements de localisation :To be notified about locatability changes:

  1. S’abonner à l’événement OnTrackingChangedSubscribe to the OnTrackingChanged event
  2. Gérer l’événementHandle the event

L’événement OnTrackingChanged est appelé chaque fois que l’ancrage spatial sous-jacent change entre un État localisable et n’est pas localisable.The OnTrackingChanged event will be called whenever the underlying spatial anchor changes between a state of being locatable vs. not being locatable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Ensuite, gérez l’événement :Then handle the event:

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.Sometimes anchors are located immediately. Dans ce cas, cette propriété isLocated de l’ancre sera définie sur true lorsque AddComponent () retourne.In this case, this isLocated property of the anchor will be set to true when AddComponent() returns. Par conséquent, l’événement OnTrackingChanged n’est pas déclenché.As a result, the OnTrackingChanged event won't be triggered. Un modèle propre serait d’appeler votre gestionnaire OnTrackingChanged avec l’état initial de IsLocated après avoir attaché une ancre.A clean pattern would be to call your OnTrackingChanged handler with the initial IsLocated state after attaching an anchor.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Partage d’ancres sur plusieurs appareilsSharing anchors across devices

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.Use Azure Spatial Anchors to create a durable cloud anchor from a local WorldAnchor, which your app can then locate across multiple HoloLens, iOS and Android devices. 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.By sharing a common spatial anchor across multiple devices, each user can see content rendered relative to that anchor in the same physical location. Cette technique autorise les expériences partagées en temps réel.This allows for real-time shared experiences.

Pour commencer à créer des expériences partagées dans Unity, essayez les Démarrages rapides de 5 minutes d' Unity spatiales Azure Unity.To get started building shared experiences in Unity, try out the 5-minute Azure Spatial Anchors Unity quickstarts.

Une fois que vous êtes opérationnel avec les ancres spatiales Azure, vous pouvez créer et localiser des ancres dans Unity.Once you're up and running with Azure Spatial Anchors, you can then create and locate anchors in Unity.

Point de contrôle de développement suivantNext Development Checkpoint

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.If you're following the Unity development checkpoint journey we've laid out, you're in the midst of exploring the Mixed Reality core building blocks. À partir de là, vous pouvez passer au module suivant :From here, you can continue to the next building block:

Ou accéder aux API et fonctionnalités de la plateforme Mixed Reality :Or jump to Mixed Reality platform capabilities and APIs:

Vous pouvez revenir aux points de contrôle de développement Unity à tout moment.You can always go back to the Unity development checkpoints at any time.

Voir aussiSee Also