Созданное изображение при обнаружении изображения "приклеивается" к экрану, если изображение / привязка потеряно. - PullRequest
0 голосов
/ 25 мая 2020

Итак, в Unity я пытаюсь создать приложение AR, которое порождает что-то после обнаружения определенного изображения. Если камера теряет отслеживание изображения или объекта, она приклеивает созданный объект к экрану. Как я могу этого избежать и есть ли переменная, которая показывает состояние?

Я уже пробовал переменную "TrackingState", которая, к сожалению, не сработала. "Limited не только применяется к состоянию приклеивания (к экрану), но также и" поврежден ", что приводит к исчезновению объекта, хотя он все еще отображается правильно. Это, к сожалению, приводит к очень чувствительному обращению с камерой, поэтому это не так. вариант. «Нет», с другой стороны, никогда не появлялся.

Не могли бы вы назвать другие элементы, которые я мог бы использовать для решения этой проблемы? Или объясните, что я делаю не так с «TrackingState»?

Вот код, который я пробовал до сих пор (у меня также был регистратор, чтобы показывать, в каком состоянии он находится каждые полсекунды):

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class ImagesToFigures : MonoBehaviour
{
    private ARTrackedImageManager _arTrackedImageManager;
    private ARManager _arManager;
    private GameObject spawnedObject;
    private string existingString;
    private bool isActive;

    private GameObject[] children;
    private FoundStickerEvent foundStickerEvent;
    private string addedSticker = "";

    private XRReferenceImage referenceImage;



    void Awake()
    {
        _arTrackedImageManager = GetComponentInParent<ARTrackedImageManager>();
        // if (GetComponentInParent<ARManager>()) {
        _arManager = GetComponentInParent<ARManager>();
        // }
        existingString = "";

        children = new GameObject[this.transform.childCount];

        for (int i = 0; i < this.transform.childCount; i++)
        {
            GameObject child = this.transform.GetChild(i).gameObject;
            children[i] = child;
        }
    }

    public void activate()
    {
        isActive = true;
    }

    public void OnEnable()
    {
        _arTrackedImageManager.trackedImagesChanged += OnImageChanged;
    }

    public void OnDisable()
    {
        _arTrackedImageManager.trackedImagesChanged -= OnImageChanged;
    }

    public void destroySpawnedObject()
    {
        // existingString = "";
        foreach (var child in children)
        {
            child.SetActive(false);
        }
        // addedSticker = "";
        // GameManager.instance.log("destroyed");
    }

    private void OnImageChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        if (GameManager.instance.currentState == GameState.AR_SCANNING)
        {
            // GameManager.instance.log(eventArgs.updated.Count +" " + referenceImage.name);
            foreach (GameObject child in children)
            {
                if (addedSticker == "")
                {
                    foreach (ARTrackedImage trackedImage in eventArgs.added)
                    {
                        addedSticker = trackedImage.referenceImage.name;
                        // GameManager.instance.log(addedSticker);
                    }
                }
                else
                {
                    // GameManager.instance.log(eventArgs.updated.Count.ToString());
                    foreach (ARTrackedImage trackedImage in eventArgs.updated)
                    {
                        try
                        {
                            if (child.name == trackedImage.referenceImage.name &&
                                (child.name == addedSticker || (referenceImage.name == trackedImage.referenceImage.name && child.name == referenceImage.name))
                            )
                            {
                                if (trackedImage.trackingState == TrackingState.Tracking /*|| trackedImage.trackingState == TrackingState.Limited*/)
                                {
                                    child.SetActive(true);
                                    GameManager.instance.currentState = GameState.AR_SCANNED;
                                    GameManager.instance.log(trackedImage.referenceImage.name);
                                    referenceImage = trackedImage.referenceImage;

                                    // GameManager.instance.log(child.transform.position.ToString());
                                    // trackedImage.destroyOnRemoval = true;
                                    _arManager.foundStickerEvent.Invoke(trackedImage.referenceImage.name);
                                    // _arManager.displayInfosEvent.Invoke("Tippe auf die Figur für spannende Infos!");

                                }
                            }
                            // else
                            // {
                            //     child.SetActive(false);
                            // }
                        }
                        catch (Exception e)
                        {
                            GameManager.instance.log("error: " + e.ToString());
                        }
                    }
                }
            }
        }

if ((currentlyActiveImage.trackingState == TrackingState.None) || currentlyActiveImage.trackingState == TrackingState.Limited))
{
  GameManager.instance.destroyARObject();
  GameManager.instance.ResetState();
}

1 Ответ

0 голосов
/ 12 июня 2020

В сценариях Tracked Image вы можете определить, что произойдет, когда вы потеряете трек. Затем вы можете сделать объект неактивным или уничтожить его, в зависимости от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...