ARCore Extended ImageTracking / Anchoring API в Unity - PullRequest
0 голосов
/ 06 декабря 2018

Пример приложения ARCore AugmentedImage, поставляемого с пакетом Unity SDK, размещает рамку вокруг образцов изображений, включенных в образец AugmentedImageDatabase.Он поместит рамку вокруг нескольких изображений в сцене, если они будут найдены, и уничтожит рамки только после полной потери слежения.

Предположим, вы хотите отобразить только рамку изображения вокруг последнего распознанного изображения - и удалить рамку из предыдущего изображения?Проверка TrackingState данного изображения не помогает, так как отслеживание по умолчанию расширено без какого-либо отключения, а API привязки не предлагает никакой информации, которая также помогла бы.

У меня это работаетпутем уничтожения старого сеанса (и создания нового), когда список, содержащий изображения, которые можно отслеживать, превышает 1, но это приводит к тому, что приложение временно зависает на секунду перед возобновлением.

Есть ли предложения по улучшениюспособ сделать это?

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

5 месяцев спустя, и эта проблема все еще существует, очень странно, что Google не решает эту проблему и игнорирует такие проблемы на Github.

Я нашел обходной путь, использующий AugmentedImageTrackingMethod, он не очень оптимален, но единственное, что я нашел, это работает: в методе Update в AugmentedImageController.cs

 foreach (var image in m_TempAugmentedImages)
    {

        AugmentedImageVisualizerZreality visualizer = null;
        m_Visualizers.TryGetValue(image.DatabaseIndex, out visualizer);

        if (image.TrackingState == TrackingState.Tracking && visualizer == null)
        {
            // Create an anchor to ensure that ARCore keeps tracking this augmented image.
           // This only fires Tracking and then goes directly to paused, for ever..
            Anchor anchor = image.CreateAnchor(image.CenterPose);
            visualizer = Instantiate(
                AugmentedImageVisualizerPrefab, anchor.transform);
            visualizer.Image = image;
            m_Visualizers.Add(image.DatabaseIndex, visualizer);
        }
        else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
        {
            m_Visualizers.Remove(image.DatabaseIndex);
            GameObject.Destroy(visualizer.gameObject);
        } else if (image.TrackingState == TrackingState.Paused)
        {
            trackingHint.text = "Tracking paused";
        }

        // We take care of hiding and showing here
        switch (image.TrackingMethod)
        {
            case AugmentedImageTrackingMethod.FullTracking:
                visualizer.gameObject.SetActive(true);
                trackingHint.text = "Tracking in progress..";
                break;
            case AugmentedImageTrackingMethod.LastKnownPose:
                visualizer.gameObject.SetActive(false);
                trackingHint.text = "LastKnownPose";
                break;
            case AugmentedImageTrackingMethod.NotTracking:
                trackingHint.text = "NotTracking";
                visualizer.gameObject.SetActive(false);
                break;
        }
    }

Не очень чистый обходной путь, но он работает, если вы выбираете ARCore вместо vuforia ..

0 голосов
/ 07 июня 2019

Используйте следующий код для достижения того же сценария, что и для TrackingState.Tracking и TrackingState.Stopped.Именно здесь я использовал AugmentedImageTrackingMethod .FullTracking и AugmentedImageTrackingMethod .LastKnownPose.Работает нормально и проверено с различными изображениями в Unity Engine.

foreach(AugmentedImage image in images)
    {
        var viz = GetVisualizer(image);

        //Marker is being tracked
        if(image.TrackingState == TrackingState.Tracking && viz == null && image.TrackingMethod == AugmentedImageTrackingMethod.FullTracking)
        {
            AddVisualizer(image);
        }
        //marker is not tracked in camera output
        else if(image.TrackingMethod == AugmentedImageTrackingMethod.LastKnownPose && viz != null)
        {
            RemoveVisualizer(image, viz);
        }
    }

Ссылка на ответ от здесь .

0 голосов
/ 06 декабря 2018

Хорошо, это не точное решение, учитывая ответ на этот вопрос github от разработчиков Google, но оно решает проблему.Как я уже говорил в моих комментариях TrackableQueryFilter.Updated дает вам изображения, которые обновляются (не только с точки зрения статуса, но и т.д.) в текущем кадре.Поэтому, когда я регистрирую m_TempAugmentedImages.Count для 318 кадров, когда мое изображение находится в поле зрения моего телефона и отслеживается, мое изображение обновляется 18 раз.

Поскольку нет способа узнать, когда изображение обновляется, и это происходит не часто, я подумал о том, чтобы проверить, если изображение не обновляется в течение 3 секунд, я могу уничтожить изображение.Для этого я добавил public float TimePassed в мой AugmentedImageVisualizer скрипт.Затем в моем скрипте AugmentedImageController я добавил эти строки, чтобы проверить TimePassed каждого изображения в сеансе следующим образом:

        foreach (var visualizer in m_Visualizers.Values)
        {
            // if image is Updated TimePassed is assigned to zero for that image
            if (m_TempAugmentedImages.Count != 0 && visualizer.Image == m_TempAugmentedImages[0])
            {

                    visualizer.TimePassed = 0;

            }
            else
            {
                visualizer.TimePassed += Time.deltaTime;
            }

            if (visualizer.TimePassed > 3.0f)
            {
                Debug.Log("Destroy is called");
                m_Visualizers.Remove(visualizer.Image.DatabaseIndex);
                GameObject.Destroy(visualizer.gameObject);
            }              
        }

Я построил его, и таким образом вы можете вернуться к изображениям, которыеотслеживается раньше, и если вы недовольны примерно 3 секундами, вы также можете опустить его.Удачи

...