Я работаю над проектом, и мне нужно сделать приложение для HoloLens 2, которое может напрямую сканировать QR-коды, я не знаком с этой разработкой AR, поэтому я попытался использовать пример из Microsoft (https://learn.microsoft.com/en-us/windo ... -cover-com находится на HoloLens 2, но он не сканирует коды, я имею в виду, когда вы используете этот пример, который должен обнаружить QR -код и создавать своего рода прямоугольник вокруг него, но я не получаю этот прямоугольник, и да, я попытался сделать это на бумаге и даже на экране моего ноутбука, и я уверен, что он был достаточно большим, чтобы обнаружить (реализованный QR Scanner в Hololens 2 определяет код QR). Поэтому я установил Microsoft.mixedReality.qr из Nuget и добавил MRTK в проект также в моей визуальной студии для сообщества, которое я установил все пакеты для разработки UWP и разработки Unity, но мое приложение все еще не работает, оно делает только некоторые линии отладки белых или что -то в этом роде. Может ли кто -нибудь сказать мне, что я могу сделать, чтобы эта вещь работала?
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.QR;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Microsoft.MixedReality.SampleQRCodes
{
public static class QRCodeEventArgs
{
public static QRCodeEventArgs Create(TData data)
{
return new QRCodeEventArgs(data);
}
}
[Serializable]
public class QRCodeEventArgs : EventArgs
{
public TData Data { get; private set; }
public QRCodeEventArgs(TData data)
{
Data = data;
}
}
public class QRCodesManager : Singleton
{
[Tooltip("Determines if the QR codes scanner should be automatically started.")]
public bool AutoStartQRTracking = true;
public bool IsTrackerRunning { get; private set; }
public bool IsSupported { get; private set; }
public event EventHandler QRCodesTrackingStateChanged;
public event EventHandler QRCodeAdded;
public event EventHandler QRCodeUpdated;
public event EventHandler QRCodeRemoved;
private System.Collections.Generic.SortedDictionary qrCodesList = new SortedDictionary();
private QRCodeWatcher qrTracker;
private bool capabilityInitialized = false;
private QRCodeWatcherAccessStatus accessStatus;
private System.Threading.Tasks.Task capabilityTask;
public System.Guid GetIdForQRCode(string qrCodeData)
{
lock (qrCodesList)
{
foreach (var ite in qrCodesList)
{
if (ite.Value.Data == qrCodeData)
{
return ite.Key;
}
}
}
return new System.Guid();
}
public System.Collections.Generic.IList GetList()
{
lock (qrCodesList)
{
return new List(qrCodesList.Values);
}
}
protected void Awake()
{
}
// Use this for initialization
async protected virtual void Start()
{
IsSupported = QRCodeWatcher.IsSupported();
capabilityTask = QRCodeWatcher.RequestAccessAsync();
accessStatus = await capabilityTask;
capabilityInitialized = true;
}
private void SetupQRTracking()
{
try
{
qrTracker = new QRCodeWatcher();
IsTrackerRunning = false;
qrTracker.Added += QRCodeWatcher_Added;
qrTracker.Updated += QRCodeWatcher_Updated;
qrTracker.Removed += QRCodeWatcher_Removed;
qrTracker.EnumerationCompleted += QRCodeWatcher_EnumerationCompleted;
}
catch (Exception ex)
{
Debug.Log("QRCodesManager : exception starting the tracker " + ex.ToString());
}
if (AutoStartQRTracking)
{
StartQRTracking();
}
}
public void StartQRTracking()
{
if (qrTracker != null && !IsTrackerRunning)
{
Debug.Log("QRCodesManager starting QRCodeWatcher");
try
{
qrTracker.Start();
IsTrackerRunning = true;
Debug.Log("QRCodeManager started!");
QRCodesTrackingStateChanged?.Invoke(this, true);
}
catch (Exception ex)
{
Debug.Log("QRCodesManager starting QRCodeWatcher Exception:" + ex.ToString());
}
}
}
public void StopQRTracking()
{
if (IsTrackerRunning)
{
IsTrackerRunning = false;
if (qrTracker != null)
{
qrTracker.Stop();
qrCodesList.Clear();
}
var handlers = QRCodesTrackingStateChanged;
if (handlers != null)
{
handlers(this, false);
}
}
}
private void QRCodeWatcher_Removed(object sender, QRCodeRemovedEventArgs args)
{
Debug.Log("QRCodesManager QRCodeWatcher_Removed");
bool found = false;
lock (qrCodesList)
{
if (qrCodesList.ContainsKey(args.Code.Id))
{
qrCodesList.Remove(args.Code.Id);
found = true;
}
}
if (found)
{
var handlers = QRCodeRemoved;
if (handlers != null)
{
handlers(this, QRCodeEventArgs.Create(args.Code));
}
}
}
private void QRCodeWatcher_Updated(object sender, QRCodeUpdatedEventArgs args)
{
Debug.Log("QRCodesManager QRCodeWatcher_Updated");
bool found = false;
lock (qrCodesList)
{
if (qrCodesList.ContainsKey(args.Code.Id))
{
found = true;
qrCodesList[args.Code.Id] = args.Code;
}
}
if (found)
{
var handlers = QRCodeUpdated;
if (handlers != null)
{
handlers(this, QRCodeEventArgs.Create(args.Code));
}
}
}
private void QRCodeWatcher_Added(object sender, QRCodeAddedEventArgs args)
{
Debug.Log("QRCodesManager QRCodeWatcher_Added");
lock (qrCodesList)
{
qrCodesList[args.Code.Id] = args.Code;
}
var handlers = QRCodeAdded;
if (handlers != null)
{
handlers(this, QRCodeEventArgs.Create(args.Code));
}
}
private void QRCodeWatcher_EnumerationCompleted(object sender, object e)
{
Debug.Log("QRCodesManager QrTracker_EnumerationCompleted");
}
private void Update()
{
if (qrTracker == null && capabilityInitialized && IsSupported)
{
if (accessStatus == QRCodeWatcherAccessStatus.Allowed)
{
SetupQRTracking();
}
else
{
Debug.Log("Capability access status : " + accessStatus);
}
}
}
}
}
< /code>
И это код для qrcodevisualizer: < /p>
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Collections.Generic;
using UnityEngine;
namespace Microsoft.MixedReality.SampleQRCodes
{
public class QRCodesVisualizer : MonoBehaviour
{
public GameObject qrCodePrefab;
private SortedDictionary qrCodesObjectsList;
private bool clearExisting = false;
struct ActionData
{
public enum Type
{
Added,
Updated,
Removed
};
public Type type;
public Microsoft.MixedReality.QR.QRCode qrCode;
public ActionData(Type type, Microsoft.MixedReality.QR.QRCode qRCode) : this()
{
this.type = type;
qrCode = qRCode;
}
}
private Queue pendingActions = new Queue();
// Use this for initialization
void Start()
{
Debug.Log("QRCodesVisualizer start");
qrCodesObjectsList = new SortedDictionary();
QRCodesManager.Instance.QRCodesTrackingStateChanged += Instance_QRCodesTrackingStateChanged;
QRCodesManager.Instance.QRCodeAdded += Instance_QRCodeAdded;
QRCodesManager.Instance.QRCodeUpdated += Instance_QRCodeUpdated;
QRCodesManager.Instance.QRCodeRemoved += Instance_QRCodeRemoved;
if (qrCodePrefab == null)
{
throw new System.Exception("Prefab not assigned");
}
}
private void Instance_QRCodesTrackingStateChanged(object sender, bool status)
{
if (!status)
{
clearExisting = true;
}
}
private void Instance_QRCodeAdded(object sender, QRCodeEventArgs e)
{
Debug.Log("QRCodesVisualizer Instance_QRCodeAdded");
lock (pendingActions)
{
pendingActions.Enqueue(new ActionData(ActionData.Type.Added, e.Data));
}
}
private void Instance_QRCodeUpdated(object sender, QRCodeEventArgs e)
{
Debug.Log("QRCodesVisualizer Instance_QRCodeUpdated");
lock (pendingActions)
{
pendingActions.Enqueue(new ActionData(ActionData.Type.Updated, e.Data));
}
}
private void Instance_QRCodeRemoved(object sender, QRCodeEventArgs e)
{
Debug.Log("QRCodesVisualizer Instance_QRCodeRemoved");
lock (pendingActions)
{
pendingActions.Enqueue(new ActionData(ActionData.Type.Removed, e.Data));
}
}
private void HandleEvents()
{
lock (pendingActions)
{
while (pendingActions.Count > 0)
{
var action = pendingActions.Dequeue();
if (action.type == ActionData.Type.Added)
{
GameObject qrCodeObject = Instantiate(qrCodePrefab, new Vector3(0, 0, 0), Quaternion.identity);
qrCodeObject.GetComponent().Id = action.qrCode.SpatialGraphNodeId;
qrCodeObject.GetComponent().qrCode = action.qrCode;
qrCodesObjectsList.Add(action.qrCode.Id, qrCodeObject);
}
else if (action.type == ActionData.Type.Updated)
{
if (!qrCodesObjectsList.ContainsKey(action.qrCode.Id))
{
GameObject qrCodeObject = Instantiate(qrCodePrefab, new Vector3(0, 0, 0), Quaternion.identity);
qrCodeObject.GetComponent().Id = action.qrCode.SpatialGraphNodeId;
qrCodeObject.GetComponent().qrCode = action.qrCode;
qrCodesObjectsList.Add(action.qrCode.Id, qrCodeObject);
}
}
else if (action.type == ActionData.Type.Removed)
{
if (qrCodesObjectsList.ContainsKey(action.qrCode.Id))
{
Destroy(qrCodesObjectsList[action.qrCode.Id]);
qrCodesObjectsList.Remove(action.qrCode.Id);
}
}
}
}
if (clearExisting)
{
clearExisting = false;
foreach (var obj in qrCodesObjectsList)
{
Destroy(obj.Value);
}
qrCodesObjectsList.Clear();
}
}
// Update is called once per frame
void Update()
{
HandleEvents();
}
}
}
Эти два сценария прикреплены к пустой вещи в двигателе Unity, а также QR-код, прикрепленный к скрипту Qrcodevisualizer.
Вы можете найти этот образец здесь (https://github.com/microsoft/mixedreality-qrcode-same- Совместно>
Я работаю над проектом, и мне нужно сделать приложение для HoloLens 2, которое может напрямую сканировать QR-коды, я не знаком с этой разработкой AR, поэтому я попытался использовать пример из Microsoft (https://learn.microsoft.com/en-us/windows/mixed-reality/develove/advanced-concepts/qr-code-code-code-cover-com находится на HoloLens 2, но он не сканирует коды, я имею в виду, когда вы используете этот пример, который должен обнаружить QR -код и создавать своего рода прямоугольник вокруг него, но я не получаю этот прямоугольник, и да, я попытался сделать это на бумаге и даже на экране моего ноутбука, и я уверен, что он был достаточно большим, чтобы обнаружить (реализованный QR Scanner в Hololens 2 определяет код QR). Поэтому я установил Microsoft.mixedReality.qr из Nuget и добавил MRTK в проект также в моей визуальной студии для сообщества, которое я установил все пакеты для разработки UWP и разработки Unity, но мое приложение все еще не работает, оно делает только некоторые линии отладки белых или что -то в этом роде. Может ли кто -нибудь сказать мне, что я могу сделать, чтобы эта вещь работала?[code]// Copyright (c) Microsoft Corporation. // Licensed under the MIT License.
using Microsoft.MixedReality.QR; using System; using System.Collections.Generic; using UnityEngine;
namespace Microsoft.MixedReality.SampleQRCodes { public static class QRCodeEventArgs { public static QRCodeEventArgs Create(TData data) { return new QRCodeEventArgs(data); } }
[Serializable] public class QRCodeEventArgs : EventArgs { public TData Data { get; private set; }
public QRCodeEventArgs(TData data) { Data = data; } }
public class QRCodesManager : Singleton { [Tooltip("Determines if the QR codes scanner should be automatically started.")] public bool AutoStartQRTracking = true;
public bool IsTrackerRunning { get; private set; }
public bool IsSupported { get; private set; }
public event EventHandler QRCodesTrackingStateChanged; public event EventHandler QRCodeAdded; public event EventHandler QRCodeUpdated; public event EventHandler QRCodeRemoved;
private System.Collections.Generic.SortedDictionary qrCodesList = new SortedDictionary();
private void Update() { if (qrTracker == null && capabilityInitialized && IsSupported) { if (accessStatus == QRCodeWatcherAccessStatus.Allowed) { SetupQRTracking(); } else { Debug.Log("Capability access status : " + accessStatus); } } } } } < /code> И это код для qrcodevisualizer: < /p> // Copyright (c) Microsoft Corporation. // Licensed under the MIT License.
using System.Collections.Generic; using UnityEngine;
namespace Microsoft.MixedReality.SampleQRCodes { public class QRCodesVisualizer : MonoBehaviour { public GameObject qrCodePrefab;
private void HandleEvents() { lock (pendingActions) { while (pendingActions.Count > 0) { var action = pendingActions.Dequeue(); if (action.type == ActionData.Type.Added) { GameObject qrCodeObject = Instantiate(qrCodePrefab, new Vector3(0, 0, 0), Quaternion.identity); qrCodeObject.GetComponent().Id = action.qrCode.SpatialGraphNodeId; qrCodeObject.GetComponent().qrCode = action.qrCode; qrCodesObjectsList.Add(action.qrCode.Id, qrCodeObject); } else if (action.type == ActionData.Type.Updated) { if (!qrCodesObjectsList.ContainsKey(action.qrCode.Id)) { GameObject qrCodeObject = Instantiate(qrCodePrefab, new Vector3(0, 0, 0), Quaternion.identity); qrCodeObject.GetComponent().Id = action.qrCode.SpatialGraphNodeId; qrCodeObject.GetComponent().qrCode = action.qrCode; qrCodesObjectsList.Add(action.qrCode.Id, qrCodeObject); } } else if (action.type == ActionData.Type.Removed) { if (qrCodesObjectsList.ContainsKey(action.qrCode.Id)) { Destroy(qrCodesObjectsList[action.qrCode.Id]); qrCodesObjectsList.Remove(action.qrCode.Id); } } } } if (clearExisting) { clearExisting = false; foreach (var obj in qrCodesObjectsList) { Destroy(obj.Value); } qrCodesObjectsList.Clear();
} }
// Update is called once per frame void Update() { HandleEvents(); } } } [/code] Эти два сценария прикреплены к пустой вещи в двигателе Unity, а также QR-код, прикрепленный к скрипту Qrcodevisualizer. Вы можете найти этот образец здесь (https://github.com/microsoft/mixedreality-qrcode-same- Совместно>
Я работаю над проектом, и мне нужно сделать приложение для HoloLens 2, которое может напрямую сканировать QR-коды, я не знаком с этой разработкой AR, поэтому я попытался использовать пример из Microsoft ( находится на HoloLens 2, но он не сканирует...
Я работаю над проектом, и мне нужно сделать приложение для HoloLens 2, которое может напрямую сканировать QR-коды, я не знаком с этой разработкой AR, поэтому я попытался использовать пример из Microsoft ( находится на HoloLens 2, но он не сканирует...
У меня есть проект в Unity для Hololens 2, в котором используется MRTK3, и я пытаюсь добавить визуализатор в свои руки и не могу найти никакого руководства или объяснения, как это сделать.
Я попытался добавить скрипт RiggedHandVisualizer.cs в свои...