Megosztás a következőn keresztül:


QR-kódok a Unityben

A HoloLens 2 headsetek nyomon követhetik és észlelhetik a hologramok és egyéb AR-funkciók biztosításához használható QR-kódokat. Ez a cikk végigvezeti a Unity-alkalmazás QR-kódok használatának megkezdéséhez szükséges tudnivalókon, többek között az alábbiakon:

  • QR-kódészlelés hozzáadása a Unity-alkalmazáshoz.
  • A fontos fogalmak és a használni kívánt Unity-összetevők megismerése.
  • Oktatóanyagokat tartalmaz, amelyek a QR-kód gyakori használatát ismertetik.
  • Bevezeti az AR Marker mintaforgatókönyvet , amely bemutatja a QR kódbarát jelenetét és példaszkripteit.

A cikk folytatása előtt javasoljuk, hogy tekintse át a QR-kódok áttekintését.

Nyomon követett QR-kód

A Unity-projekt és -alkalmazás konfigurálása

A Unity-projektet és -alkalmazást megfelelően kell beállítani és konfigurálni a QR-kód funkcióinak engedélyezéséhez, amelyhez az alábbiak szükségesek:

  • OpenXR a Windows Mixed Reality 113.2403.5001-es vagy újabb verziójához.

    Feljegyzés

    Ez az operációs rendszer része, és a Windows Áruházon keresztül frissíthető. Vegye figyelembe, hogy előfordulhat, hogy a felhasználók korábbi verziói vannak telepítve, és az eszközeik nem fognak tudni működni az AR-jelölőkkel, például a QR-kódokkal, amíg nem frissülnek a 113.2403.5001-es vagy újabb verzióra.

  • A Unity támogatott verziójával kompatibilis projekt:
    • Unity 2022.3 LTS (ajánlott)
    • Unity 2021.3 LTS
  • A Mixed Reality OpenXR beépülő modulja.
  • A Unity-projekthez engedélyezett webkamera-képességek.
  • Az alkalmazásnak biztosított kameraengedélyek.

Az alábbi szakaszok bemutatja, hogyan konfigurálhatja a Unity-projektet és -alkalmazást a QR-kódészlelés engedélyezéséhez.

A Mixed Reality OpenXR beépülő modul beszerzése

A Mixed Reality OpenXR beépülő modulcsomag C# API-kat tartalmaz, amelyek segítségével hozzáférhet a QR-kód funkcióihoz.

A csomag importálása:

  1. Töltse le és futtassa a Mixed Reality szolgáltatáseszközt.
  2. Telepítse az OpenXR beépülő modult.

A Mixed Reality szolgáltatáseszköz emellett leegyszerűsíti a csomagkezelést, és az alkalmazás által igényelt Mixed Reality-funkciók megkeresésére, frissítésére és hozzáadására is használható. Az eszköz használatáról részletes útmutatást a Vegyes valóság funkció eszköz üdvözli.

A WebCam képességeinek engedélyezése

A QR-kódok észleléséhez és nyomon követéséhez a Unity-projektnek engedélyeznie kell a WebCam képességeit.

A WebCam képességeinek engedélyezése:

  1. Nyissa meg a Unity-projektet.
  2. Kattintson a Szerkesztés gombra a Unity-szerkesztő alkalmazásmenüjében.
  3. Nyissa meg a Project Settings > Playert, és válassza az UWP lapot az alábbi módon:UWP tabulátor beállításai
  4. Engedélyezze a WebCamet a Képességek listában. A WebCam képességei engedélyezve
  5. Lépjen ki a projektbeállításokból.

A WebCam funkciói mostantól engedélyezve vannak a Unity-alkalmazáshoz. Az alkalmazásnak azonban továbbra is engedélyekkel kell rendelkeznie az eszköz kamerájának eléréséhez.

Alkalmazáskamera hozzáférési engedélyeinek megadása

Ha az alkalmazás webkamerás képességei engedélyezve vannak, az engedélyek párbeszédpanelen a felhasználók arra kérik a felhasználókat, hogy engedélyezzenek hozzáférést az alkalmazásnak az eszköz kamerájához.

Kameraengedélyek párbeszédpanel

Ez a párbeszédpanel csak egyszer jelenik meg a felhasználók számára, általában akkor, ha olyan jelenetet ad meg, amelyben engedélyezve van a ARMarkerManager QR-kódjelölő támogatása. Ha a kamera hozzáférése megtagadva van, a felhasználók az alkalmazás Speciális beállításain keresztül megnyithatják és engedélyezhetik a Beállítások > appot.

Alkalmazás speciális beállításai engedélyezett engedélyekkel

QR-kódészlelés készítése jelenetbe

A QR-kódészlelést minden olyan jelenetbe be kell építeni, amelyben QR-kódokat szeretne használni, amelyhez a következőre van szükség:

Előfab létrehozása QR-kódokhoz

Ha QR-kódokat szeretne használni a jelenetben, létre kell hoznia egy előfabot a QR-kódokhoz. ARMarkerManager Ezt az előtagot használja egy GameObject QR-kód észlelésekor.

QR-kódok előfabjának létrehozása:

  1. Hozzon létre egy új előfabot a projekthez.
  2. Adja hozzá az ARMarkerösszetevőt a Microsoft.MixedReality.OpenXR > ARMarker szkript > alatt található előfabhoz.
    Az ARMarker összetevő hozzáadása

Most már rendelkezik egy alapszintű előfabnal, amellyel dolgozhat. Valószínűleg azt szeretné, hogy az alkalmazás vizuálisan képviselje a környezetben észlelt QR-kódokat. A következő szakasz bemutatja, hogyan adhat hozzá vizuális reprezentációt a QR-kódokhoz.

Vizualizációk hozzáadása

Az előző szakaszban az előfabhoz való hozzáadás ARMarkerautomatikusan hozzáadta az összetevőt ARMarkerScale is. Ez az összetevő egy QR-kód vizuális ábrázolásának a fizikai megfelelőjéhez való skálázásához használható.

Ehhez tegye a következőket:

  1. Adjon hozzá egy üres GameObject fájlt az előző szakaszban létrehozott előfabhoz. Ez az összes vizuális jelölőtartalmat jelöli.
  2. Adjon hozzá egy gyermek 3D-t GameObject, például egyet Quada jelölő tartalmához GameObject. 3D GameObject hozzáadása az ARMarker előtagjához
  3. Az előfab összetevőjében ARMarkerScale állítsa a jelölőméret-átalakítást a jelölőtartalomra GameObject. A mező beállítása biztosítja, hogy a választott 3D GameObject megfelelően legyen skálázva a valós QR-kódoknak megfelelően.

Felvétel ARMarkerManager jelenetbe

ARMarkerManager kizárólag az észlelt QR-kódok létrehozásáért, frissítéséért és eltávolításáért GameObject felelős.

Felvétel ARMarkerManager a jelenetbe:

  1. Helyezzen egy GameObject helyet a jelenetbe.
  2. Adja hozzá az ARMarkerManager összetevőt a GameObjectMicrosoft.MixedReality.OpenXR > ARMarkerManager szkript > alatt található összetevőhöz.
    Az ARMarkerManager összetevő hozzáadása
  3. Állítsa a ARMarkerManager Marker Prefab mezőt az előző szakaszban létrehozott előfabra. Jelölő előfab mezőkészlete
  4. Bontsa ki az Engedélyezett jelölőtípusok elemet, majd válasszon ki egy elemet, és állítsa QR Code-ra. QR-kódjelölő típusa engedélyezve

A QR-kód változásainak nyomon követése

ARMarkerManager tartalmazza az eseményt markersChanged , amely az előfizetők számára biztosított ARMarkersChangedEventArgs . Ezekkel az eseményargumentumokkal nyomon követheti, hogy mely QR-kódok lettek hozzáadva vagy eltávolítva az észlelési vagy frissített pózadatokból.

Az alábbi kód bemutatja az ARMarkerManager.markersChanged eseményre való feliratkozást, és az eseményargumentumok használatával az objektumokon keresztüli ARMarker iterálást az objektumok ARMarkerManager kezelése és írása a hibakereséshez, függetlenül attól, hogy hozzáadják, eltávolítják vagy frissítik őket.

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}");
    }
}

QR-kód utolsó észlelésének időpontja

ARMarker.lastSeenTime A tulajdonság segítségével meghatározhatja, hogy az eszköz mikor követett utoljára észlelt QR-kódot, és hogy mennyi ideig , ha van ilyen, a nyomon követés elveszik. Az idő mérése másodpercben történik, mióta a Unity elindította az alkalmazást, és a következőhöz UnityEngine.Time.realtimeSinceStartuphasonló.

QR-kód nyomon követhető azonosítójának használata

A QR-kódok nyomon követhetők, ami minden, amit egy AR-eszköz képes észlelni és nyomon követni egy fizikai környezetben. A nyomon követhetők az azonosítót, nyomkövetési állapotot, pózt és egyéb adatokat biztosító típusból ARTrackable<TSessionRelativeData, TTrackable> származnak.

A QR-kód nyomon követhető azonosítója átadható ARMarkerManager a QR-kód tulajdonságainak, nyers bájtadatainak és sztring-ábrázolásának lekéréséhez, valamint a QR-kód átalakítási módjának beállításához. Ezek a módszerek lehetővé teszik egy QR-kód adatainak lekérését anélkül, hogy egy objektumhivatkozáshoz kellene ragaszkodnia ARMarker .

A QR-kód azonosítóját a következő ARMarkerManager metódusokba adhatja át:

Feljegyzés

A metódusparaméter allocatoresetében a GetRawData továbbítás Unity.Collections.Allocator.Temp a legtöbb forgatókönyv esetében elegendő.

QR-kód nyomkövetési állapotának követése

Mivel egy ARMarker nyomon követhető, örökli a trackingState tulajdonságot, és a három UnityEngine.XR.ARSubsystems.TrackingStateközül az egyikre van beállítva:

  • Limited: Azt jelzi, hogy a QR-kód nyomon követése folyamatban van, de korlátozott információ áll rendelkezésre, vagy gyenge minőségű.
  • Tracking: Azt adja meg, hogy a QR-kód teljes mértékben nyomon legyen követve.
  • None: Azt jelzi, hogy a QR-kód nincs nyomon követve.

Egy QR-kód nyomkövetési állapotának monitorozásához iratkozzon fel az ARMarkerManager.markersChanged eseménykezelőnek átadott eseményargumentumokban megadott jelölőgyűjteményekre, és iterálja ARMarker azokat.

Az alábbi kód bemutatja, hogy az ARMarkerManager.markersChanged esemény használatával iterálhat az újonnan észlelt QR-kódok objektumain, ARMarker és beírhatja a nyomon követhető azonosítójukat a Hibakeresési ablakba.

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.");
    }
}

QR-kód verziójának és QR-kódtípusának lekérése

Az észlelt QR-kód verziójának és típusának lekérése:

  1. Hívás ARMarker.GetQRCodeProperties(), amely egy példányt QRCodeProperties ad vissza.
  2. A QR-kód típusának lekéréséhez lépjen a visszatérési érték mezőjébe QRCodeProperties . Az érték vagy QRCodeType.QRCode QRCodeType.MicroQRCode.
  3. A QR-kód verziójának lekéréséhez lépjen a visszatérési érték QRCodeProperties.version mezőjébe. Az érték 1 és 40 közötti, ha a típus az QRCodeType.QRCode, és 1 és 4 között, ha a típus.QRCodeType.MicroQRCode

Másik lehetőségként adja át egy ARMarker objektum nyomon követhető azonosítóját ARMarkerManager.GetQRCodeProperties(TrackableId) a QR-kód típusának és verziójának lekéréséhez.

Figyelmeztetés

A QR-kódok jelenleg az egyetlen jelölőtípust támogatják, de a jövőbeli kiadásokban más jelölőtípusok támogatása is lehetséges. Ha markerType nem ARMarkerType.QRCode, a hívás GetQRCodeProperties(TrackableId) dob System.InvalidOperationException. Érdemes lehet sortöréses hívásokat kezdeményezni GetQRCodeProperties(TrackableId) a kipróbálási blokkokban, ha ez később problémákat okozhat az alkalmazásban.

QR-adatok olvasása

Az ARMarker összetevő minden GameObject létrehozott ARMarkerManager elemhez csatlakoztatva van. ARMarker két metódust biztosít, amelyek QR-kódadatokat ad vissza:

  • GetDecodedString(): Ez a módszer lekéri a QR-kód sztringképét, például egy URL-címet.

  • GetRawData(Unity.Collections.Allocator allocator): Ez a módszer bájttömbként adja vissza a QR-kód tartalmát, így finomhangolást tesz lehetővé a tömb lefoglalásának módjára. Használja ezt a módszert gyakori elérésű útvonalakon és más olyan helyzetekben, ahol a teljesítmény kritikus fontosságú.

Az alábbi kód bemutatja a GetDecodedString() következők alapszintű használatát: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-kód méretének, pozíciójának, elforgatásának és középértékének beszerzése

Az ARMarker objektumok az általa képviselt QR-kód méretét, pozícióját, elforgatását és középpontját biztosítják.

A QR-kód méterben való méretének lekéréséhez használja a tulajdonságot ARMarker.size.

ARMarker.transform A tulajdonság használatával lekérjük a QR-kód átalakításának forgási és világtéri pozícióját, valamint ARMarker.center a QR-kód 2D koordinátáit a QR-kód átalakításához képest. Maga az átalakítás attól függően van középre állítva, hogy (az átalakítás módja) a (legstabilabb, a QR-kód bal felső része) vagy TransformMode.Center (középen a QR-kód geometriai középpontja) van-e ARMarker.transformMode beállítva TransformMode.MostStable .

ARMarkerManager.defaultTransformMode A mező használatával állítsa be az átalakítási módotARMarkerManager, és ezzel új ARMarker objektumokat hoz létre. A mező inicializálva van, és a Default Transform Mode mező a Unity Inspectorben van beállítva az alábbi módon:

Az ARMarkerManager összetevő alapértelmezett átalakító mód felügyelője mezője

Másik lehetőségként ARMarker.transformModeadja át egy ARMarker objektum nyomon követhető azonosítóját az átalakítás módjának ARMarkerManager.SetTransformMode(TrackableId, TransformMode) beállításához.

Az alábbi kód bemutatja egy új QR-kód méretét és középpontját, az átalakítás pozícióját és forgását, valamint az átalakító mód módosítása után frissített átalakítási pozíciót.

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}");
    }
}

AR-jelölő mintaforgatókönyve

Az OpenXR beépülő modulcsomaghoz mellékelt minta egy QR-kódbarát jelenetet tartalmaz, amely egy példát mutat be a használat módjára ARMarkerManager és ARMarker használhatóságára.

A jelenet az Assets > ARMarkerben található az alábbi módon:ARMarker Scene Asset Location

A jelenetben használt C# szkripteket az OpenXR Unity Mixed Reality-minták adattárában találja a GitHubon: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts

Lásd még