QR-codes in Unity
HoloLens 2-headsets kunnen QR-codes bijhouden en detecteren die kunnen worden gebruikt om hologrammen en andere AR-functies te bieden. In dit artikel wordt u begeleid bij alles wat u moet weten om QR-codes te gaan gebruiken in uw Unity-app, waaronder:
- QR-codedetectie toevoegen aan uw Unity-app.
- Informatie over belangrijke concepten en Unity-onderdelen die u moet gebruiken.
- Biedt zelfstudies die betrekking hebben op het algemene gebruik van QR-code.
- Introduceert het ar-markeringsvoorbeeldscenario dat demonstreert van een scène met QR-code en voorbeeldscripts.
Voordat u verdergaat met dit artikel, raden we u aan het overzicht van QR-codes te doorlopen.
Uw Unity-project en -app configureren
Uw Unity-project en -app moeten correct worden ingesteld en geconfigureerd om de functionaliteit van QR-code in te schakelen. Hiervoor is het volgende vereist:
- OpenXR voor Windows Mixed Reality versie 113.2403.5001 of hoger.
Notitie
Dit wordt geleverd met het besturingssysteem en kan worden bijgewerkt via Windows Store. Houd er rekening mee dat gebruikers mogelijk eerdere versies hebben geïnstalleerd en dat hun apparaten niet kunnen werken met AR-markeringen zoals QR-codes totdat ze worden bijgewerkt naar versie 113.2403.5001 of hoger.
- Een project dat compatibel is met een ondersteunde versie van Unity:
- Unity 2022.3 LTS (aanbevolen)
- Unity 2021.3 LTS
- De Mixed Reality OpenXR-invoegtoepassing.
- Webcammogelijkheden ingeschakeld voor uw Unity-project.
- Cameramachtigingen verleend aan uw app.
In de volgende secties wordt uitgelegd hoe u uw Unity-project en -app configureert om QR-codedetectie in te schakelen.
De Mixed Reality OpenXR-invoegtoepassing downloaden
Het pakket mixed reality OpenXR-invoegtoepassingen bevat C#-API's die u kunt gebruiken voor toegang tot de functionaliteit van QR-code.
Het pakket importeren:
- Download en voer het Hulpprogramma voor mixed reality-functies uit.
- Installeer de OpenXR-invoegtoepassing.
Het Mixed Reality Feature Tool vereenvoudigt ook pakketbeheer en kan worden gebruikt om de Mixed Reality-functies te vinden, bij te werken en toe te voegen die uw app nodig heeft. Zie Welkom bij het Hulpprogramma voor mixed reality-functies voor gedetailleerde instructies over het gebruik van het hulpprogramma.
Mogelijkheden van WebCam inschakelen
Als u QR-codes wilt detecteren en bijhouden, moet voor uw Unity-project WebCam-mogelijkheden zijn ingeschakeld.
WebCam-mogelijkheden inschakelen:
- Open uw Unity-project.
- Klik op Bewerken in het app-menu van de Unity-editor.
- Ga naar Project Settings > Player en selecteer het TABBLAD UWP , zoals wordt weergegeven:
- Schakel WebCam in de lijst Mogelijkheden in.
- Projectinstellingen afsluiten.
WebCam-mogelijkheden zijn nu ingeschakeld voor uw Unity-app. Uw app moet echter nog steeds machtigingen krijgen om toegang te krijgen tot de camera van het apparaat.
Toegangsmachtigingen voor uw app-camera verlenen
Als de mogelijkheden van WebCam zijn ingeschakeld voor uw app, wordt in het dialoogvenster Machtigingen gebruikers gevraagd om uw app toegang te verlenen tot de camera van het apparaat.
Dit dialoogvenster wordt slechts één keer weergegeven voor gebruikers, meestal wanneer u een scène invoert met ondersteuning ARMarkerManager
voor QR-codemarkeringen ingeschakeld. Als cameratoegang wordt geweigerd, kunnen gebruikers naar Instellingen-apps > gaan en deze inschakelen via de geavanceerde opties van de app.
QR-codedetectie in een scène bouwen
Detectie van QR-code moet zijn ingebouwd in elke scène waarin u QR-codes wilt gebruiken. Hiervoor is het volgende vereist:
- Een
GameObject
metARMarkerManager
bijlage.ARMarkerManager
is uitsluitend verantwoordelijk voor het maken, bijwerken en verwijderen van alleGameObject
gedetecteerde QR-codes. - Een prefab met
ARMarker
bijgevoegd. ARMarkerManager
geconfigureerd voor het gebruik van de prefab bij het maken van eenGameObject
QR-code die wordt gedetecteerd.
Een prefab maken voor QR-codes
Als u QR-codes in uw scène wilt gebruiken, moet u een prefab maken voor QR-codes. ARMarkerManager
gebruikt deze prefab om een van waaruit een GameObject
QR-code wordt gedetecteerd te maken.
Een prefab maken voor QR-codes:
- Maak een nieuwe prefab voor uw project.
- Voeg het
ARMarker
onderdeel toe aan de prefab, onder Script > Microsoft.MixedReality.OpenXR > ARMarker.
U hebt nu een basisprefab om mee te werken. Waarschijnlijk wilt u dat uw app QR-codes vertegenwoordigt die in de omgeving worden gedetecteerd. In de volgende sectie wordt uitgelegd hoe u een visuele weergave voor QR-codes toevoegt.
Visuals toevoegen
In de vorige sectie wordt het onderdeel ook automatisch toegevoegd ARMarkerScale
aan ARMarker
de prefab. Dit onderdeel wordt gebruikt om de schaal van de visuele weergave van een QR-code aan zijn fysieke tegenhanger te koppelen.
Hiervoor doet u het volgende:
- Voeg een lege
GameObject
toe aan de prefab die u in de vorige sectie hebt gemaakt. Het vertegenwoordigt alle visuele markeringsinhoud. - Voeg een onderliggende 3D
GameObject
, zoals eenQuad
, toe aan de inhoud van de markeringGameObject
. - Stel in het onderdeel van
ARMarkerScale
de prefab markeringsschaaltransformatie in op de inhoud van de markeringGameObject
. Als u dit veld instelt, zorgt u ervoor dat de 3DGameObject
die u hebt gekozen, correct wordt geschaald om overeen te komen met echte QR-codes.
Toevoegen ARMarkerManager
aan een scène
ARMarkerManager
is uitsluitend verantwoordelijk voor het maken, bijwerken en verwijderen van alle GameObject
gedetecteerde QR-codes.
Ga als volgende te werk om aan uw scène toe te voegen ARMarkerManager
:
- Plaats een
GameObject
plek in je scène. - Voeg het
ARMarkerManager
onderdeel toe aan deGameObject
, onder Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
- Stel het
ARMarkerManager
veld Markeringsprefab in op de prefab die u in de vorige sectie hebt gemaakt. - Vouw Ingeschakelde markeringstypen uit en kies een element en stel dit in op QR-code.
Wijzigingen in QR-code bijhouden
ARMarkerManager
bevat de markersChanged
gebeurtenis, die abonnees biedt ARMarkersChangedEventArgs
. Gebruik deze gebeurtenisargumenten om bij te houden welke QR-codes worden toegevoegd aan of verwijderd uit detectie- of bijgewerkte posegegevens.
De volgende code laat zien hoe u zich abonneert op de ARMarkerManager.markersChanged
gebeurtenis, met behulp van de gebeurtenisargumenten om de ARMarker
objecten ARMarkerManager
te doorlopen, wordt verwerkt en naar Foutopsporing geschreven, ongeacht of deze worden toegevoegd, verwijderd of bijgewerkt.
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}");
}
}
De tijd ophalen waarop een QR-code voor het laatst is gedetecteerd
Gebruik de ARMarker.lastSeenTime
eigenschap om te bepalen wanneer het apparaat voor het laatst een gedetecteerde QR-code heeft bijgehouden en de hoeveelheid tijd, indien aanwezig, het bijhouden verloren gaat. De tijd wordt gemeten in het aantal seconden sinds Unity uw toepassing heeft gestart en vergelijkbaar is met UnityEngine.Time.realtimeSinceStartup
.
De traceerbare id van een QR-code gebruiken
QR-codes zijn traceerbare codes. Dit zijn alles wat een AR-apparaat kan detecteren en bijhouden in een fysieke omgeving. Trackables zijn afgeleid van het type ARTrackable<TSessionRelativeData, TTrackable>
dat een id, traceringsstatus, pose en andere gegevens biedt.
De traceerbare id voor een QR-code kan worden doorgegeven aan ARMarkerManager
methoden om de eigenschappen van de QR-code, onbewerkte bytegegevens en tekenreeksweergave op te halen en de transformatiemodus voor de QR-code in te stellen. Met deze methoden kunt u gegevens voor een QR-code ophalen zonder dat u een ARMarker
objectverwijzing hoeft in te houden.
U kunt de id van een QR-code doorgeven aan de volgende ARMarkerManager
methoden:
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)
Notitie
Voor de GetRawData
methodeparameter allocator
is het doorgeven Unity.Collections.Allocator.Temp
voldoende voor de meeste scenario's.
De traceringsstatus van een QR-code volgen
Omdat een ARMarker
eigenschap kan worden bijgehouden, wordt de trackingState
eigenschap overgenomen en ingesteld op een van de drie UnityEngine.XR.ARSubsystems.TrackingState
:
Limited
: Geeft aan dat de QR-code wordt bijgehouden, maar beperkte informatie beschikbaar is of van slechte kwaliteit is.Tracking
: Hiermee geeft u op dat de QR-code volledig wordt bijgehouden.None
: Geeft aan dat de QR-code niet wordt bijgehouden.
Als u de traceringsstatus voor een QR-code wilt controleren, abonneert u op de ARMarkerManager.markersChanged
ARMarker
markeringsverzamelingen die zijn opgegeven in de gebeurtenisargumenten die zijn doorgegeven aan uw gebeurtenis-handler.
De volgende code laat zien hoe u de ARMarkerManager.markersChanged
gebeurtenis gebruikt om objecten voor nieuw gedetecteerde QR-codes te doorlopen ARMarker
en hun traceerbare id naar het venster Foutopsporing te schrijven.
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.");
}
}
De versie en het QR-codetype van een QR-code ophalen
De versie en het type van een gedetecteerde QR-code ophalen:
- Aanroep
ARMarker.GetQRCodeProperties()
, die eenQRCodeProperties
exemplaar retourneert. - Open het veld
QRCodeProperties
in de retourwaarde om het type QR-code op te halen. De waarde is ofwelQRCodeType.QRCode
QRCodeType.MicroQRCode
. - Open het veld van
QRCodeProperties.version
de retourwaarde om de versie van de QR-code op te halen. De waarde varieert van 1 tot 40 als het type isQRCodeType.QRCode
en van 1 tot 4 als het type isQRCodeType.MicroQRCode
.
Als alternatief geeft u de traceerbare id van een ARMarker
object door om het type en de versie van een QR-code op te ARMarkerManager.GetQRCodeProperties(TrackableId)
halen.
Waarschuwing
QR-codes zijn het enige type markering dat momenteel wordt ondersteund, hoewel ondersteuning voor andere markeringstypen in toekomstige releases kan worden toegevoegd. Als markerType
dat niet ARMarkerType.QRCode
het is, wordt bellen GetQRCodeProperties(TrackableId)
gegooid System.InvalidOperationException
. Overweeg om aanroepen in try-catch-blokken te GetQRCodeProperties(TrackableId)
verpakken als dit later problemen in uw app kan veroorzaken.
QR-gegevens lezen
Het ARMarker
onderdeel wordt gekoppeld aan elk GameObject
onderdeel dat ARMarkerManager
wordt gemaakt. ARMarker
biedt twee methoden waarmee QR-codegegevens worden geretourneerd:
GetDecodedString()
: Deze methode haalt de tekenreeksweergave van de QR-code op, zoals een URL.GetRawData(Unity.Collections.Allocator allocator)
: Deze methode retourneert QR-code-inhoud als een bytematrix, waardoor nauwkeurig kan worden afgestemd op de manier waarop de matrix wordt toegewezen. Gebruik deze methode in dynamische paden en andere situaties waarin de prestaties essentieel zijn.
De volgende code demonstreert het basisgebruik van GetDecodedString()
en 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();
}
}
Qr-codegrootte, positie, draaiing en midden verkrijgen
Een ARMarker
object biedt de grootte, positie, rotatie en het midden van de QR-code die het voorstelt.
Gebruik de eigenschap ARMarker.size
om de grootte van de QR-code in meters te verkrijgen.
Gebruik de ARMarker.transform
eigenschap om de rotatie- en wereldruimtepositie van de transformatie van de QR-code en ARMarker.center
de 2D-coördinaten van de QR-code te verkrijgen ten opzichte van de transformatie van de QR-code. De transformatie zelf is gecentreerd op basis van of (de transformatiemodus) is ingesteld op TransformMode.MostStable
(meest stabiel, de QR-code linksboven) of TransformMode.Center
(midden, het geometrische midden van de QR-code).ARMarker.transformMode
Gebruik het ARMarkerManager.defaultTransformMode
veld om de transformatiemodus ARMarkerManager
in te stellen waarmee nieuwe ARMarker
objecten worden gemaakt. Het veld wordt geïnitialiseerd met het Default Transform Mode
veld is ingesteld op in de Unity Inspector, zoals wordt weergegeven:
Als alternatief voor het gebruik ARMarker.transformMode
, geeft u de traceerbare id van een ARMarker
object door om de transformatiemodus in te ARMarkerManager.SetTransformMode(TrackableId, TransformMode)
stellen.
De volgende code laat zien hoe u de grootte en het midden van een nieuwe QR-code krijgt, de positie en rotatie van de transformatie en de bijgewerkte transformatiepositie na het wijzigen van de transformatiemodus.
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}");
}
}
Voorbeeldscenario voor AR-markering
Het voorbeeld van het OpenXR-invoegtoepassingspakket bevat een scène met QR-code die een voorbeeld biedt van hoe ARMarkerManager
en ARMarker
kan worden gebruikt.
De scène bevindt zich in Assets > ARMarker , zoals wordt weergegeven:
U vindt de C#-scripts die in de scène worden gebruikt in de opslagplaats OpenXR Unity Mixed Reality Samples op GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts