Códigos QR em Unity
Os fones de ouvido HoloLens 2 podem rastrear e detetar códigos QR que podem ser usados para fornecer hologramas e outros recursos de RA. Este artigo orienta você através de tudo o que você precisa saber para começar a usar códigos QR em seu aplicativo Unity, incluindo:
- Adicionar deteção de código QR ao seu aplicativo Unity.
- Compreender conceitos importantes e componentes Unity que você precisa usar.
- Fornece tutoriais que abrangem o uso comum de código QR.
- Apresenta o cenário de exemplo do marcador de RA que demonstra uma cena habilitada para código QR e scripts de exemplo.
Antes de continuar com este artigo, recomendamos passar pela visão geral dos códigos QR.
Configurando seu projeto e aplicativo Unity
Seu projeto e aplicativo Unity devem ser configurados e configurados corretamente para habilitar a funcionalidade de código QR, que exige:
- OpenXR para Windows Mixed Reality versão 113.2403.5001 ou posterior.
Nota
Isso vem com o sistema operacional e pode ser atualizado através da Windows Store. Por favor, esteja ciente de que os usuários podem ter versões anteriores instaladas, e seus dispositivos não poderão trabalhar com marcadores de RA, como códigos QR, até a atualização para a versão 113.2403.5001 ou posterior.
- Um projeto compatível com uma versão suportada do Unity:
- Unity 2022.3 LTS (Recomendado)
- Unidade 2021.3 LTS
- O Plugin OpenXR de Realidade Mista.
- Recursos de webcam habilitados para seu projeto Unity.
- Permissões de câmera concedidas ao seu aplicativo.
As seções a seguir guiam você por como configurar seu projeto e aplicativo Unity para habilitar a deteção de código QR.
Obtendo o plug-in OpenXR de realidade mista
O pacote Mixed Reality OpenXR Plugin contém APIs C# que você pode usar para acessar a funcionalidade de código QR.
Para importar o pacote:
A Ferramenta de Recursos de Realidade Mista também simplifica o gerenciamento de pacotes e pode ser usada para localizar, atualizar e adicionar os recursos de Realidade Mista que seu aplicativo exige. Consulte Bem-vindo à Ferramenta de Recursos de Realidade Mista para obter instruções detalhadas sobre como usar a ferramenta.
Ativando os recursos da WebCam
Para detetar e rastrear códigos QR, seu projeto Unity precisa ter os recursos da WebCam ativados.
Para ativar as capacidades da WebCam :
- Abra seu projeto Unity.
- Clique em Editar no menu do aplicativo do editor Unity.
- Vá para Project Settings > Player e selecione a guia UWP conforme mostrado:
- Habilite a WebCam na lista Recursos.
- Saia das Configurações do projeto.
Os recursos da WebCam agora estão habilitados para seu aplicativo Unity. No entanto, seu aplicativo ainda deve receber permissões para acessar a câmera do dispositivo.
Conceder permissões de acesso à câmara da aplicação
Se o seu aplicativo tiver os recursos da WebCam habilitados, a caixa de diálogo de permissões solicitará que os usuários concedam ao seu aplicativo acesso à câmera do dispositivo.
Esta caixa de diálogo é mostrada aos usuários apenas uma vez, normalmente ao entrar em uma cena contendo um ARMarkerManager
com o suporte a marcadores de código QR ativado. Se o acesso à câmara for negado, os utilizadores podem aceder às Aplicações de Definições > e ativá-lo através das Opções Avançadas da aplicação.
Construindo a deteção de código QR em uma cena
A deteção de código QR deve ser incorporada em todas as cenas em que você deseja usar códigos QR, o que exige:
- A
GameObject
comARMarkerManager
anexo.ARMarkerManager
é o único responsável por criar, atualizar e remover todos osGameObject
códigos QR detetados. - Um pré-fabricado com
ARMarker
anexo. ARMarkerManager
configurado para usar o pré-fabricado ao criar umGameObject
quando um código QR é detetado.
Criação de um pré-fabricado para códigos QR
Para usar códigos QR em sua cena, você precisa criar um pré-fabricado para códigos QR. ARMarkerManager
usa este pré-fabricado para criar um GameObject
a partir de sempre que um código QR é detetado.
Para fazer um pré-fabricado para códigos QR:
- Crie um novo pré-fabricado para o seu projeto.
- Adicione o
ARMarker
componente ao pré-fabricado, localizado em Script > Microsoft.MixedReality.OpenXR > ARMarker.
Agora você tem um pré-fabricado básico para trabalhar. Você provavelmente deseja que seu aplicativo represente visualmente códigos QR que são detetados no ambiente. A próxima seção orienta você sobre como adicionar uma representação visual para códigos QR.
Adicionando elementos visuais
Na seção anterior, adicionar ARMarker
ao pré-fabricado também adicionou automaticamente o ARMarkerScale
componente. Este componente é usado para fazer corresponder a escala da representação visual de um código QR à sua contraparte física.
Para tal:
- Adicione um vazio
GameObject
ao pré-fabricado que você criou na seção anterior. Ele representará todo o conteúdo do marcador visual. - Adicione um 3D
GameObject
filho , como umQuad
, ao conteúdoGameObject
do marcador . - No componente pré-fabricado
ARMarkerScale
, defina Marker Scale Transform como o conteúdoGameObject
do marcador. Definir este campo garante que o 3DGameObject
escolhido seja dimensionado corretamente para corresponder aos códigos QR do mundo real.
Adicionando ARMarkerManager
a uma cena
ARMarkerManager
é o único responsável por criar, atualizar e remover todos os GameObject
códigos QR detetados.
Para adicionar ARMarkerManager
à sua cena:
- Coloque um
GameObject
em sua cena. - Adicione o
ARMarkerManager
componente aoGameObject
, localizado em Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
- Defina o
ARMarkerManager
campo Marcador pré-fabricado como o pré-fabricado criado na seção anterior. - Expanda Tipos de marcadores habilitados, escolha um elemento e defina-o como QR Code.
Acompanhar as alterações do código QR
ARMarkerManager
contém o markersChanged
evento, que fornece ARMarkersChangedEventArgs
aos assinantes. Use esses argumentos de evento para rastrear quais códigos QR são adicionados ou removidos da deteção ou dados de pose atualizados.
O código a seguir demonstra a assinatura do ARMarkerManager.markersChanged
evento, usando seus argumentos de evento para iterar através dos ARMarker
objetos ARMarkerManager
é manipular e gravar em Depurar se eles são adicionados, removidos ou atualizados.
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}");
}
}
Obter a hora em que um código QR foi detetado pela última vez
Use a ARMarker.lastSeenTime
propriedade para determinar quando o dispositivo rastreou pela última vez um código QR detetado e a quantidade de tempo, se houver, o rastreamento é perdido. O tempo é medido no número de segundos desde que Unity iniciou seu aplicativo e é análogo ao UnityEngine.Time.realtimeSinceStartup
.
Usando o ID rastreável de um código QR
Os códigos QR são rastreáveis, que são qualquer coisa que um dispositivo de RA pode detetar e rastrear em um ambiente físico. Os rastreáveis derivam do tipo ARTrackable<TSessionRelativeData, TTrackable>
que fornece um ID, estado de rastreamento, pose e outros dados.
O ID rastreável para um código QR pode ser passado para ARMarkerManager
métodos para obter as propriedades do código QR, dados brutos de bytes e representação de cadeia de caracteres, e para definir o modo de transformação para o código QR. Esses métodos permitem que você recupere dados para um código QR sem ter que segurar uma referência de ARMarker
objeto.
Você pode passar o ID de um código QR para os seguintes ARMarkerManager
métodos:
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 o parâmetro allocator
method , a passagem Unity.Collections.Allocator.Temp
é suficiente para a GetRawData
maioria dos cenários.
Seguindo o estado de rastreamento de um código QR
Como um ARMarker
é rastreável, ele herda a trackingState
propriedade e é definido como um dos três UnityEngine.XR.ARSubsystems.TrackingState
:
Limited
: Indica que o código QR está a ser rastreado, mas que a informação está disponível ou é de má qualidade.Tracking
: Especifica que o código QR está sendo totalmente rastreado.None
: Indica que o código QR não está sendo rastreado.
Para monitorar o estado de rastreamento de um código QR, assine e ARMarkerManager.markersChanged
itere através das ARMarker
coleções de marcadores fornecidas nos argumentos de evento passados para seu manipulador de eventos.
O código a seguir demonstra o uso do ARMarkerManager.markersChanged
evento para iterar através de ARMarker
objetos para códigos QR recém-detectados e gravar seu ID rastreável na janela 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.");
}
}
Obter a versão de um código QR e o tipo de código QR
Para obter a versão e o tipo de um código QR detetado:
- Call
ARMarker.GetQRCodeProperties()
, que retorna umaQRCodeProperties
instância. - Acesse o campo
QRCodeProperties
no valor de retorno para obter o tipo de código QR. O valor é ouQRCodeType.QRCode
QRCodeType.MicroQRCode
. - Acesse o campo do valor de
QRCodeProperties.version
retorno para obter a versão do código QR. O valor varia de 1 a 40 se o tipo forQRCodeType.QRCode
, e de 1 a 4 se o tipo forQRCodeType.MicroQRCode
.
Como alternativa, passe o ID rastreável de um ARMarker
objeto para ARMarkerManager.GetQRCodeProperties(TrackableId)
obter o tipo e a versão de um código QR.
Aviso
Os códigos QR são o único tipo de marcador atualmente suportado, embora o suporte para outros tipos de marcadores possa ser adicionado em versões futuras. Se markerType
não ARMarkerType.QRCode
for, a chamada GetQRCodeProperties(TrackableId)
lança.System.InvalidOperationException
Considere envolver chamadas em GetQRCodeProperties(TrackableId)
blocos try-catch se isso puder causar problemas em seu aplicativo mais tarde.
Leitura de dados QR
O ARMarker
componente é anexado a tudo GameObject
o que ARMarkerManager
cria. ARMarker
fornece dois métodos que retornam dados de código QR:
GetDecodedString()
: Este método obtém a representação de cadeia de caracteres do código QR, como uma URL.GetRawData(Unity.Collections.Allocator allocator)
: Este método retorna o conteúdo do código QR como uma matriz de bytes, permitindo um ajuste fino em como a matriz é alocada. Use esse método em hot paths e outras situações em que o desempenho é crítico.
O código a seguir demonstra o uso básico de GetDecodedString()
e 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();
}
}
Obtenção do tamanho, posição, rotação e centro do código QR
Um ARMarker
objeto fornece o tamanho, posição, rotação e centro do código QR que ele representa.
Para obter o tamanho do código QR em metros, use o imóvel ARMarker.size
.
Use a ARMarker.transform
propriedade para obter a rotação e a posição do espaço mundial da transformação do código QR e ARMarker.center
as coordenadas 2D do código QR em relação à transformação do código QR. A transformação em si é centralizada de acordo com se ARMarker.transformMode
(o modo de transformação) está definido como TransformMode.MostStable
(mais estável, o canto superior esquerdo do código QR) ou TransformMode.Center
(centro, o centro geométrico do código QR).
Use o ARMarkerManager.defaultTransformMode
campo para definir o modo ARMarkerManager
de transformação cria novos ARMarker
objetos com. O campo é inicializado com o Default Transform Mode
campo definido como no Unity Inspetor, conforme mostrado:
Como alternativa ao uso ARMarker.transformMode
do , passe a ID rastreável de um ARMarker
objeto para ARMarkerManager.SetTransformMode(TrackableId, TransformMode)
definir seu modo de transformação.
O código a seguir demonstra como obter o tamanho e o centro de um novo código QR, a posição e a rotação de sua transformação e a posição de transformação atualizada depois de alterar o modo de transformação.
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}");
}
}
Cenário de exemplo de marcador de RA
O exemplo fornecido com o pacote OpenXR Plugin contém uma cena habilitada para código QR que fornece um exemplo de como ARMarkerManager
e ARMarker
pode ser usado.
A cena está localizada em Assets > ARMarker como mostrado:
Você pode encontrar os scripts C# usados na cena no repositório OpenXR Unity Mixed Reality Samples no GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts