Udostępnij za pośrednictwem


Kody QR w aucie Unity

Zestawy nagłowne HoloLens 2 mogą śledzić i wykrywać kody QR, których można użyć do dostarczania hologramów i innych funkcji AR. W tym artykule opisano wszystko, co musisz wiedzieć, aby rozpocząć korzystanie z kodów QR w aplikacji aparatu Unity, w tym:

  • Dodawanie wykrywania kodu QR do aplikacji Aparatu Unity.
  • Zrozumienie ważnych pojęć i składników aparatu Unity, których należy użyć.
  • Zawiera samouczki, które obejmują typowe użycie kodu QR.
  • Przedstawia przykładowy scenariusz znaczników AR, który pokazuje scenę z obsługą kodu QR i przykładowe skrypty.

Przed kontynuowaniem pracy z tym artykułem zalecamy zapoznanie się z omówieniem kodów QR.

Śledzony kod QR

Konfigurowanie projektu i aplikacji aparatu Unity

Aby włączyć funkcję kodu QR, należy skonfigurować i skonfigurować projekt aparatu Unity i aplikację, co wymaga:

  • OpenXR dla windows Mixed Reality w wersji 113.2403.5001 lub nowszej.

    Uwaga

    Jest on dostarczany z systemem operacyjnym i można go zaktualizować za pośrednictwem Sklepu Windows. Należy pamiętać, że użytkownicy mogą mieć zainstalowane wcześniejsze wersje, a ich urządzenia nie będą mogły pracować ze znacznikami AR, takimi jak kody QR, dopóki nie zostaną zaktualizowane do wersji 113.2403.5001 lub nowszej.

  • Projekt zgodny z obsługiwaną wersją aparatu Unity:
    • Unity 2022.3 LTS (zalecane)
    • Unity 2021.3 LTS
  • Wtyczka OpenXR rzeczywistości mieszanej.
  • Funkcje kamery internetowej włączone dla projektu aparatu Unity.
  • Uprawnienia aparatu przyznane aplikacji.

W poniższych sekcjach opisano sposób konfigurowania projektu aparatu Unity i aplikacji w celu włączenia wykrywania kodu QR.

Pobieranie wtyczki OpenXR rzeczywistości mieszanej

Pakiet wtyczki OpenXR rzeczywistości mieszanej zawiera interfejsy API języka C#, których można użyć do uzyskiwania dostępu do funkcji kodu QR.

Aby zaimportować pakiet:

  1. Pobierz i uruchom narzędzie funkcji rzeczywistości mieszanej.
  2. Zainstaluj wtyczkę OpenXR.

Narzędzie funkcji rzeczywistości mieszanej upraszcza również zarządzanie pakietami i może służyć do znajdowania, aktualizowania i dodawania funkcji rzeczywistości mieszanej, których wymaga aplikacja. Aby uzyskać szczegółowe instrukcje dotyczące korzystania z narzędzia, zobacz Welcome to the Mixed Reality Feature Tool (Witamy w narzędziu funkcji rzeczywistości mieszanej).

Włączanie możliwości aplikacji WebCam

Aby wykrywać i śledzić kody QR, projekt aparatu Unity musi mieć włączone funkcje WebCam .

Aby włączyć funkcje webcam :

  1. Otwórz projekt aparatu Unity.
  2. Kliknij pozycję Edytuj w menu aplikacji edytora aparatu Unity.
  3. Przejdź do pozycji Project Settings Player (Odtwarzacz ustawień > projektu) i wybierz kartę UWP, jak pokazano poniżej:Ustawienia karty platformy UNIWERSALNEJ systemu Windows
  4. Włącz usługę WebCam na liście Możliwości . Włączone możliwości aplikacji WebCam
  5. Zakończ pracę z ustawieniami projektu.

Funkcje aplikacji WebCam są teraz włączone dla aplikacji aparatu Unity. Jednak aplikacja musi mieć nadal przyznane uprawnienia dostępu do aparatu urządzenia.

Udzielanie uprawnień dostępu do aparatu aplikacji

Jeśli aplikacja ma włączone funkcje WebCam , w oknie dialogowym uprawnień zostanie wyświetlony monit o udzielenie aplikacji dostępu do aparatu urządzenia.

Okno dialogowe Uprawnienia aparatu

To okno dialogowe jest wyświetlane użytkownikom tylko raz, zazwyczaj podczas wprowadzania sceny zawierającej włączoną ARMarkerManagerobsługę znacznika kodu QR. Jeśli dostęp do aparatu zostanie odrzucony, użytkownicy mogą przejść do pozycji Aplikacje ustawień > i włączyć je za pośrednictwem opcji zaawansowanych aplikacji.

Zaawansowane opcje aplikacji z włączonymi uprawnieniami

Kompilowanie wykrywania kodu QR w scenie

Wykrywanie kodu QR musi być wbudowane w każdą scenę, w której chcesz używać kodów QR, co wymaga:

Tworzenie prefab dla kodów QR

Aby użyć kodów QR w scenie, musisz utworzyć prefab dla kodów QR. ARMarkerManager używa tej prefab do utworzenia elementu GameObject na podstawie każdego wykrycia kodu QR.

Aby utworzyć prefab dla kodów QR:

  1. Utwórz nową prefab dla projektu.
  2. ARMarkerDodaj składnik do prefab znajdującego się w obszarze Skrypt > Microsoft.MixedReality.OpenXR > ARMarker.
    Dodawanie składnika ARMarker

Masz teraz podstawową prefab do pracy. Prawdopodobnie aplikacja będzie wizualnie reprezentować kody QR wykryte w środowisku. W następnej sekcji przedstawiono sposób dodawania wizualnej reprezentacji kodów QR.

Dodawanie wizualizacji

W poprzedniej sekcji dodanie ARMarkerdo prefab również automatycznie dodało ARMarkerScale składnik. Ten składnik służy do dopasowywania skali wizualnej reprezentacji kodu QR do jej fizycznego odpowiednika.

Aby to zrobić:

  1. Dodaj pusty GameObject element do prefab utworzonego w poprzedniej sekcji. Będzie ona reprezentować całą zawartość znacznika wizualizacji.
  2. Dodaj podrzędny element 3D GameObject, taki jak Quad, do zawartości GameObjectznacznika . Dodawanie obiektu GameObject 3D do prefab ARMarker
  3. W składniku prefab ARMarkerScale ustaw przekształcenie skali znaczników na zawartość GameObjectznacznika . Ustawienie tego pola gwarantuje, że wybrane 3D GameObject jest poprawnie skalowane w celu dopasowania kodów QR w świecie rzeczywistym.

Dodawanie ARMarkerManager do sceny

ARMarkerManager jest odpowiedzialny wyłącznie za tworzenie, aktualizowanie i usuwanie każdego GameObject dla wykrytych kodów QR.

Aby dodać ARMarkerManager do sceny:

  1. Umieść element GameObject w scenie.
  2. Dodaj składnik do elementu znajdującego ARMarkerManager GameObjectsię w obszarze Skrypt > Microsoft.MixedReality.OpenXR > ARMarkerManager.
    Dodawanie składnika ARMarkerManager
  3. ARMarkerManager Ustaw pole Prefab znacznika na prefab utworzone w poprzedniej sekcji. Zestaw pól prefab znacznika
  4. Rozwiń węzeł Włączone typy znaczników, a następnie wybierz element i ustaw go na kod QR. Włączony typ znacznika kodu QR

Śledzenie zmian kodu QR

ARMarkerManagermarkersChanged zawiera zdarzenie, które udostępnia ARMarkersChangedEventArgs subskrybentom. Użyj tych argumentów zdarzeń, aby śledzić, które kody QR są dodawane lub usuwane z wykrywania lub aktualizowania danych.

Poniższy kod demonstruje subskrybowanie zdarzenia przy użyciu argumentów zdarzeń do iterowania obiektów ARMarker ARMarkerManager i zapisywania ich w debugowaniuARMarkerManager.markersChanged, czy są dodawane, usuwane, czy aktualizowane.

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

Pobieranie czasu ostatniego wykrycia kodu QR

ARMarker.lastSeenTime Użyj właściwości , aby określić, kiedy urządzenie ostatnio śledzić wykryty kod QR i ilość czasu, jeśli istnieje, śledzenie zostanie utracone. Czas jest mierzony w liczbie sekund od czasu uruchomienia aplikacji przez aparat Unity i jest analogiczny do UnityEngine.Time.realtimeSinceStartup.

Używanie identyfikatora śledzenia kodu QR

Kody QR są śledzone, które są wszystkim, co urządzenie AR może wykrywać i śledzić w środowisku fizycznym. Śledzenia pochodzą z typu ARTrackable<TSessionRelativeData, TTrackable> , który dostarcza identyfikator, stan śledzenia, poz i inne dane.

Identyfikator śledzenia kodu QR można przekazać do ARMarkerManager metod, aby uzyskać właściwości kodu QR, nieprzetworzone dane bajtów i reprezentację ciągu oraz ustawić tryb przekształcania kodu QR. Te metody umożliwiają pobieranie danych dla kodu QR bez konieczności przechowywania odwołania do ARMarker obiektu.

Identyfikator kodu QR można przekazać do następujących ARMarkerManager metod:

Uwaga

W przypadku parametru GetRawData allocatormetody przekazywanie Unity.Collections.Allocator.Temp jest wystarczające dla większości scenariuszy.

Po stanie śledzenia kodu QR

Ponieważ element ARMarker jest śledzony, dziedziczy trackingState właściwość i jest ustawiony na jeden z trzech UnityEngine.XR.ARSubsystems.TrackingState:

  • Limited: wskazuje, że kod QR jest śledzony, ale ograniczone informacje są dostępne lub mają niską jakość.
  • Tracking: określa, że kod QR jest w pełni śledzony.
  • None: wskazuje, że kod QR nie jest śledzony.

Aby monitorować ARMarkerManager.markersChanged stan śledzenia kodu QR, zasubskrybuj i iteruj je za pośrednictwem ARMarker kolekcji znaczników podanych w argumentach zdarzenia przekazanych do programu obsługi zdarzeń.

Poniższy kod demonstruje użycie ARMarkerManager.markersChanged zdarzenia do iterowania obiektów ARMarker dla nowo wykrytych kodów QR i zapisywania ich identyfikatora do śledzenia w oknie Debugowanie.

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

Pobieranie wersji kodu QR i typu kodu QR

Aby uzyskać wersję i typ wykrytego kodu QR:

  1. Wywołaj metodę ARMarker.GetQRCodeProperties()QRCodeProperties , która zwraca wystąpienie.
  2. Uzyskaj dostęp do pola QRCodeProperties w wartości zwracanej, aby uzyskać typ kodu QR. Wartość to QRCodeType.QRCode lub QRCodeType.MicroQRCode.
  3. Uzyskaj dostęp do pola wartości QRCodeProperties.version zwracanej, aby uzyskać wersję kodu QR. Wartość waha się od 1 do 40, jeśli typ to QRCodeType.QRCode, a od 1 do 4, jeśli typ to QRCodeType.MicroQRCode.

Alternatywnie przekaż ARMarker identyfikator do śledzenia obiektu, aby ARMarkerManager.GetQRCodeProperties(TrackableId) uzyskać typ i wersję kodu QR.

Ostrzeżenie

Kody QR to jedyny obsługiwany typ znacznika, chociaż obsługa innych typów znaczników może zostać dodana w przyszłych wersjach. Jeśli markerType tak nie ARMarkerType.QRCodejest , wywołanie GetQRCodeProperties(TrackableId) metody zgłasza błąd System.InvalidOperationException. Rozważ zawijanie wywołań w GetQRCodeProperties(TrackableId) blokach try-catch, jeśli może to spowodować problemy w aplikacji później.

Odczytywanie danych QR

Składnik ARMarker jest dołączony do każdego GameObject tworzonego ARMarkerManager elementu. ARMarker Udostępnia dwie metody, które zwracają dane kodu QR:

  • GetDecodedString(): Ta metoda pobiera reprezentację ciągu kodu QR, taką jak adres URL.

  • GetRawData(Unity.Collections.Allocator allocator): Ta metoda zwraca zawartość kodu QR jako tablicę bajtów, umożliwiając precyzyjne dostrajanie sposobu przydzielania tablicy. Użyj tej metody w ścieżkach gorących i innych sytuacjach, w których wydajność jest krytyczna.

Poniższy kod demonstruje podstawowe użycie elementów GetDecodedString() i 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();
    }
}

Uzyskiwanie rozmiaru kodu QR, położenia, obrotu i środka

Obiekt ARMarker zapewnia rozmiar, położenie, obrót i środek kodu QR, który reprezentuje.

Aby uzyskać rozmiar kodu QR w metrach, użyj właściwości ARMarker.size.

ARMarker.transform Użyj właściwości , aby uzyskać rotację i położenie przestrzeni świata przekształcenia kodu QR oraz ARMarker.center współrzędne 2D kodu QR względem przekształcenia kodu QR. Sama transformacja jest wyśrodkowana zgodnie z tym, czy ARMarker.transformMode (tryb przekształcania) jest ustawiony na TransformMode.MostStable (najbardziej stabilny, górny lewy kod QR) lub TransformMode.Center (środek, środek geometryczny kodu QR).

ARMarkerManager.defaultTransformMode Użyj pola, aby ustawić tryb ARMarkerManager przekształcania tworzy nowe ARMarker obiekty za pomocą polecenia . Pole jest inicjowane przy użyciu Default Transform Mode pola jest ustawione na w inspektorze aparatu Unity, jak pokazano poniżej:

Domyślne pole Inspektora trybu przekształcania składnika ARMarkerManager

Alternatywą dla używania metody ARMarker.transformModejest przekazywanie ARMarker identyfikatora śledzenia obiektu w celu ARMarkerManager.SetTransformMode(TrackableId, TransformMode) ustawienia jego trybu przekształcania.

Poniższy kod demonstruje pobieranie rozmiaru i środka nowego kodu QR, położenia i obrotu jego transformacji oraz zaktualizowanej pozycji transformacji po zmianie trybu transformacji.

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

Przykładowy scenariusz znacznika AR

Przykład dostarczony z pakietem wtyczki OpenXR zawiera scenę z obsługą kodu QR, która stanowi przykład sposobu ARMarkerManager i ARMarker użycia.

Scena znajduje się w elemecie ARMarker zasobów>, jak pokazano poniżej:Lokalizacja elementu zawartości sceny ARMarker

Skrypty języka C# używane w scenie można znaleźć w repozytorium OpenXR Unity Mixed Reality Samples w witrynie GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts

Zobacz też