Unity中的ARCore扩展ImageTracking /锚定API

时间:2018-12-05 23:25:18

标签: unity3d augmented-reality arcore

Unity SDK软件包随附的ARCore AugmentedImage示例应用程序在示例AugmentedImageDatabase中包含的示例图像周围放置了一个相框。如果找到它们,它将在场景中的多个图像周围放置一个相框,并且仅在完全失去跟踪后才销毁这些相框。

假设您只想在最近识别的图像周围显示相框-并从上一张图像中删除该相框?检查给定图像的TrackingState没有帮助,因为默认情况下跟踪已扩展且没有任何关闭方式,并且锚定API也未提供任何有帮助的信息。

一旦包含可跟踪图像的列表超过1,我就通过销毁旧会话(并创建一个新会话)来工作,但这导致该应用暂时冻结一秒钟,然后再继续。

是否有更好的建议?

3 个答案:

答案 0 :(得分:1)

考虑到Google开发人员对此github issue的回复,这不是一个确切的解决方案,但可以解决此问题。正如我在评论中所说的,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秒钟,也可以降低它。祝你好运

答案 1 :(得分:0)

5个月后,这个问题仍然存在,从Google真的很奇怪,他们没有解决此问题,并且忽略了Github上的此类问题。

我发现了一种利用AugmentedImageTrackingMethod的解决方法,它不是非常理想,但我发现唯一可行的方法:在AugmentedImageController.cs的Update方法中

 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,就可以解决问题。

答案 2 :(得分:0)

使用以下代码实现与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);
        }
    }

答案参考来自here