Códigos QR en Unity
Los cascos holoLens 2 pueden realizar un seguimiento y detectar códigos QR que se pueden usar para proporcionar hologramas y otras características de AR. Este artículo le guía por todo lo que necesita saber para empezar a usar códigos QR en la aplicación de Unity, entre las que se incluyen:
- Adición de la detección de código QR a la aplicación de Unity.
- Comprender los conceptos importantes y los componentes de Unity que debe usar.
- Proporciona tutoriales que cubren el uso común del código QR.
- Presenta el escenario de ejemplo de marcador de AR que muestra una escena habilitada para código QR y scripts de ejemplo.
Antes de continuar con este artículo, se recomienda pasar por la introducción a los códigos QR.
Configuración del proyecto y la aplicación de Unity
El proyecto y la aplicación de Unity deben configurarse y configurarse correctamente para habilitar la funcionalidad de código QR, lo que requiere:
- OpenXR para Windows Mixed Reality versión 113.2403.5001 o posterior.
Nota:
Esto incluye el sistema operativo y se puede actualizar a través de la Tienda Windows. Tenga en cuenta que los usuarios pueden tener instaladas versiones anteriores y sus dispositivos no podrán trabajar con marcadores AR como códigos QR hasta actualizar a la versión 113.2403.5001 o posterior.
- Un proyecto compatible con una versión compatible de Unity:
- Unity 2022.3 LTS (recomendado)
- Unity 2021.3 LTS
- Complemento OpenXR de Mixed Reality.
- Funcionalidades de cámara web habilitadas para el proyecto de Unity.
- Permisos de cámara concedidos a la aplicación.
Las secciones siguientes le guían a través de cómo configurar el proyecto y la aplicación de Unity para habilitar la detección de código QR.
Obtención del complemento OpenXR de Mixed Reality
El paquete del complemento OpenXR de Mixed Reality contiene API de C# que puede usar para acceder a la funcionalidad de código QR.
Para importar el paquete:
- Descargue y ejecute la herramienta de características de Mixed Reality.
- Instale el complemento OpenXR.
Mixed Reality Feature Tool también simplifica la administración de paquetes y se puede usar para buscar, actualizar y agregar las características de Mixed Reality que requiere la aplicación. Consulte Welcome to the Mixed Reality Feature Tool (Herramienta de características de Mixed Reality) para obtener instrucciones detalladas sobre cómo usar la herramienta.
Habilitación de las funcionalidades de WebCam
Para detectar y realizar un seguimiento de los códigos QR, el proyecto de Unity debe tener habilitadas las funcionalidades de WebCam .
Para habilitar las funcionalidades de WebCam :
- Abra el proyecto de Unity.
- Haga clic en Editar en el menú de la aplicación del editor de Unity.
- Ve a Project Settings Player (Reproductor de configuración del > proyecto) y selecciona la pestaña UWP como se muestra:
- Habilite WebCam en la lista Funcionalidades .
- Salga de La configuración del proyecto.
Las funcionalidades de WebCam ahora están habilitadas para la aplicación de Unity. Sin embargo, la aplicación todavía debe tener permisos para acceder a la cámara del dispositivo.
Concesión de permisos de acceso a la cámara de la aplicación
Si la aplicación tiene habilitadas las funcionalidades de WebCam , el cuadro de diálogo de permisos solicita a los usuarios que concedan acceso a la aplicación a la cámara del dispositivo.
Este cuadro de diálogo solo se muestra a los usuarios una vez, normalmente al escribir una escena que contiene un ARMarkerManager
con la compatibilidad con marcadores de código QR habilitada. Si se deniega el acceso a la cámara, los usuarios pueden ir a Aplicaciones de configuración > y habilitarlo a través de las opciones avanzadas de la aplicación.
Creación de la detección de código QR en una escena
La detección de código QR debe estar integrada en cada escena en la que desee usar códigos QR, lo que requiere:
- Un
GameObject
conARMarkerManager
adjunto.ARMarkerManager
es el único responsable de crear, actualizar y quitar cada uno de losGameObject
códigos QR detectados. - Un objeto prefabricado con
ARMarker
adjunto. ARMarkerManager
configurado para usar el objeto prefabricado al crear unGameObject
objeto cuando se detecta un código QR.
Creación de un objeto prefabricado para códigos QR
Para usar códigos QR en la escena, debe crear un objeto prefabricado para códigos QR. ARMarkerManager
usa este objeto prefabricado para crear a GameObject
partir de cada vez que se detecta un código QR.
Para crear un objeto prefabricado para códigos QR:
- Cree un nuevo objeto prefabricado para el proyecto.
- Agregue el
ARMarker
componente al objeto prefabricado, ubicado en Script > Microsoft.MixedReality.OpenXR > ARMarker.
Ahora tiene un objeto prefabricado básico con el que trabajar. Es probable que quieras que la aplicación represente visualmente los códigos QR que se detectan en el entorno. En la sección siguiente se explica cómo agregar una representación visual para códigos QR.
Agregar objetos visuales
En la sección anterior, agregar ARMarker
al objeto prefabricado también agregó automáticamente el ARMarkerScale
componente. Este componente se usa para hacer coincidir la escala de la representación visual de un código QR con su homólogo físico.
Para ello:
- Agregue un vacío al objeto prefabricado
GameObject
que creó en la sección anterior. Representará todo el contenido del marcador visual. - Agregue un 3D
GameObject
secundario , como ,Quad
al contenidoGameObject
del marcador . - En el componente del
ARMarkerScale
objeto prefabricado, establezca Transformación de escala de marcador en el contenidoGameObject
del marcador . Establecer este campo garantiza que el 3DGameObject
elegido se escala correctamente para que coincida con los códigos QR del mundo real.
Agregar ARMarkerManager
a una escena
ARMarkerManager
es el único responsable de crear, actualizar y quitar cada uno de los GameObject
códigos QR detectados.
Para agregar ARMarkerManager
a la escena:
- Coloque un
GameObject
elemento en la escena. - Agregue el
ARMarkerManager
componente a ,GameObject
ubicado en Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
- Establezca el
ARMarkerManager
campo Marcador prefabricado en el objeto prefabricado que creó en la sección anterior. - Expanda Enabled Marker Types (Tipos de marcador habilitados), elija un elemento y establézcalo en CÓDIGO QR.
Seguimiento de los cambios de código QR
ARMarkerManager
contiene el markersChanged
evento , que proporciona ARMarkersChangedEventArgs
a los suscriptores. Use estos argumentos de evento para realizar un seguimiento de los códigos QR que se agregan o quitan de la detección o actualización de los datos de posición.
El código siguiente muestra la suscripción al ARMarkerManager.markersChanged
evento, usando sus argumentos de evento para iterar a través de los ARMarker
objetos ARMarkerManager
está controlando y escribiendo en Depurar si se agregan, quitan o actualizan.
using System;
using Microsoft.MixedReality.OpenXR;
// ...
private void Awake()
{
m_arMarkerManager = GetComponent<ARMarkerManager>();
m_arMarkerManager.markersChanged += OnQRCodesChanged;
}
void OnQRCodesChanged(ARMarkersChangedEventArgs args)
{
foreach (ARMarker qrCode in args.added)
Debug.Log($"QR code with the ID {qrCode.trackableId} added.");
foreach (ARMarker qrCode in args.removed)
Debug.Log($"QR code with the ID {qrCode.trackableId} removed.");
foreach (ARMarker qrCode in args.updated)
{
Debug.Log($"QR code with the ID {qrCode.trackableId} updated.");
Debug.Log($"Pos:{qrCode.transform.position} Rot:{qrCode.transform.rotation} Size:{qrCode.size}");
}
}
Obtención de la hora en que se detectó por última vez un código QR
Utilice la ARMarker.lastSeenTime
propiedad para determinar cuándo el dispositivo ha seguido por última vez un código QR detectado y la cantidad de tiempo, si existe, el seguimiento se pierde. El tiempo se mide en el número de segundos desde que Unity inició la aplicación y es análogo a UnityEngine.Time.realtimeSinceStartup
.
Usar el identificador rastreable de un código QR
Los códigos QR son rastreables, que son cualquier cosa que un dispositivo AR puede detectar y realizar un seguimiento en un entorno físico. Los seguimientos derivan del tipo ARTrackable<TSessionRelativeData, TTrackable>
que proporciona un identificador, un estado de seguimiento, una posición y otros datos.
El identificador rastreable de un código QR se puede pasar a ARMarkerManager
métodos para obtener las propiedades del código QR, los datos de bytes sin procesar y la representación de cadena, y para establecer el modo de transformación para el código QR. Estos métodos permiten recuperar datos de un código QR sin tener que mantenerse en una ARMarker
referencia de objeto.
Puede pasar el identificador de un código QR a los métodos siguientes ARMarkerManager
:
GetDecodedString(UnityEngine.XR.ARSubsystems.TrackableId trackableId)
GetMarker(UnityEngine.XR.ARSubsystems.TrackableId trackableId)
GetQRCodeProperties(UnityEngine.XR.ARSubsystems.TrackableId)
GetRawData(UnityEngine.XR.ARSubsystems.TrackableId, Unity.Collections.Allocator)
SetTransformMode(UnityEngine.XR.ARSubsystems.TrackableId, Microsoft.MixedReality.OpenXR.TransformMode)
Nota:
Para el parámetro allocator
del GetRawData
método , pasar Unity.Collections.Allocator.Temp
es suficiente para la mayoría de los escenarios.
Siguiendo el estado de seguimiento de un código QR
Dado que se ARMarker
puede realizar un seguimiento, hereda la trackingState
propiedad y se establece en uno de los tres UnityEngine.XR.ARSubsystems.TrackingState
:
Limited
: indica que se está realizando un seguimiento del código QR, pero que hay información limitada disponible o de mala calidad.Tracking
: especifica que se está realizando un seguimiento completo del código QR.None
: indica que no se está realizando el seguimiento del código QR.
Para supervisar el estado de seguimiento de un código QR, suscríbase a y ARMarkerManager.markersChanged
recorra en iteración las ARMarker
colecciones de marcadores proporcionadas en los argumentos de evento pasados al controlador de eventos.
En el código siguiente se muestra cómo usar el ARMarkerManager.markersChanged
evento para recorrer en ARMarker
iteración los objetos para los códigos QR recién detectados y escribir su identificador de seguimiento en la ventana Depurar.
using System;
using Microsoft.MixedReality.OpenXR;
// ...
private void Awake()
{
m_arMarkerManager = GetComponent<ARMarkerManager>();
m_arMarkerManager.markersChanged += OnQRCodesChanged;
}
void OnQRCodesChanged(ARMarkersChangedEventArgs args)
{
foreach (ARMarker qrCode in args.added)
{
if (qrCode.trackingState == UnityEngine.XR.ARSubsystems.TrackingState.Tracking)
Debug.Log($"Fully tracked QR code with the ID {qrCode.trackableId} was added.");
}
}
Obtención de la versión de un código QR y el tipo de código QR
Para obtener la versión y el tipo de un código QR detectado:
- Llame a
ARMarker.GetQRCodeProperties()
, que devuelve unaQRCodeProperties
instancia de . - Acceda al campo
QRCodeProperties
en el valor devuelto para obtener el tipo del código QR. El valor esQRCodeType.QRCode
oQRCodeType.MicroQRCode
. - Acceda al campo del
QRCodeProperties.version
valor devuelto para obtener la versión del código QR. El valor oscila entre 1 y 40 si el tipo esQRCodeType.QRCode
y de 1 a 4 si el tipo esQRCodeType.MicroQRCode
.
Como alternativa, pase el identificador rastreable de un ARMarker
objeto para ARMarkerManager.GetQRCodeProperties(TrackableId)
obtener el tipo y la versión de un código QR.
Advertencia
Los códigos QR son el único tipo de marcador admitido actualmente, aunque la compatibilidad con otros tipos de marcador se puede agregar en futuras versiones. Si markerType
no ARMarkerType.QRCode
es , al llamar GetQRCodeProperties(TrackableId)
a System.InvalidOperationException
se produce . Considere la posibilidad de ajustar las llamadas a GetQRCodeProperties(TrackableId)
en bloques try-catch si esto podría causar problemas en la aplicación más adelante.
Lectura de datos QR
El ARMarker
componente se adjunta a cada GameObject
que ARMarkerManager
crea. ARMarker
proporciona dos métodos que devuelven datos de código QR:
GetDecodedString()
: este método obtiene la representación de cadena del código QR, como una dirección URL.GetRawData(Unity.Collections.Allocator allocator)
: este método devuelve el contenido del código QR como una matriz de bytes, lo que permite ajustar en detalle cómo se asigna la matriz. Use este método en rutas de acceso activas y otras situaciones en las que el rendimiento es crítico.
En el código siguiente se muestra el uso básico de GetDecodedString()
y GetRawData(Unity.Collections.Allocator allocator)
:
using System;
using Microsoft.MixedReality.OpenXR;
// ...
void OnQRCodesChanged(ARMarkersChangedEventArgs args)
{
foreach (ARMarker qrCode in args.added)
{
var text = qrCode.GetDecodedString();
Debug.Log($"QR code text: {text}");
var bytes = qrCode.GetRawData(Unity.Collections.Allocator.Temp);
Debug.Log($"QR code bytes: {bytes.Length}");
bytes.Dispose();
}
}
Obtención del tamaño, posición, rotación y centro del código QR
Un ARMarker
objeto proporciona el tamaño, la posición, la rotación y el centro del código QR que representa.
Para obtener el tamaño del código QR en metros, use la propiedad ARMarker.size
.
Utilice la ARMarker.transform
propiedad para obtener la posición de giro y espacio del mundo de la transformación del código QR y ARMarker.center
para las coordenadas 2D del código QR en relación con la transformación del código QR. La transformación se centra según si ARMarker.transformMode
(el modo de transformación) se establece TransformMode.MostStable
en (más estable, la parte superior izquierda del código QR) o TransformMode.Center
(centro, el centro geométrico del código QR).
Use el ARMarkerManager.defaultTransformMode
campo para establecer el modo ARMarkerManager
de transformación con el que se crean nuevos ARMarker
objetos. El campo se inicializa con el Default Transform Mode
campo se establece en en el Inspector de Unity como se muestra:
Como alternativa al uso ARMarker.transformMode
de , pase el identificador rastreable de un ARMarker
objeto para ARMarkerManager.SetTransformMode(TrackableId, TransformMode)
establecer su modo de transformación.
En el código siguiente se muestra cómo obtener el tamaño y el centro de un nuevo código QR, la posición y la rotación de su transformación, y la posición de transformación actualizada después de cambiar el modo de transformación.
using System;
using Microsoft.MixedReality.OpenXR;
// ...
void OnMarkersChanged(ARMarkersChangedEventArgs args)
{
Debug.Log($"Default transform mode is {ARMarkerManager.Instance.defaultTransformMode}./n");
if (e.added.Count > 0)
{
ARMarker qrCode = args.added[0];
Debug.Log($"Position: {qrCode.transform.position}");
Debug.Log($"Rotation: {qrCode.transform.rotation}");
Debug.Log($"Center: {qrCode.center}");
if (qrCode.transformMode == TransformMode.Center)
qrCode.transformMode = TransformMode.MostStable;
else
qrCode.transformMode = TransformMode.Center;
Debug.Log($"QR code's transform mode is now set to {qrCode.transformMode}. /n");
Debug.Log($"New position: {qrCode.transform.position}");
}
}
Escenario de ejemplo de marcador ar
El ejemplo proporcionado con el paquete del complemento OpenXR contiene una escena habilitada para código QR que proporciona un ejemplo de cómo ARMarkerManager
y ARMarker
se puede usar.
La escena se encuentra en Assets > ARMarker como se muestra:
Puede encontrar los scripts de C# usados en la escena en el repositorio de ejemplos de realidad mixta de OpenXR unity en GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts