Я разрабатываю приложение 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);
Кто-нибудь уже пробовал это и знает, что изменить?
Спасибо