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.
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:
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:
- Nyissa meg a Unity-projektet.
- Kattintson a Szerkesztés gombra a Unity-szerkesztő alkalmazásmenüjében.
- Nyissa meg a Project Settings > Playert, és válassza az UWP lapot az alábbi módon:
- Engedélyezze a WebCamet a Képességek listában.
- 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.
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.
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:
- A
GameObject
csatolvaARMarkerManager
.ARMarkerManager
kizárólag az észlelt QR-kódok létrehozásáért, frissítéséért és eltávolításáértGameObject
felelős. - Egy előfab csatolt.
ARMarker
ARMarkerManager
QR-kód észlelésekorGameObject
az előfab használatára van konfigurálva.
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:
- Hozzon létre egy új előfabot a projekthez.
- Adja hozzá az
ARMarker
összetevőt a Microsoft.MixedReality.OpenXR > ARMarker szkript > alatt található előfabhoz.
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 ARMarker
automatikusan 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:
- 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. - Adjon hozzá egy gyermek 3D-t
GameObject
, például egyetQuad
a jelölő tartalmáhozGameObject
. - Az előfab összetevőjében
ARMarkerScale
állítsa a jelölőméret-átalakítást a jelölőtartalomraGameObject
. A mező beállítása biztosítja, hogy a választott 3DGameObject
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:
- Helyezzen egy
GameObject
helyet a jelenetbe. - Adja hozzá az
ARMarkerManager
összetevőt aGameObject
Microsoft.MixedReality.OpenXR > ARMarkerManager szkript > alatt található összetevőhöz.
- Állítsa a
ARMarkerManager
Marker Prefab mezőt az előző szakaszban létrehozott előfabra. - Bontsa ki az Engedélyezett jelölőtípusok elemet, majd válasszon ki egy elemet, és állítsa QR Code-ra.
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.realtimeSinceStartup
hasonló.
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:
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)
Feljegyzés
A metódusparaméter allocator
eseté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.TrackingState
kö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:
- Hívás
ARMarker.GetQRCodeProperties()
, amely egy példánytQRCodeProperties
ad vissza. - 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 vagyQRCodeType.QRCode
QRCodeType.MicroQRCode
. - 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 azQRCodeType.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:
Másik lehetőségként ARMarker.transformMode
adja á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:
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