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 de realidad mixta. Este artículo le llevará a través de nuestra solución recomendada mediante Las herramientas de bloqueo mundial, pero también trataremos la configuración manual de anclajes espaciales en los proyectos de Unity. Antes de saltar 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 absoluto de coordenadas del mundo al que todas las demás coordenadas se pueden asignar de forma confiable. En ese entorno, siempre puede encontrar una transformación estable que defina una relación entre 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 habitación absoluta con su origen en el suelo.
Por el contrario, un dispositivo de realidad mixta no anclado, como HoloLens, tiene una comprensión dinámica controlada por sensores del mundo, ajustando continuamente sus conocimientos a lo largo del tiempo del entorno del usuario a medida que caminan muchos metros por todo un piso de un edificio. En una experiencia a escala mundial, si colocaste todos tus hologramas en un sistema de coordenadas rígido naïve, esos hologramas acabarían desfase 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 de hecho que las ubicaciones están separadas de 3,9 metros. Si esos hologramas se hubieran colocado inicialmente a 4 metros de distancia en un único sistema de coordenadas rígido, 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 diferentes delimitadores 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 permite obtener lo mejor de ambos mundos, estabilizando un único sistema de coordenadas rígido mediante un suministro interno de anclajes espaciales distribuidos a lo largo de 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 solo 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 anclaje 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 o 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 las herramientas de bloqueo mundial, 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 ver 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 OpenXR de Mixed Reality proporciona funcionalidad de anclaje básica a través de una implementación de ARAnchorManager arAnchorManager de Unity. Para conocer los conceptos básicos de ARAnchors en ARFoundation, visite el Manual de arFoundation para AR Anchor Manager.
Espacio de nombres:UnityEngine.XR.WSA Tipo:WorldAnchor
Una técnica clave consiste en crear un delimitador espacial para bloquear un clúster de hologramas con precisión en el mundo físico, independientemente de la distancia que el usuario haya desplazado y, a continuación , buscar esos hologramas de nuevo en sesiones posteriores.
En versiones anteriores de Unity, se crea un delimitador espacial agregando el componente WorldAnchor Unity a gameObject.
Agregar un delimitador del mundo
Para agregar un delimitador del mundo, llame AddComponent<WorldAnchor>() al objeto del juego con la transformación que desea 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. Consulte 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 del mundo
Si ya no desea que esté GameObject bloqueado en una ubicación del mundo físico 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 anclado. Esta situación también puede ocurrir mientras se ejecuta una aplicación. Si no se controla el cambio en la locabilidad, 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 delimitadores, 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 del 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.
Si la aplicación necesita un control más preciso, puede deshabilitar el guardado automático y la carga automática en el inspector y administrar la persistencia desde un script. Para obtener más información, consulte Persist spatial coordinate systems (Conservar sistemas de coordenadas espaciales).
World Locking Tools solo admite la persistencia de anclaje local en dispositivos HoloLens. Para dispositivos Android, iOS y HoloLens, se integra con Azure Spatial Anchors para admitir la persistencia y el uso compartido de espacios de coordenadas entre sesiones y dispositivos. Para obtener más información y ejemplos con 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 ARAnchors en la escena de Unity, cargar delimitadores desde el almacenamiento en nuevos ARAnchorso eliminar de almacenamiento.
Nota:
Guarde y cargue estos anclajes en el mismo dispositivo. Los delimitadores 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);
Cargar 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 GameObject de ejemplo Anchors - Anchors -> Anchors y AnchorsSample.cs script en la [Escena de ejemplo de complemento OpenXR de Mixed Reality]((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 Clase: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 siempre que quieran 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 mundiales entre sesiones. Para conservar los hologramas entre sesiones, mantenga un seguimiento independiente de GameObjects que use un anclaje mundial 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 mundial.
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, tan pronto como se inicie la aplicación, puede llamar a:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded es el controlador cuando finaliza la WorldAnchorStore carga:
Ahora tiene una referencia a , WorldAnchorStoreque puede usar para guardar y cargar anclajes del mundo específicos.
Guardar un delimitador del mundo
Para guardar un delimitador del mundo, denombre el delimitador del mundo y páselo en el WorldAnchorStore que obtuvo antes. Si intenta guardar dos anclajes 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 del mundo:
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 anclaje 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 la 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 del mundo: