【发布时间】: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