Aracılığıyla paylaş


Unity'de QR kodları

HoloLens 2 mikrofonlu kulaklıklar hologramlar ve diğer AR özellikleri sağlamak için kullanılabilecek QR kodlarını izleyebilir ve algılayabilir. Bu makale, Unity uygulamanızda QR kodlarını kullanmaya başlamak için bilmeniz gereken her şeyde size yol gösterir:

Bu makaleye devam etmeden önce QR kodlarına genel bakış makalesini incelemenizi öneririz.

İzlenen QR Kodu

Unity projenizi ve uygulamanızı yapılandırma

Unity projenizin ve uygulamanızın QR kodu işlevselliğini etkinleştirmek için doğru şekilde ayarlanması ve yapılandırılması gerekir; bu da şunları gerektirir:

  • Windows Karma Gerçeklik sürüm 113.2403.5001 veya üzeri için OpenXR.

    Not

    Bu, işletim sistemiyle birlikte gelir ve Windows Mağazası aracılığıyla güncelleştirilebilir. Kullanıcıların önceki sürümlerinin yüklü olabileceğini ve cihazlarının 113.2403.5001 veya sonraki bir sürüme güncelleştirene kadar QR kodları gibi AR işaretleyicileriyle çalışamayacaklarını unutmayın.

  • Unity'nin desteklenen sürümüyle uyumlu bir proje:
    • Unity 2022.3 LTS (Önerilir)
    • Unity 2021.3 LTS
  • Karma Gerçeklik OpenXR Eklentisi.
  • Unity projeniz için etkinleştirilen web kamerası özellikleri.
  • Uygulamanıza verilen kamera izinleri.

Aşağıdaki bölümler, UNITY projenizi ve uygulamanızı QR kodu algılamayı etkinleştirmek üzere yapılandırma konusunda size yol gösterir.

Karma Gerçeklik OpenXR Eklentisini Alma

Karma Gerçeklik OpenXR Eklentisi paketi, QR kodu işlevselliğine erişmek için kullanabileceğiniz C# API'lerini içerir.

Paketi içeri aktarmak için:

  1. Karma Gerçeklik Özellik Aracı'nı indirip çalıştırın.
  2. OpenXR eklentisini yükleyin .

Karma Gerçeklik Özellik Aracı ayrıca paket yönetimini basitleştirir ve uygulamanızın gerektirdiği Karma Gerçeklik özelliklerini bulmak, güncelleştirmek ve eklemek için kullanılabilir. Aracın nasıl kullanılacağına ilişkin ayrıntılı yönergeler için bkz. Karma Gerçeklik Özellik Aracı'na Hoş Geldiniz.

WebCam özelliklerini etkinleştirme

QR kodlarını algılamak ve izlemek için Unity projenizde WebCam özellikleri etkinleştirilmiş olmalıdır.

WebCam özelliklerini etkinleştirmek için:

  1. Unity projenizi açın.
  2. Unity düzenleyicisinin uygulama menüsünde Düzenle'ye tıklayın.
  3. Proje Ayarları > Yürütücüsü'ne gidin ve gösterildiği gibi UWP sekmesini seçin:UWP Sekme Ayarları
  4. Özellikler listesinde WebCam'i etkinleştirin. WebCam Özellikleri Etkin
  5. Proje Ayarlarından çıkın.

Artık Unity uygulamanız için WebCam özellikleri etkinleştirilmiştir. Ancak uygulamanıza yine de cihaz kamerasına erişim izinleri verilmelidir.

Uygulama kameranıza erişim izinleri verme

Uygulamanızda WebCam özellikleri etkinleştirilmişse, izinler iletişim kutusu kullanıcılardan uygulamanıza cihaz kamerasına erişim vermelerini ister.

Kamera İzinleri İletişim Kutusu

Bu iletişim kutusu kullanıcılara yalnızca bir kez, genellikle QR kod işaretçisi desteği etkin olan bir ARMarkerManager sahne girilirken gösterilir. Kamera erişimi reddedilirse, kullanıcılar Ayarlar > Uygulamaları'na gidebilir ve uygulamanın Gelişmiş Seçenekler'i aracılığıyla etkinleştirebilir.

İzinlerin Etkin Olduğu Uygulama Gelişmiş Seçenekleri

Bir sahnede QR kodu algılama oluşturma

QR kodu algılama, QR kodlarını kullanmak istediğiniz her sahnede yerleşik olarak bulunmalıdır ve bu da şunları gerektirir:

  • Bağlı GameObject olan ARMarkerManager bir. ARMarkerManager algılanan QR kodlarını oluşturmaktan, güncelleştirmek ve GameObject kaldırmaktan tek başına sorumludur.
  • Bağlı bir prefabrik ARMarker .
  • ARMarkerManager bir QR kodu algılandığında oluştururken GameObject prefab kullanacak şekilde yapılandırılır.

QR kodları için prefab oluşturma

Sahnenizde QR kodlarını kullanmak için QR kodları için bir ön güncelleştirme oluşturmanız gerekir. ARMarkerManager bir QR kodu algılandığında kaynak oluşturmak GameObject için bu ön bildirimi kullanır.

QR kodları için bir prefab yapmak için:

  1. Projeniz için yeni bir prefab oluşturun.
  2. ARMarkerBileşeni Microsoft.MixedReality.OpenXR > ARMarker Betiği > altında bulunan prefab'a ekleyin.
    ARMarker Bileşenini Ekleme

Artık çalışmak için temel bir prefabrik var. Uygulamanızın ortamda algılanan QR kodlarını görsel olarak temsil etme olasılığınız yüksektir. Sonraki bölümde QR kodları için görsel gösterim ekleme adımları anlatılmaktadır.

Görsel Ekleme

Önceki bölümde, prefab'a ekleme ARMarkerözelliği de bileşeni otomatik olarak ekledi ARMarkerScale . Bu bileşen, QR kodunun görsel gösteriminin ölçeğini fiziksel karşılığıyla eşleştirmek için kullanılır.

Yapmak için:

  1. Önceki bölümde oluşturduğunuz prefabrik öğeye boş GameObject bir öğe ekleyin. Tüm görsel işaretçi içeriğini temsil eder.
  2. İşaretçi içeriğineGameObject, gibi bir Quadalt 3B GameObjectekleyin. ARMarker prefab'a 3B GameObject ekleme
  3. Prefabrik ARMarkerScale bileşeninde İşaretçi Ölçeği Dönüştürme'yi işaretçi içeriği GameObjectolarak ayarlayın. Bu alanın ayarlanması, seçtiğiniz 3B'nin GameObject gerçek dünya QR kodlarıyla eşleşecek şekilde doğru ölçeklendirilmesini sağlar.

Bir görünüme ekleme ARMarkerManager

ARMarkerManager algılanan QR kodlarını oluşturmaktan, güncelleştirmek ve GameObject kaldırmaktan tek başına sorumludur.

Sahnenize eklemek ARMarkerManager için:

  1. Sahnenize bir GameObject yerleştirin.
  2. ARMarkerManager Microsoft.MixedReality.OpenXR > ARMarkerManager Betiği > altında bulunan bileşeni GameObjectöğesine ekleyin.
    ARMarkerManager Bileşenini Ekleme
  3. ARMarkerManager İşaretçi Prefab alanını önceki bölümde oluşturduğunuz prefab olarak ayarlayın. İmleç Prefabrik Alan Kümesi
  4. Etkin İşaretçi Türleri'ni genişletin, ardından bir öğe seçip QR Kodu olarak ayarlayın. QR Kodu İşaretçi Türü Etkin

QR kodu değişikliklerini izleme

ARMarkerManagermarkersChanged, abonelere ARMarkersChangedEventArgs sağlayan olayı içerir. Algılama veya güncelleştirilmiş poz verilerine hangi QR kodlarının eklendiğini veya kaldırıldığını izlemek için bu olay bağımsız değişkenlerini kullanın.

Aşağıdaki kod, nesnelerde ARMarkerManager yinelemek için ARMarkerManager.markersChanged olay bağımsız değişkenlerini kullanarak olaya abone olunduğunu ve eklenip eklenmediğiniARMarker, kaldırıldığını veya güncelleştirildiğini hata ayıklamaya yazdığını gösterir.

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 kodunun en son algılandığı zamanı alma

ARMarker.lastSeenTime Cihazın algılanan qr kodunu en son ne zaman izlediğini ve varsa izlemenin kaybedildiği süreyi belirlemek için özelliğini kullanın. Unity uygulamanızı başlattığından bu yana süre saniye cinsinden ölçülür ve ile UnityEngine.Time.realtimeSinceStartupbenzerdir.

QR kodunun izlenebilir kimliğini kullanma

QR kodları, AR cihazının fiziksel ortamda algılayıp izleyebildiği her şey olan izlenebilir kodlardır. İzlenebilir öğeler kimlik, izleme durumu, poz ve diğer verileri sağlayan türden ARTrackable<TSessionRelativeData, TTrackable> türetilir.

QR kodu için izlenebilir kimlik, QR kodunun özelliklerini, ham bayt verilerini ve dize gösterimini almak ve QR kodu için dönüştürme modunu ayarlamak için yöntemlere geçirilebilir ARMarkerManager . Bu yöntemler, bir nesne başvurusuna tutunmak zorunda kalmadan QR kodu için veri almanıza ARMarker olanak sağlar.

Qr kodunun kimliğini aşağıdaki ARMarkerManager yöntemlere geçirebilirsiniz:

Not

GetRawData yöntem parametresi allocatoriçin, geçiş Unity.Collections.Allocator.Temp çoğu senaryo için yeterlidir.

QR kodunun izleme durumunu izleme

izlenebilir ARMarker olduğundan, özelliği devralır trackingState ve üç UnityEngine.XR.ARSubsystems.TrackingStatetaneden birine ayarlanır:

  • Limited: QR kodunun izlendiğini ancak sınırlı bilgi bulunduğunu veya düşük kalitede olduğunu gösterir.
  • Tracking: QR kodunun tam olarak izlendiğini belirtir.
  • None: QR kodunun izlenmediğini gösterir.

QR kodunun izleme durumunu izlemek için öğesine abone olun ARMarkerManager.markersChanged ve olay işleyicinize geçirilen olay bağımsız değişkenlerinde sağlanan işaretleyici koleksiyonlarında yinelenir ARMarker .

Aşağıdaki kod, yeni algılanan QR kodları için nesneler arasında ARMarker yineleme yapmak için olayının kullanılmasını ARMarkerManager.markersChanged ve hata ayıklama penceresine izlenebilir kimliklerini yazmayı gösterir.

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 kodunun sürümünü ve QR kod türünü alma

Algılanan QR kodunun sürümünü ve türünü almak için:

  1. Çağrısı ARMarker.GetQRCodeProperties(), bir QRCodeProperties örnek döndürür.
  2. QR kodunun türünü almak için dönüş değerindeki alana QRCodeProperties erişin. Değer veya QRCodeType.QRCode QRCodeType.MicroQRCodeşeklindedir.
  3. QR kodunun sürümünü almak için dönüş değerinin QRCodeProperties.version alanına erişin. Değer, türü ise 1 ile 40 arasında, tür ise QRCodeType.QRCode1 ile 4 arasında değişir QRCodeType.MicroQRCode.

Alternatif olarak, QR ARMarker kodunun türünü ve sürümünü almak için ARMarkerManager.GetQRCodeProperties(TrackableId) nesnenin izlenebilir kimliğini geçirin.

Uyarı

QR kodları şu anda desteklenen tek işaretçi türüdür, ancak diğer işaretçi türleri için destek gelecek sürümlerde eklenebilir. ARMarkerType.QRCodedeğilse markerType çağrısı GetQRCodeProperties(TrackableId) oluşturulurSystem.InvalidOperationException. Daha sonra uygulamanızda sorunlara GetQRCodeProperties(TrackableId) neden olabilecek çağrıları try-catch bloklarında sarmalayabilirsiniz.

QR verilerini okuma

Bileşen ARMarker , oluşturan her GameObject bir bileşene ARMarkerManager eklenir. ARMarker QR kodu verilerini döndüren iki yöntem sağlar:

  • GetDecodedString(): Bu yöntem, QR kodunun URL gibi dize gösterimini alır.

  • GetRawData(Unity.Collections.Allocator allocator): Bu yöntem QR kodu içeriğini bayt dizisi olarak döndürerek dizinin nasıl ayrıldığını ayrıntılı olarak ayarlamaya olanak sağlar. Bu yöntemi sık erişimli yollarda ve performansın kritik olduğu diğer durumlarda kullanın.

Aşağıdaki kod, ve GetRawData(Unity.Collections.Allocator allocator)temel kullanımını GetDecodedString() gösterir:

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 kodu boyutunu, konumunu, döndürmesini ve merkezini alma

Nesne ARMarker , temsil ettiği QR kodunun boyutunu, konumunu, döndürmesini ve merkezini sağlar.

QR kodunun boyutunu metre cinsinden almak için özelliğini ARMarker.sizekullanın.

ARMarker.transform ÖZELLIĞINI kullanarak QR kodunun dönüşümünün döndürme ve dünya alanı konumunu ve QR kodunun dönüşümüne ARMarker.center göre QR kodunun 2B koordinatlarını elde edin. Dönüşümün kendisi, (dönüştürme modu) öğesinin (en kararlı, QR kodunun sol üst kısmı) veya TransformMode.Center (QR kodunun geometrik merkezi) olarak ayarlanıp ARMarker.transformMode ayarlanmadığına TransformMode.MostStable göre ortalanır.

ARMarkerManager.defaultTransformMode Dönüşüm modunun ARMarkerManager yeni ARMarker nesneler oluşturduğunu ayarlamak için alanını kullanın. Alan, gösterildiği gibi Unity Denetçisi'nde olarak ayarlandığı şekilde başlatılır Default Transform Mode :

ARMarkerManager Bileşeninin Varsayılan Dönüştürme Modu Denetçi Alanı

kullanmaya ARMarker.transformModeARMarker alternatif olarak, nesnenin izlenebilir kimliğini ARMarkerManager.SetTransformMode(TrackableId, TransformMode) geçirerek dönüştürme modunu ayarlayın.

Aşağıdaki kod, yeni bir QR kodunun boyutunu ve merkezini, dönüşümünün konumunu ve döndürmesini ve dönüştürme modunu değiştirdikten sonra güncelleştirilmiş dönüştürme konumunu almayı gösterir.

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 işaretleyici örneği senaryosu

OpenXR Eklenti paketiyle sağlanan örnek, nasıl ARMarkerManager ve ARMarker kullanılabileceğini gösteren qr kodu etkin bir görünüm içerir.

Sahne, gösterildiği gibi Varlıklar > ARMarker'da bulunur:ARMarker Sahne Varlığı Konumu

Sahnede kullanılan C# betiklerini GitHub'daki OpenXR Unity Karma Gerçeklik Örnekleri deposunda bulabilirsiniz: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts

Ayrıca bkz.