Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d Unity中的ARCore扩展图像跟踪/锚定API_Unity3d_Augmented Reality_Arcore - Fatal编程技术网

Unity3d Unity中的ARCore扩展图像跟踪/锚定API

Unity3d Unity中的ARCore扩展图像跟踪/锚定API,unity3d,augmented-reality,arcore,Unity3d,Augmented Reality,Arcore,Unity SDK包附带的ARCore AugmenteImage示例应用程序会在示例AugmenteImage数据库中包含的示例图像周围放置一个图片框。如果发现了场景中的多个图像,它会在这些图像周围放置一个画框,并且只有在跟踪完全丢失后才会销毁这些画框 假设您只想在最近识别的图像周围显示一个相框,并从上一个图像中删除该相框?检查给定图像的TrackingState没有帮助,因为默认情况下跟踪是扩展的,没有任何关闭的方法,并且锚API也没有提供任何有用的信息 一旦保存可跟踪图像的列表超过1,我就

Unity SDK包附带的ARCore AugmenteImage示例应用程序会在示例AugmenteImage数据库中包含的示例图像周围放置一个图片框。如果发现了场景中的多个图像,它会在这些图像周围放置一个画框,并且只有在跟踪完全丢失后才会销毁这些画框

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

一旦保存可跟踪图像的列表超过1,我就会销毁旧会话(并创建一个新会话),但这会导致应用程序在恢复之前暂时冻结一秒钟


有没有关于更好的方法的建议?

好的,考虑到谷歌开发者对github的回复,这不是一个确切的解决方案,但它解决了这个问题。正如我在评论
TrackableQueryFilter.Updated中所说,Updated
为您提供在当前帧中更新的图像(不仅是状态,还包括位置等)。因此,当我在手机视图中记录我的图像并被跟踪时,我的图像会被更新18次

由于无法知道图像何时更新,而且更新也不频繁,所以我考虑检查图像是否在3秒钟内未更新,这样我就可以销毁图像。为此,我在我的
AugmentedImageVisualizer
脚本中添加了
public float TimePassed
。然后,在我的
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秒钟不满意,你也可以降低它。祝你好运

5个月后,这个问题仍然存在,谷歌真的很奇怪,他们没有解决这个问题,并且在Github上忽略了这些问题

我发现了一个利用AugmenteMageTrackingMethod的解决方法,它不是很理想,但我发现唯一有效的方法是:在augmenteMageController.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,它会起作用。

使用以下代码实现与TrackingState.Tracking和TrackingState.Stopped相同的场景。就在这里,我用过了。FullTracking和。lastnownpose。工作良好,并在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);
        }
    }

答案参考来自。

您已经有一个列表,其中包含ARCOre跟踪的所有增强图像,并且在您的
增强图像控制器中称为
m_TempAugmentedImages
。为什么不使用
m_TempAugmentedImages[m_TempAugmentedImages.Count]
?问题是,一旦识别出图像,其跟踪状态即变为TrackingState.tracking,即使之后识别出新图像。如果使用TrackableQueryFilter.New来填充m_TempAugmenteImage,则可以在上一个图像上销毁可视化工具并仅显示新图像,但如果要返回到上一个图像,则此操作无效。如果要在先前可视化的图像上可视化跟踪,该怎么办(并因此销毁了可视化工具)?该图像的TrackingState几乎肯定不会从跟踪更改,因此它不会在m_TempAugmenteImage中显示为正在更新。好的,我今天有机会构建并运行它。我们都有一个误解。我今天意识到,当您使用
TrackableQueryFilter时。updated
这只返回该f中的更新图像rame。因此,如果您的图像未更新,则不会返回任何内容。但是,此更新并不意味着其状态已更新。可能与图像的位置或理解有关,并且这种情况不会经常发生。如果我可以解决此问题,我将编辑此问题completely@giacomohomunculus我用定时器解决了这个问题并编辑了答案。我已经更新了我的代码,请看一下。。。。。。