Kódy QR v Unity
Náhlavní soupravy HoloLens 2 můžou sledovat a zjišťovat kódy QR, které je možné použít k poskytování hologramů a dalších funkcí ar. Tento článek vás provede vším, co potřebujete vědět, abyste mohli začít používat kódy QR v aplikaci Unity, včetně těchto:
- Přidání detekce kódu QR do aplikace Unity
- Pochopení důležitých konceptů a komponent Unity, které potřebujete použít.
- Poskytuje kurzy, které pokrývají běžné použití kódu QR.
- Představuje ukázkový scénář značky AR, který ukazuje scénu s podporou kódu QR a ukázkové skripty.
Než budete pokračovat v tomto článku, doporučujeme si projít přehled kódů QR.
Konfigurace projektu a aplikace Unity
Váš projekt a aplikace Unity musí být správně nastavené a nakonfigurované tak, aby povolovaly funkce kódu QR, což vyžaduje:
- OpenXR pro Windows Mixed Reality verze 113.2403.5001 nebo novější.
Poznámka:
Tento systém je součástí operačního systému a dá se aktualizovat prostřednictvím Windows Storu. Mějte na paměti, že uživatelé můžou mít nainstalované starší verze a jejich zařízení nebudou moct pracovat se značkami AR, jako jsou kódy QR, dokud se neaktualizuje na verzi 113.2403.5001 nebo novější.
- Projekt kompatibilní s podporovanou verzí Unity:
- Unity 2022.3 LTS (doporučeno)
- Unity 2021.3 LTS
- Modul plug-in Mixed Reality OpenXR.
- Funkce webové kamery povolené pro váš projekt Unity.
- Oprávnění fotoaparátu udělená vaší aplikaci
Následující části vás provedou konfigurací projektu a aplikace Unity tak, aby umožňovaly detekci kódu QR.
Získání modulu plug-in OpenXR hybridní reality
Balíček modulu plug-in Mixed Reality OpenXR obsahuje rozhraní API jazyka C#, která můžete použít pro přístup k funkcím kódu QR.
Import balíčku:
- Stáhněte a spusťte nástroj pro funkci hybridní reality.
- Nainstalujte modul plug-in OpenXR.
Nástroj pro funkce hybridní reality také zjednodušuje správu balíčků a dá se použít k vyhledání, aktualizaci a přidání funkcí hybridní reality, které vaše aplikace vyžaduje. Podrobné pokyny k používání nástroje najdete v tématu Vítá vás nástroj funkcí hybridní reality.
Povolení možností webcamu
Aby bylo možné rozpoznat a sledovat kódy QR, musí mít váš projekt Unity povolené funkce WebCam .
Povolení funkcí WebCam:
- Otevřete projekt Unity.
- V nabídce aplikace Editoru Unity klikněte na Upravit .
- Přejděte do Přehrávače nastavení > projektu a vyberte kartu UPW, jak je znázorněno:
- Povolte WebCam v seznamu schopností .
- Ukončete nastavení projektu.
Funkce WebCam jsou teď povolené pro vaši aplikaci Unity. Vaše aplikace ale musí mít pořád udělená oprávnění pro přístup k fotoaparátu zařízení.
Udělení oprávnění pro přístup k fotoaparátu aplikace
Pokud má vaše aplikace povolené funkce WebCam , dialogové okno oprávnění vyzve uživatele k udělení přístupu k fotoaparátu zařízení.
Toto dialogové okno se uživatelům zobrazí jenom jednou, obvykle při zadávání scény obsahující ARMarkerManager
podporu značky kódu QR povolenou. Pokud je přístup z fotoaparátu odepřen, můžou uživatelé přejít do Aplikace nastavení > a povolit ho prostřednictvím rozšířených možností aplikace.
Sestavení detekce kódu QR do scény
Detekce kódu QR musí být integrovaná do každé scény, ve které chcete používat kódy QR, což vyžaduje:
- A
GameObject
s připojenýmARMarkerManager
.ARMarkerManager
zodpovídá výhradně za vytváření, aktualizaci a odebírání všechGameObject
zjištěných kódů QR. - Prefab s připojeným objektem
ARMarker
. ARMarkerManager
nakonfigurováno tak, aby při vytvářeníGameObject
kódu QR používalo předfab.
Vytvoření předfab pro kódy QR
Pokud chcete ve scéně používat kódy QR, musíte vytvořit předfab pro kódy QR. ARMarkerManager
pomocí tohoto předfabu vytvoří kód GameObject
QR pokaždé, když se zjistí kód QR.
Vytvoření předfaktoru pro kódy QR:
- Vytvořte pro svůj projekt nový prefab .
- Přidejte komponentu
ARMarker
do prefabu umístěného v části Script > Microsoft.MixedReality.OpenXR > ARMarker.
Teď máte základní prefab, se kterým můžete pracovat. Pravděpodobně budete chtít, aby aplikace vizuálně reprezentovala kódy QR, které se v prostředí detekují. V další části se dozvíte, jak přidat vizuální reprezentaci kódů QR.
Přidání vizuálů
V předchozí části se přidání ARMarker
do prefabu také automaticky přidala komponenta ARMarkerScale
. Tato komponenta se používá ke spárování měřítka vizuální reprezentace kódu QR s jeho fyzickým protějškem.
Postup:
- Přidejte do předfabu, který jste vytvořili v předchozí části, prázdný
GameObject
. Bude reprezentovat veškerý obsah vizuální značky. - Přidejte podřízený 3D
GameObject
obsah značkyGameObject
, například aQuad
. - V komponentě
ARMarkerScale
prefab nastavte transformaci měřítka značek na obsahGameObject
značky . Nastavením tohoto pole zajistíte, že se 3DGameObject
zvolené kódy QR správně škáluje tak, aby odpovídaly skutečným kódům QR.
Přidání ARMarkerManager
do scény
ARMarkerManager
zodpovídá výhradně za vytváření, aktualizaci a odebírání všech GameObject
zjištěných kódů QR.
ARMarkerManager
Přidání do scény:
- Umístěte do své scény
GameObject
. - Přidejte komponentu
ARMarkerManager
GameObject
do složky Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
- Nastavte pole Prefab značky
ARMarkerManager
na předfab, který jste vytvořili v předchozí části. - Rozbalte povolené typy značek a pak vyberte prvek a nastavte ho na KÓD QR.
Sledování změn kódu QR
ARMarkerManager
markersChanged
obsahuje událost, která poskytuje ARMarkersChangedEventArgs
odběratelům. Pomocí těchto argumentů události můžete sledovat, které kódy QR se přidají nebo odeberou z detekce nebo aktualizovaného zobrazení dat.
Následující kód ukazuje přihlášení k odběru ARMarkerManager.markersChanged
události, použití jejích argumentů události k iteraci prostřednictvím ARMarker
objektů ARMarkerManager
zpracovává a zapisuje do ladění bez ohledu na to, zda jsou přidány, odebrány nebo aktualizovány.
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}");
}
}
Získání času posledního zjištění kódu QR
ARMarker.lastSeenTime
Pomocí vlastnosti můžete určit, kdy se zařízení naposledy sledovalo zjištěný kód QR a kolik času se sledování ztratí. Čas se měří v počtu sekund od spuštění aplikace Unity a je podobný UnityEngine.Time.realtimeSinceStartup
.
Použití trackovatelného ID kódu QR
Kódy QR jsou sledovatelné, což jsou všechno, co zařízení AR dokáže detekovat a sledovat ve fyzickém prostředí. Sledovatelné položky jsou odvozeny od typu ARTrackable<TSessionRelativeData, TTrackable>
, který poskytuje ID, stav sledování, zobrazení a další data.
Sledovatelné ID kódu QR lze předat do ARMarkerManager
metod, jak získat vlastnosti kódu QR, nezpracovaná bajtová data a řetězcové vyjádření a nastavit režim transformace kódu QR. Tyto metody umožňují načíst data pro kód QR, aniž byste museli držet odkaz na ARMarker
objekt.
ID kódu QR můžete předat do následujících ARMarkerManager
metod:
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)
Poznámka:
GetRawData
Pro parametr allocator
metody je předávání Unity.Collections.Allocator.Temp
dostatečné pro většinu scénářů.
Sledování stavu sledování kódu QR
ARMarker
Vzhledem k tomu, že je možné sledovat, dědí trackingState
vlastnost a je nastavena na jednu ze tříUnityEngine.XR.ARSubsystems.TrackingState
:
Limited
: Označuje, že kód QR je sledován, ale omezené informace jsou k dispozici nebo mají nízkou kvalitu.Tracking
: Určuje, že kód QR je plně sledován.None
: Označuje, že kód QR se nesleduje.
Pokud chcete monitorovat stav sledování kódu QR, přihlaste se k odběru ARMarkerManager.markersChanged
a iterujte ARMarker
kolekcemi značek zadanými v argumentech události předaných obslužné rutině události.
Následující kód ukazuje použití ARMarkerManager.markersChanged
události iterace objektů ARMarker
pro nově zjištěné kódy QR a zápis jejich trackable ID do okna Ladění.
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.");
}
}
Získání verze kódu QR a typu kódu QR
Získání verze a typu zjištěného kódu QR:
- Volání
ARMarker.GetQRCodeProperties()
, které vrátíQRCodeProperties
instanci. - Přejděte k poli
QRCodeProperties
ve návratové hodnotě a získejte typ kódu QR. Hodnota je buďQRCodeType.QRCode
neboQRCodeType.MicroQRCode
. - Pokud chcete získat verzi kódu QR, získejte přístup k poli návratové
QRCodeProperties.version
hodnoty. Hodnota se pohybuje od 1 do 40, pokud jeQRCodeType.QRCode
typ , a od 1 do 4, pokud jeQRCodeType.MicroQRCode
typ .
Jako alternativu předejte ARMarker
sledované ID objektu, abyste ARMarkerManager.GetQRCodeProperties(TrackableId)
získali typ a verzi kódu QR.
Upozorňující
Kódy QR jsou jediným typem značky, který se v současné době podporuje, i když je možné v budoucích verzích přidat podporu jiných typů značek. Pokud markerType
není ARMarkerType.QRCode
, volání vyvolá System.InvalidOperationException
.GetQRCodeProperties(TrackableId)
Zvažte zabalení volání do GetQRCodeProperties(TrackableId)
bloků try-catch, pokud by to mohlo způsobit problémy v aplikaci později.
Čtení dat QR
Komponenta ARMarker
je připojena ke každému GameObject
, který ARMarkerManager
vytvoří. ARMarker
poskytuje dvě metody, které vracejí data kódu QR:
GetDecodedString()
: Tato metoda získá řetězcovou reprezentaci kódu QR, například adresu URL.GetRawData(Unity.Collections.Allocator allocator)
: Tato metoda vrátí obsah kódu QR jako bajtové pole, což umožňuje jemně odstupňované ladění způsobu přidělování pole. Tuto metodu použijte v horkých cestách a dalších situacích, kdy je kritický výkon.
Následující kód ukazuje základní použití GetDecodedString()
a 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();
}
}
Získání velikosti kódu QR, pozice, otočení a středu
Objekt ARMarker
poskytuje velikost, pozici, otočení a střed kódu QR, který představuje.
K získání velikosti kódu QR v metrech použijte vlastnost ARMarker.size
.
ARMarker.transform
Tato vlastnost slouží k získání pozice rotace a světového prostoru transformace kódu QR a ARMarker.center
ke 2D souřadnicím kódu QR vzhledem k transformaci kódu QR. Samotná transformace se zacentruje podle toho, zda ARMarker.transformMode
je ( režim transformace) nastaven na TransformMode.MostStable
(nejstabilnější, levý horní okraj kódu QR) nebo TransformMode.Center
(na střed, geometrický střed kódu QR).
ARMarkerManager.defaultTransformMode
Pomocí pole nastavte režim ARMarkerManager
transformace vytváří nové ARMarker
objekty s. Pole se inicializuje s polem Default Transform Mode
, které je nastavené v Inspektoru Unity, jak je znázorněno na obrázku:
Jako alternativu k použití ARMarker.transformMode
předejte ARMarker
sledované ID objektu k ARMarkerManager.SetTransformMode(TrackableId, TransformMode)
nastavení režimu transformace.
Následující kód ukazuje získání nové velikosti a středu kódu QR, umístění a otočení transformace a aktualizované pozice transformace po změně režimu transformace.
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}");
}
}
Ukázkový scénář značky AR
Ukázka poskytovaná balíčkem modulu plug-in OpenXR obsahuje scénu s povoleným kódem QR, která poskytuje příklad a ARMarkerManager
ARMarker
jak se dá použít.
Scéna se nachází v Assets > ARMarker , jak je znázorněno:
Skripty jazyka C# použité ve scéně najdete v úložišti ukázek hybridní reality OpenXR Unity na GitHubu: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts