【问题标题】:Using AugmentedImages with correct position/rotation after hosting a CloudAnchor在托管 CloudAnchor 后使用正确位置/旋转的 AugmentedImages
【发布时间】:2020-01-02 03:12:00
【问题描述】:

我正在为多个用户开发一个带有 arcore 的 AR 应用。因此,我正在使用云锚(如在云锚示例中)并希望添加一些增强图像。在我托管云锚之前,虚拟对象将显示在增强图像之上,一切都很好。在云锚设置(和托管)之后,增强图像的虚拟对象显示在完全不同的位置。当移动增强图像时,它们的位置和旋转会以一种意想不到的方式发生变化。它可能与 ARCoreWorldOriginHelper 类有关,它将统一位置转换为与云锚相关的位置,但我不知道如何解决这个问题。

我已经尝试过不同的设置。添加 AugmentedImageVisualizer 时(如在 AugmentedImage 示例中),我使用 ARCoreWorldOriginHelper 来转换图像的锚点。

        //Image augmentation. Get updated images for this frame.
        Session.GetTrackables<AugmentedImage>(augmentedImages, TrackableQueryFilter.Updated);

        //Create visualizers for updated augmented images that are tracking and do not previously have a visualizer. Remove visualizers for stopped images.
        foreach(AugmentedImage image in augmentedImages)
        {
            ARImageVisualizer visualizer = null;

            //when visualizer was added before
            visualizers.TryGetValue(image.DatabaseIndex, out visualizer);

            Debug.Log("Tracking State is " + image.TrackingState);

            //if no visualizer was found, add one
            if(visualizer == null && image.TrackingState == TrackingState.Tracking)
            {
                //Anchor anchor = image.CreateAnchor(image.CenterPose);
                Anchor anchor = image.CreateAnchor(ARCoreWorldOriginHelper.WorldToAnchorPose(image.CenterPose));
                visualizer = (ARImageVisualizer)Instantiate(ARImageVisualizer, anchor.transform);
                visualizer.Image = image;
                visualizers.Add(image.DatabaseIndex, visualizer);
            }
            //if tracking has stopped and will never resume
            else if ((visualizer != null && image.TrackingState == TrackingState.Stopped))
            {
                visualizers.Remove(image.DatabaseIndex);
                Destroy(visualizer.transform.parent.gameObject);    //destroy visualizer
            }
        }

在 AugmentedImageVisualizer 中,我尝试了正常程序:仅更改 localPosition。我还尝试使用 ARCoreWorldOriginHelper(仅使用 FrameUpperRight)来翻译它,但这根本不起作用(有时我什至找不到虚拟对象)。

//if no image is tracked, disable visualized object
        if (Image == null || Image.TrackingState != TrackingState.Tracking || Image.TrackingMethod != AugmentedImageTrackingMethod.FullTracking)
        {
            FrameLowerLeft.SetActive(false);
            FrameLowerRight.SetActive(false);
            FrameUpperLeft.SetActive(false);
            FrameUpperRight.SetActive(false);
            return;
        }

        float halfWidth = Image.ExtentX / 2;
        float halfHeight = Image.ExtentZ / 2;
        FrameLowerLeft.transform.localPosition = (halfWidth * Vector3.left) + (halfHeight * Vector3.back);
        FrameLowerRight.transform.localPosition = (halfWidth * Vector3.right) + (halfHeight * Vector3.back);
        FrameUpperLeft.transform.localPosition = (halfWidth * Vector3.left) + (halfHeight * Vector3.forward);
        //FrameUpperRight.transform.localPosition = (halfWidth * Vector3.right) + (halfHeight * Vector3.forward);

                Pose framePose = ARCoreWorldOriginHelper.WorldToAnchorPose(new Pose((halfWidth * Vector3.right) + (halfHeight * Vector3.forward), FrameUpperRight.transform.localRotation));
                FrameUpperRight.transform.localPosition = framePose.position;

        FrameLowerLeft.SetActive(true);
        FrameLowerRight.SetActive(true);
        FrameUpperLeft.SetActive(true);
        FrameUpperRight.SetActive(true);

有没有人已经尝试过这个并且知道要改变什么? 谢谢

【问题讨论】:

    标签: unity3d augmented-reality arcore


    【解决方案1】:

    最后我找到了该怎么做。问题是,您不能将锚点移动到不同的位置。锚点将始终在图像上。即使作为其他游戏对象的子对象,也无法移动锚点。因此,当智能手机/ARCoreRoot 不再是世界锚但云锚是时,要实现增强图像的偏移,您不需要创建锚。您只需实例化可视化器并使其成为另一个获得偏移量的游戏对象的子对象。然后更新可视化器在每一帧中的实际位置。使用偏移量,它将正确显示在图像上。在可视化器本身中,您可以使用普通代码:

         //Image augmentation. Get updated images for this frame.
            Session.GetTrackables<AugmentedImage>(augmentedImages, TrackableQueryFilter.Updated);
    
            //Create visualizers for updated augmented images that are tracking and do not previously have a visualizer. Remove visualizers for stopped images.
            foreach(AugmentedImage image in augmentedImages)
            {
                ARImageVisualizer visualizer = null;
    
                //when visualizer was added before
                visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
    
                //if no visualizer was found, add one
                if(visualizer == null && image.TrackingState == TrackingState.Tracking)
                {
                    //AugmentedImages is the parent gameobject with the offset
                    visualizer = (ARImageVisualizer)Instantiate(ARImageVisualizer, image.CenterPose.position, image.CenterPose.rotation, AugmentedImages.transform);
                    visualizer.Image = image;
                    visualizers.Add(image.DatabaseIndex, visualizer);
                }
                //if tracking has stopped and will never resume
                else if ((visualizer != null && image.TrackingState == TrackingState.Stopped))
                {
                    visualizers.Remove(image.DatabaseIndex);
                    Destroy(visualizer.transform.parent.gameObject);    //destroy visualizer
                }
                visualizer.transform.localPosition = image.CenterPose.position;
                visualizer.transform.localRotation = image.CenterPose.rotation;
            }
    
    //if no image is tracked, disable visualized object
            if (Image == null || Image.TrackingState != TrackingState.Tracking || Image.TrackingMethod != AugmentedImageTrackingMethod.FullTracking)
            {
                FrameLowerLeft.SetActive(false);
                FrameLowerRight.SetActive(false);
                FrameUpperLeft.SetActive(false);
                FrameUpperRight.SetActive(false);
                return;
            }
    
            float halfWidth = Image.ExtentX / 2;
            float halfHeight = Image.ExtentZ / 2;
            FrameLowerLeft.transform.localPosition = (halfWidth * Vector3.left) + (halfHeight * Vector3.back);
            FrameLowerRight.transform.localPosition = (halfWidth * Vector3.right) + (halfHeight * Vector3.back);
            FrameUpperLeft.transform.localPosition = (halfWidth * Vector3.left) + (halfHeight * Vector3.forward);
            FrameUpperRight.transform.localPosition = (halfWidth * Vector3.right) + (halfHeight * Vector3.forward);
    
    
            FrameLowerLeft.SetActive(true);
            FrameLowerRight.SetActive(true);
            FrameUpperLeft.SetActive(true);
            FrameUpperRight.SetActive(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2019-09-06
      • 2023-03-18
      相关资源
      最近更新 更多