Delen via


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.

Bijgehouden QR-code

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:

  1. Download en voer het Hulpprogramma voor mixed reality-functies uit.
  2. 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:

  1. Open uw Unity-project.
  2. Klik op Bewerken in het app-menu van de Unity-editor.
  3. Ga naar Project Settings > Player en selecteer het TABBLAD UWP , zoals wordt weergegeven: Instellingen voor UWP-tabblad
  4. Schakel WebCam in de lijst Mogelijkheden in. WebCam-mogelijkheden ingeschakeld
  5. 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.

Dialoogvenster Cameramachtigingen

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.

Geavanceerde opties voor apps waarvoor machtigingen zijn ingeschakeld

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 met ARMarkerManager bijlage. ARMarkerManager is uitsluitend verantwoordelijk voor het maken, bijwerken en verwijderen van alle GameObject gedetecteerde QR-codes.
  • Een prefab met ARMarker bijgevoegd.
  • ARMarkerManager geconfigureerd voor het gebruik van de prefab bij het maken van een GameObject 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:

  1. Maak een nieuwe prefab voor uw project.
  2. Voeg het ARMarkeronderdeel toe aan de prefab, onder Script > Microsoft.MixedReality.OpenXR > ARMarker.
    Het ARMarker-onderdeel toevoegen

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 ARMarkerde 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:

  1. Voeg een lege GameObject toe aan de prefab die u in de vorige sectie hebt gemaakt. Het vertegenwoordigt alle visuele markeringsinhoud.
  2. Voeg een onderliggende 3D GameObject, zoals een Quad, toe aan de inhoud van de markering GameObject. 3D GameObject toevoegen aan ARMarker prefab
  3. 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 3D GameObject 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 :

  1. Plaats een GameObject plek in je scène.
  2. Voeg het ARMarkerManager onderdeel toe aan de GameObject, onder Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
    Het ARMarkerManager-onderdeel toevoegen
  3. Stel het ARMarkerManager veld Markeringsprefab in op de prefab die u in de vorige sectie hebt gemaakt. Veldset Markeringsprefab
  4. Vouw Ingeschakelde markeringstypen uit en kies een element en stel dit in op QR-code. Type QR-codemarkering ingeschakeld

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:

Notitie

Voor de GetRawData methodeparameter allocatoris 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:

  1. Aanroep ARMarker.GetQRCodeProperties(), die een QRCodeProperties exemplaar retourneert.
  2. Open het veld QRCodeProperties in de retourwaarde om het type QR-code op te halen. De waarde is ofwel QRCodeType.QRCode QRCodeType.MicroQRCode.
  3. 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 is QRCodeType.QRCodeen van 1 tot 4 als het type is QRCodeType.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.QRCodehet 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.sizeom 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:

Het veld Standaardtransformatiemoduscontrole van het ONDERDEEL ARMarkerManager

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: Locatie van ARMarker-scèneasset

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

Zie ook