Sdílet prostřednictvím


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.

Sledovaný 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:

  1. Stáhněte a spusťte nástroj pro funkci hybridní reality.
  2. 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:

  1. Otevřete projekt Unity.
  2. V nabídce aplikace Editoru Unity klikněte na Upravit .
  3. Přejděte do Přehrávače nastavení > projektu a vyberte kartu UPW, jak je znázorněno:Nastavení karty UPW
  4. Povolte WebCam v seznamu schopností . Funkce webcamu povoleny
  5. 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í.

Dialogové okno Oprávnění fotoaparátu

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.

Rozšířené možnosti aplikace s povolenými oprávněními

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ým ARMarkerManager . ARMarkerManager zodpovídá výhradně za vytváření, aktualizaci a odebírání všech GameObject 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:

  1. Vytvořte pro svůj projekt nový prefab .
  2. Přidejte komponentu ARMarkerdo prefabu umístěného v části Script > Microsoft.MixedReality.OpenXR > ARMarker.
    Přidání komponenty 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í ARMarkerdo 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:

  1. 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.
  2. Přidejte podřízený 3D GameObjectobsah značky GameObject, například a Quad. Přidání 3D GameObjectu do prefab ARMarkeru
  3. V komponentě ARMarkerScale prefab nastavte transformaci měřítka značek na obsah GameObjectznačky . Nastavením tohoto pole zajistíte, že se 3D GameObject 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:

  1. Umístěte do své scény GameObject .
  2. Přidejte komponentu ARMarkerManager GameObjectdo složky Script > Microsoft.MixedReality.OpenXR > ARMarkerManager.
    Přidání komponenty ARMarkerManager
  3. Nastavte pole Prefab značky ARMarkerManager na předfab, který jste vytvořili v předchozí části. Sada polí prefab značky
  4. Rozbalte povolené typy značek a pak vyberte prvek a nastavte ho na KÓD QR. Povolený typ značky kódu QR

Sledování změn kódu QR

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

Poznámka:

GetRawData Pro parametr allocatormetody 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:

  1. Volání ARMarker.GetQRCodeProperties(), které vrátí QRCodeProperties instanci.
  2. Přejděte k poli QRCodeProperties ve návratové hodnotě a získejte typ kódu QR. Hodnota je buď QRCodeType.QRCode nebo QRCodeType.MicroQRCode.
  3. 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 je QRCodeType.QRCodetyp , a od 1 do 4, pokud je QRCodeType.MicroQRCodetyp .

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:

Výchozí pole inspektoru režimu transformace komponenty ARMarkerManager

Jako alternativu k použití ARMarker.transformModepř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: Umístění prostředku scény ARMarker

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

Viz také