Sistemas de coordenadas en Unity
Windows Mixed Reality admite aplicaciones en una amplia gama de escalas de experiencia, desde aplicaciones solo de orientación y de escalado sentado hasta aplicaciones a escala de salas. En HoloLens, puede ir más allá y crear aplicaciones a escala mundial que permitan a los usuarios caminar más allá de 5 metros, explorando todo un piso de un edificio y más allá.
El primer paso para crear una experiencia de realidad mixta en Unity es comprender los sistemas de coordenadas y elegir la escala de experiencia a la que se dirigirá la aplicación.
Creación de una experiencia de escala de solo orientación o sentado
Espacio de nombres:UnityEngine.XR
Type:XRDevice
Para crear una experiencia de escala solo de orientación o sentado, debe establecer Unity en el tipo de espacio de seguimiento estacionario. El espacio de seguimiento estacionario establece el sistema de coordenadas mundial de Unity para realizar un seguimiento del marco estacionario de referencia. En el modo de seguimiento estacionario, el contenido colocado en el editor justo delante de la ubicación predeterminada de la cámara (adelante es -Z) aparecerá delante del usuario cuando se inicie la aplicación.
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
Espacio de nombres:UnityEngine.XR
Type:InputTracking
Para una experiencia pura de solo orientación , como un visor de vídeo de 360 grados (donde las actualizaciones posicionales de la cabeza arruinarían la ilusión), puedes establecer XR. InputTracking.disablePositionalTracking en true:
InputTracking.disablePositionalTracking = true;
Para una experiencia de escalado sentado, para permitir que el usuario más adelante recale el origen sentado, puede llamar a XR. Método InputTracking.Recenter :
InputTracking.Recenter();
Creación de una experiencia a escala permanente o a escala de sala
Espacio de nombres:UnityEngine.XR
Type:XRDevice
Para una experiencia de escala permanente o de escala de sala, deberá colocar contenido en relación con el suelo. Debe razonar sobre el suelo del usuario mediante la fase espacial, que representa el origen de nivel de suelo definido por el usuario y el límite de sala opcional, configurados durante la primera ejecución.
Para asegurarse de que Unity funciona con su sistema de coordenadas mundial en el nivel inferior, puede establecer y probar que Unity usa el tipo de espacio de seguimiento 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 devuelve true, Unity ha cambiado correctamente su sistema de coordenadas del mundo para realizar un seguimiento del marco de fase de referencia.
- Si SetTrackingSpaceType devuelve false, Unity no pudo cambiar al marco de fase de referencia, probablemente porque el usuario no ha configurado una planta en su entorno. Aunque un valor devuelto falso no es común, puede ocurrir si la fase está configurada en otra sala y el dispositivo se mueve a la sala actual sin que el usuario configure una nueva fase.
Una vez que la aplicación establece correctamente el tipo de espacio de seguimiento RoomScale, el contenido colocado en el plano y=0 aparecerá en el suelo. El origen en 0, 0, 0 será el lugar específico en el piso donde el usuario estuvo de pie durante la configuración de la sala, con -Z representando la dirección hacia delante a la que se enfrentó durante la instalación.
Namespace:UnityEngine.Experimental.XR
Type:Boundary
En el código de script, puede llamar al método TryGetGeometry en el tipo UnityEngine.Experimental.XR.Boundary para obtener un polígono de límite, especificando un tipo de límite de TrackedArea. Si el usuario definió un límite (obtiene una lista de vértices), es seguro ofrecer una experiencia de escala de sala al usuario, donde puede recorrer la escena que cree.
Nota:
El sistema representará automáticamente el límite cuando el usuario se acerque a él. La aplicación no necesita usar este polígono para representar el propio límite. Sin embargo, puede optar por diseñar los objetos de la escena mediante este polígono de límites para asegurarse de que el usuario pueda llegar físicamente a esos objetos sin teletransporte:
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.
}
Creación de una experiencia a escala mundial
Espacio de nombres:UnityEngine.XR.WSA
Type:WorldAnchor
Para las verdaderas experiencias a escala mundial en HoloLens que permiten a los usuarios recorrer más allá de 5 metros, necesitará nuevas técnicas más allá de las usadas para las experiencias a escala de salas. Una técnica clave que usará es crear un delimitador espacial para bloquear un clúster de hologramas exactamente en su lugar en el mundo físico, independientemente de lo lejos que el usuario haya vagado y, a continuación, encontrar esos hologramas de nuevo en sesiones posteriores.
En Unity, se crea un delimitador espacial agregando el componente WorldAnchor Unity a un GameObject.
Adición de un delimitador de mundo
Para agregar un delimitador de mundo, llama a AddComponent<WorldAnchor>() en el objeto del juego con la transformación que quieres delimitar en el mundo real.
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Y eso es todo. Este objeto de juego ahora estará anclado a su ubicación actual en el mundo físico: es posible que veas que las coordenadas del mundo de Unity se ajustan ligeramente con el tiempo para garantizar esa alineación física. Use la persistencia para buscar esta ubicación delimitada de nuevo en una sesión de aplicación futura.
Eliminación de un delimitador de mundo
Si ya no quieres que GameObject esté bloqueado en una ubicación física del mundo y no tengas intención de moverlo este marco, puedes llamar a Destroy en el componente World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Si quieres mover gameobject este marco, debes llamar a DestroyImmediate en su lugar.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
Movimiento de un objeto GameObject anclado por el mundo
Los objetos GameObject no se pueden mover mientras hay un delimitador de mundo en él. Si necesita mover gameobject este marco, debe hacer lo siguiente:
- DestroyImmediate el componente World Anchor
- Mover gameobject
- Agregue un nuevo componente de World Anchor a GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Controlar los cambios de locatabilidad
Un WorldAnchor puede no ser localizable en el mundo físico en un momento dado. Si esto ocurre, Unity no actualizará la transformación del objeto delimitado. Esto también puede cambiar mientras se ejecuta una aplicación. Si no se controla el cambio en la locatabilidad, el objeto no aparecerá en la ubicación física correcta del mundo.
Para recibir notificaciones sobre los cambios de locatabilidad:
- Suscribirse al evento OnTrackingChanged
- Controlar el evento
Se llamará al evento OnTrackingChanged cada vez que el delimitador espacial subyacente cambie entre un estado de ser localizable frente a no ser localizable.
anchor.OnTrackingChanged += Anchor_OnTrackingChanged;
A continuación, controle el evento:
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
A veces, los anclajes se encuentran inmediatamente. En este caso, esta propiedad isLocated del delimitador se establecerá en true cuando AddComponent<WorldAnchor>() devuelva. Como resultado, el evento OnTrackingChanged no se desencadenará. Un patrón limpio sería llamar al controlador OnTrackingChanged con el estado IsLocated inicial después de adjuntar un delimitador.
Anchor_OnTrackingChanged(anchor, anchor.isLocated);
Siguiente punto de comprobación de desarrollo
Si sigue el recorrido del punto de control de desarrollo de Unity que hemos diseñado, está en medio de explorar los Mixed Reality bloques de creación principales. Desde aquí, puede continuar con el siguiente bloque de creación:
O vaya a las API y las funcionalidades de la plataforma de Mixed Reality:
Siempre puede volver a los puntos de control de desarrollo de Unity en cualquier momento.