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.
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:
- Pobierz i uruchom narzędzie funkcji rzeczywistości mieszanej.
- 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 :
- Otwórz projekt aparatu Unity.
- Kliknij pozycję Edytuj w menu aplikacji edytora aparatu Unity.
- Przejdź do pozycji Project Settings Player (Odtwarzacz ustawień > projektu) i wybierz kartę UWP, jak pokazano poniżej:
- Włącz usługę WebCam na liście Możliwości .
- 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.
To okno dialogowe jest wyświetlane użytkownikom tylko raz, zazwyczaj podczas wprowadzania sceny zawierającej włączoną ARMarkerManager
obsł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.
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:
- Element
GameObject
z dołączonymARMarkerManager
.ARMarkerManager
jest odpowiedzialny wyłącznie za tworzenie, aktualizowanie i usuwanie każdegoGameObject
dla wykrytych kodów QR. - Prefab z dołączonym
ARMarker
. ARMarkerManager
skonfigurowano do używania prefab podczas tworzeniaGameObject
kodu QR.
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:
- Utwórz nową prefab dla projektu.
ARMarker
Dodaj składnik do prefab znajdującego się w obszarze Skrypt > Microsoft.MixedReality.OpenXR > 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 ARMarker
do 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ć:
- Dodaj pusty
GameObject
element do prefab utworzonego w poprzedniej sekcji. Będzie ona reprezentować całą zawartość znacznika wizualizacji. - Dodaj podrzędny element 3D
GameObject
, taki jakQuad
, do zawartościGameObject
znacznika . - W składniku prefab
ARMarkerScale
ustaw przekształcenie skali znaczników na zawartośćGameObject
znacznika . Ustawienie tego pola gwarantuje, że wybrane 3DGameObject
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:
- Umieść element
GameObject
w scenie. - Dodaj składnik do elementu znajdującego
ARMarkerManager
GameObject
się w obszarze Skrypt > Microsoft.MixedReality.OpenXR > ARMarkerManager.
ARMarkerManager
Ustaw pole Prefab znacznika na prefab utworzone w poprzedniej sekcji.- Rozwiń węzeł Włączone typy znaczników, a następnie wybierz element i ustaw go na kod QR.
Śledzenie zmian kodu QR
ARMarkerManager
markersChanged
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:
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)
Uwaga
W przypadku parametru GetRawData
allocator
metody 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:
- Wywołaj metodę
ARMarker.GetQRCodeProperties()
QRCodeProperties
, która zwraca wystąpienie. - Uzyskaj dostęp do pola
QRCodeProperties
w wartości zwracanej, aby uzyskać typ kodu QR. Wartość toQRCodeType.QRCode
lubQRCodeType.MicroQRCode
. - 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 toQRCodeType.QRCode
, a od 1 do 4, jeśli typ toQRCodeType.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.QRCode
jest , 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:
Alternatywą dla używania metody ARMarker.transformMode
jest 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:
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