ARCORE扩展ImageTracking /在Unity锚固API

问题描述 投票:1回答:3

附带统一SDK包ARCORE AugmentedImage示例应用程序将围绕包括在样品AugmentedImageDatabase样本图像的图像帧。它将周围放置多张图像的相框在现场,如果他们被发现,只有破坏一次跟踪完全失去了相框。

假设你想只显示图像周围的图像帧最近的认可 - 从以前的图像删除帧?检查给定的图像的TrackingState没有帮助,因为跟踪默认情况下,没有任何办法来关闭扩展,并锚API不提供,这将有助于要么任何信息。

我把它摧毁旧的会话(并创建一个新的),一旦持有可跟踪图像超过1名单的工作,但是这会导致应用程序恢复之前暂时冻结了一秒钟。

是否有一个更好的办法的建议做到这一点?

unity3d augmented-reality arcore
3个回答
1
投票

好吧,这是不考虑的回应来自谷歌开发这个github上issue一个确切的解决方案,但它解决了问题。正如我在我的评论说TrackableQueryFilter.Updated为您提供了更新(不只是在状态,但位置等方面)在当前帧图像。因此,当我登录的m_TempAugmentedImages.Count为318帧,而我的形象在我的电话的视图,并进行跟踪,我的形象被更新18次。

由于没有当图像被更新,它不是频繁发生的办法知道,我想检查,如果没有更新图像,3秒钟我就可以破坏形象。为了做到这一点,我添加public float TimePassedAugmentedImageVisualizer脚本。然后在我的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秒就可以降低它。祝好运


0
投票

5个月后,这问题还是存在的,从谷歌真的奇怪,他们并没有解决这个问题,并忽略在Github等问题。

我发现,利用AugmentedImageTrackingMethod解决方法,这是不是很最优的,但我发现的唯一的事情是工作原理:在更新方法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
投票

使用下面的代码来实现相同的情况TrackingState.Tracking和TrackingState.Stopped的。它只是这里我用AugmentedImageTrackingMethod.FullTracking和AugmentedImageTrackingMethod.LastKnownPose。做工精细,并与Unity引擎不同的图像测试。

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

© www.soinside.com 2019 - 2024. All rights reserved.