Compartir a través de


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.

Código QR con seguimiento

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:

  1. Descargue y ejecute la herramienta de características de Mixed Reality.
  2. 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 :

  1. Abra el proyecto de Unity.
  2. Haga clic en Editar en el menú de la aplicación del editor de Unity.
  3. Ve a Project Settings Player (Reproductor de configuración del > proyecto) y selecciona la pestaña UWP como se muestra:Configuración de la pestaña UWP
  4. Habilite WebCam en la lista Funcionalidades . Funcionalidades de WebCam habilitadas
  5. 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.

Cuadro de diálogo Permisos de cámara

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.

Opciones avanzadas de la aplicación con permisos habilitados

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 con ARMarkerManager adjunto. ARMarkerManager es el único responsable de crear, actualizar y quitar cada uno de los GameObject códigos QR detectados.
  • Un objeto prefabricado con ARMarker adjunto.
  • ARMarkerManager configurado para usar el objeto prefabricado al crear un GameObject 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:

  1. Cree un nuevo objeto prefabricado para el proyecto.
  2. Agregue el ARMarkercomponente al objeto prefabricado, ubicado en Script > Microsoft.MixedReality.OpenXR > ARMarker.
    Adición del componente 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 ARMarkeral 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:

  1. Agregue un vacío al objeto prefabricado GameObject que creó en la sección anterior. Representará todo el contenido del marcador visual.
  2. Agregue un 3D GameObjectsecundario , como , Quadal contenido GameObjectdel marcador . Agregar gameObject 3D al objeto prefabricado ARMarker
  3. En el componente del ARMarkerScale objeto prefabricado, establezca Transformación de escala de marcador en el contenido GameObjectdel marcador . Establecer este campo garantiza que el 3D GameObject 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:

  1. Coloque un GameObject elemento en la escena.
  2. Agregue el ARMarkerManager componente a , GameObjectubicado en Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
    Adición del componente ARMarkerManager
  3. Establezca el ARMarkerManager campo Marcador prefabricado en el objeto prefabricado que creó en la sección anterior. Conjunto de campos prefabricados de marcador
  4. Expanda Enabled Marker Types (Tipos de marcador habilitados), elija un elemento y establézcalo en CÓDIGO QR. Tipo de marcador de código QR habilitado

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 :

Nota:

Para el parámetro allocatordel 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:

  1. Llame a ARMarker.GetQRCodeProperties(), que devuelve una QRCodeProperties instancia de .
  2. Acceda al campo QRCodeProperties en el valor devuelto para obtener el tipo del código QR. El valor es QRCodeType.QRCode o QRCodeType.MicroQRCode.
  3. 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 es QRCodeType.QRCodey de 1 a 4 si el tipo es QRCodeType.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.QRCodees , al llamar GetQRCodeProperties(TrackableId) a System.InvalidOperationExceptionse 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:

Campo Inspector de modo de transformación predeterminado del componente ARMarkerManager

Como alternativa al uso ARMarker.transformModede , 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: ARMarker Scene Asset Location

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

Consulte también