Использование AugmentedImages с правильной позицией / поворотом после размещения CloudAnchor - PullRequest
0 голосов
/ 07 июля 2019

Я разрабатываю приложение AR с arcore для нескольких пользователей. Поэтому я использую привязку к облаку (как в примере привязки к облаку) и хочу добавить несколько дополненных изображений. Перед размещением привязки к облаку виртуальные объекты будут отображаться поверх дополненных изображений, и все в порядке. После того, как якорь облака установлен (и размещен), виртуальные объекты дополненного изображения отображаются в совершенно другом положении. Их положение и вращение изменяются при перемещении дополненного изображения, но неожиданным образом. Вероятно, это как-то связано с классом 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);

Кто-нибудь уже пробовал это и знает, что изменить? Спасибо

1 Ответ

0 голосов
/ 14 июля 2019

В конце концов я узнал, что делать.Проблема в том, что вы не можете переместить якорь в другое положение.Якорь всегда будет на изображении.Даже будучи ребенком какого-то другого игрового объекта, якорь нельзя перемещать.Таким образом, чтобы добиться смещения для дополненных изображений, когда смартфон / 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);
...