Conseguir que los hologramas permanezcan en su lugar, se muevan con usted o, en algunos casos, se coloquen en relación con otros hologramas es una gran parte de la creación de aplicaciones Mixed Reality. Este artículo le llevará a través de nuestra solución recomendada mediante Herramientas de bloqueo mundial, pero también trataremos la configuración manual de anclajes espaciales en los proyectos de Unity. Antes de pasar a cualquier código, es importante comprender cómo Unity controla el espacio de coordenadas y los anclajes en su propio motor.
Sistemas de coordenadas a escala mundial
Hoy en día, al escribir juegos, aplicaciones de visualización de datos o aplicaciones de realidad virtual, el enfoque típico es establecer un sistema de coordenadas del mundo absoluto al que todas las demás coordenadas pueden volver a asignarse de forma confiable. En ese entorno, siempre puede encontrar una transformación estable que defina una relación entre cualquiera de los dos objetos de ese mundo. Si no mueve esos objetos, sus transformaciones relativas siempre seguirán siendo las mismas. Este tipo de sistema de coordenadas global es fácil de conseguir cuando se representa un mundo puramente virtual donde se conoce toda la geometría de antemano. Las aplicaciones de VR a escala de sala actualmente suelen establecer este tipo de sistema de coordenadas de escala de sala absoluta con su origen en el suelo.
Por el contrario, un dispositivo de realidad mixta no anclada, como HoloLens, tiene una comprensión dinámica controlada por sensores del mundo, ajustando continuamente su conocimiento a lo largo del tiempo de los alrededores del usuario a medida que caminan muchos metros a través de un piso completo de un edificio. En una experiencia a escala mundial, si colocaste todos tus hologramas en un sistema de coordenadas rígidas naïve, esos hologramas acabarían desfasándose con el tiempo, ya sea en función del mundo o en relación entre sí.
Por ejemplo, los auriculares pueden creer que dos ubicaciones del mundo están separadas por 4 metros y, después, refinar esa comprensión, aprendiendo que las ubicaciones están de hecho a 3,9 metros de distancia. Si esos hologramas se hubieran colocado inicialmente a 4 metros de distancia en un único sistema de coordenadas rígidas, uno de ellos siempre aparecería a 0,1 metros del mundo real.
Puede colocar manualmente anclajes espaciales en Unity para mantener la posición de un holograma en el mundo físico cuando el usuario es móvil. Sin embargo, esto sacrifica la autocoherencia dentro del mundo virtual. Los anclajes diferentes se mueven constantemente en relación entre sí y también se mueven a través del espacio de coordenadas global. En este escenario, las tareas sencillas, como el diseño, se vuelven difíciles. La simulación física también puede ser problemática.
World Locking Tools (WLT) le lleva lo mejor de ambos mundos, estabilizando un único sistema de coordenadas rígido usando una fuente interna de anclajes espaciales distribuidos en toda la escena virtual a medida que el usuario se mueve. WLT analiza las coordenadas de la cámara y esos anclajes espaciales cada fotograma. En lugar de cambiar las coordenadas de todo el mundo para compensar las correcciones en las coordenadas de la cabeza del usuario, WLT corrige las coordenadas de la cabeza en su lugar.
Elección del enfoque de bloqueo del mundo
Si es posible, use World Locking Tools para el posicionamiento de hologramas.
World Locking Tools proporciona un sistema de coordenadas estable que minimiza las incoherencias visibles entre los marcadores del mundo virtual y real. World Locking Tools bloquea la escena completa con un grupo compartido de anclajes, en lugar de bloquear cada grupo de objetos con el propio delimitador individual del grupo.
World Locking Tools controla automáticamente la creación y administración interna de anclajes espaciales. No es necesario interactuar con ARAnchorManager ni WorldAnchor para mantener bloqueados el mundo de los hologramas.
Para Unity 2019/2020 con OpenXR o el complemento XR de Windows, use ARAnchorManager.
Para versiones anteriores de Unity o proyectos de WSA, use WorldAnchor.
Para empezar a usar World Locking Tools, descargue la herramienta de características de Mixed Reality. Para obtener más información sobre los conceptos básicos, consulte la página principal de documentación de World Locking Tools para obtener vínculos a Información general, Inicio rápido y otros temas útiles.
Cuando el proyecto esté listo para usarse, ejecute la utilidad configurar escena desde Mixed Reality > World Locking Tools:
Importante
La utilidad "Configure scene" (Configurar escena) se puede volver a ejecutar en cualquier momento. Por ejemplo, debe volver a ejecutarse si el destino de AR ha cambiado de Legacy a XR SDK. Si la escena ya está configurada correctamente, la ejecución de la utilidad no tiene ningún efecto.
Visualizadores
Durante el desarrollo temprano, agregar visualizadores puede ser útil para asegurarse de que WLT está configurado y funcionando correctamente. Más tarde, se pueden eliminar para mejorar el rendimiento en producción, o si por alguna razón ya no son necesarios, con la utilidad "Remove visualizers" (Quitar visualizadores). Puede encontrar más detalles sobre los visualizadores en la documentación de las herramientas.
El complemento Mixed Reality OpenXR proporciona funcionalidad básica de anclaje a través de una implementación de ARFoundation ARAnchorManager de Unity. Para aprender los conceptos básicos sobre ARAnchors en ARFoundation, visite el Manual de arFoundation para AR Anchor Manager.
Espacio de nombres:UnityEngine.XR.WSA Type:WorldAnchor
En versiones anteriores de Unity, se crea un delimitador espacial agregando el componente WorldAnchor Unity a un GameObject.
Agregar un delimitador mundial
Para agregar un delimitador del mundo, llama AddComponent<WorldAnchor>() al objeto del juego con la transformación que quieres delimitar en el mundo real.
Este objeto de juego ahora está anclado a su ubicación actual en el mundo físico. Es posible que vea que sus coordenadas del mundo de Unity se ajustan ligeramente con el tiempo para garantizar la alineación física. Consulta cargar un delimitador del mundo para encontrar esta ubicación anclada de nuevo en una sesión futura de la aplicación.
Quitar un delimitador mundial
Si ya no desea que esté GameObject bloqueado en una ubicación física del mundo y no quiera moverlo, llame Destroy al componente World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Si desea mover este GameObject marco, llame DestroyImmediate a en su lugar.
Un Delimitador mundial podría no ser locable en el mundo físico en un momento dado. Después, Unity no actualizará la transformación del objeto delimitado. Esta situación también puede ocurrir mientras se ejecuta una aplicación. Si no se controla el cambio en la localización, el objeto no aparece en la ubicación física correcta del mundo.
Para recibir una notificación sobre los cambios de portabilidad:
Suscríbase al OnTrackingChanged evento. Se OnTrackingChanged llama al evento cada vez que el delimitador espacial subyacente cambia entre un estado de ser locatable o no se puede localizar.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Si los delimitadores se encuentran inmediatamente, la isLocated propiedad del delimitador se establece true en cuando AddComponent<WorldAnchor>() devuelve. Por lo tanto, el OnTrackingChanged evento no se desencadena. Un patrón más limpio consiste en llamar al OnTrackingChanged controlador con el estado inicial IsLocated después de adjuntar un delimitador.
Los delimitadores espaciales guardan hologramas en un espacio real entre sesiones de aplicación. Una vez guardados en el almacén de anclajes de HoloLens, los delimitadores espaciales se pueden encontrar y cargar en sesiones diferentes y son una reserva ideal cuando no hay conectividad a Internet.
Importante
Los anclajes locales se almacenan en el dispositivo, mientras que los Azure Spatial Anchors se almacenan en la nube. Puede tener anclajes locales y de Azure en el mismo proyecto sin conflictos. Para más información sobre cómo integrar los servicios en la nube de Azure para almacenar los anclajes, consulte Azure Spatial Anchors.
De forma predeterminada, World Locking Tools restaura el sistema de coordenadas de Unity en relación con el mundo físico entre sesiones en dispositivos que admiten la persistencia de anclajes espaciales locales. Para que un holograma aparezca en el mismo lugar en el mundo físico después de salir y volver a ejecutar la aplicación, la aplicación solo necesita restaurar la misma posición en el holograma.
World Locking Tools solo admite la persistencia de anclaje local en dispositivos HoloLens. Para dispositivos Android, iOS y HoloLens, se integran con Azure Spatial Anchors para admitir la persistencia y el uso compartido de espacios de coordenadas entre sesiones y dispositivos. Para más información y ejemplos de uso de Herramientas de bloqueo mundial con Azure Spatial Anchors, consulte Herramientas de bloqueo mundial (WLT) combinadas con Azure Spatial Anchors (ASA).
Una API denominada XRAnchorStore permite que los delimitadores se conserven entre sesiones. XRAnchorStore es una representación de los anclajes guardados en un dispositivo. Puede conservar los delimitadores desde en la escena de ARAnchors Unity, cargar delimitadores desde el almacenamiento en nuevos ARAnchorso eliminar de almacenamiento.
Nota
Guarde y cargue estos anclajes en el mismo dispositivo. Los anclajes entre dispositivos se admiten a través de Azure Spatial Anchors.
Espacios de nombres
Para Unity 2020 y OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
o Unity 2019/2020 + Complemento XR de Windows:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Métodos públicos
{
// A list of all persisted anchors, which can be loaded.
public IReadOnlyList<string> PersistedAnchorNames { get; }
// Clear all persisted anchors
public void Clear();
// Load a single persisted anchor by name. The ARAnchorManager will create this new anchor and report it in
// the ARAnchorManager.anchorsChanged event. The TrackableId returned here is the same TrackableId the
// ARAnchor will have when it is instantiated.
public TrackableId LoadAnchor(string name);
// Attempts to persist an existing ARAnchor with the given TrackableId to the local store. Returns true if
// the storage is successful, false otherwise.
public bool TryPersistAnchor(TrackableId id, string name);
// Removes a single persisted anchor from the anchor store. This will not affect any ARAnchors in the Unity
// scene, only the anchors in storage.
public void UnpersistAnchor(string name);
}
Obtención de una referencia de almacén de anclajes
Para cargar XRAnchorStore con Unity 2020 y OpenXR, use el método de extensión en el sistema XRAnchorSubsystem, el subsistema de un ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Para cargar XRAnchorStore con Unity 2019/2020 y el complemento XR de Windows, use el método de extensión en XRReferencePointSubsystem (Unity 2019) o XRAnchorSubsystem (Unity 2020), el subsistema de un ARReferencePointManager/ARAnchorManager:
// Unity 2019 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRReferencePointSubsystem anchorSubsystem);
// Unity 2020 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem);
Carga de un almacén de anclajes
Para cargar un almacén de anclajes en Unity 2020 y OpenXR, acceda a él desde el subsistema de ARAnchorManager de la siguiente manera:
Para ver un ejemplo completo de anclajes persistentes o no persistentes, consulte el script Anchors -> Anchors Sample GameObject y AnchorsSample.cs en el script [Mixed Reality escena de ejemplo del complemento OpenXR]((https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples):
Para la persistencia de hologramas en versiones anteriores de Unity o proyectos de WSA, use WorldAnchor.
Espacio de nombres:UnityEngine.XR.WSA.Persistence Class:WorldAnchorStore
WorldAnchorStore crea experiencias holográficas en las que los hologramas permanecen en posiciones específicas del mundo real entre instancias de la aplicación. Los usuarios pueden anclar hologramas individuales donde quiera y encontrarlos más adelante en el mismo lugar en las sesiones de la aplicación.
WorldAnchorStore Permite conservar la ubicación de los anclajes del mundo entre sesiones. Para conservar hologramas entre sesiones, realice un seguimiento independiente de ese uso de GameObjects un delimitador de mundo determinado. Puede crear una GameObject raíz con un delimitador del mundo y delimitar hologramas secundarios con un desplazamiento de posición local.
Para cargar hologramas de sesiones anteriores:
Obtiene el objeto WorldAnchorStore.
Cargue los datos de la aplicación delimitador del mundo, que proporciona el identificador del delimitador del mundo.
Cargue el delimitador del mundo por su identificador.
Para guardar hologramas para futuras sesiones:
Obtiene el objeto WorldAnchorStore.
Guarde un delimitador del mundo y especifique un identificador.
Guarde los datos de la aplicación relacionados con el delimitador del mundo junto con el identificador.
Obtener worldAnchorStore
Mantenga una referencia a WorldAnchorStore, por lo que sabe cuándo está listo para realizar una operación. Dado que esta llamada es asincrónica, en cuanto se inicia la aplicación, puede llamar a:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded es el controlador cuando finaliza la WorldAnchorStore carga:
Ahora tiene una referencia a WorldAnchorStore, que puede usar para guardar y cargar anclajes del mundo específicos.
Guardar un delimitador del mundo
Para guardar un delimitador del mundo, asigne un nombre al delimitador del mundo y páselo antes WorldAnchorStore . Si intenta guardar dos delimitadores en la misma cadena, store.Save devuelve false. Elimine el guardado anterior antes de guardar uno nuevo.
private void SaveGame()
{
// Save data about holograms that this world anchor positions
if (!this.savedRoot) // Only save the root once
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}
Carga de un delimitador del mundo
Para cargar un delimitador mundial:
private void LoadGame()
{
// Saved data about holograms that this world anchor positions:
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// Game root not saved. Re-place objects or start over.
}
}
También puede usar store.Delete() para quitar un delimitador que guardó anteriormente y store.Clear() para quitar todos los datos guardados anteriormente.
Enumerar anclajes existentes
Para enumerar los delimitadores almacenados, llame a GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Conservar hologramas para varios dispositivos
Puede usar Azure Spatial Anchors para crear un delimitador de nube duradero a partir de un delimitador del mundo local. La aplicación puede localizar el delimitador de la nube en varios dispositivos HoloLens, iOS y Android, incluso si los dispositivos no están juntos al mismo tiempo. Dado que los delimitadores de nube son persistentes, varios dispositivos pueden ver el contenido representado en relación con ese delimitador en la misma ubicación física a lo largo del tiempo.
Pasos siguientes
Compartir un espacio de coordenadas bloqueado por el mundo: