Unity SDK软件包随附的ARCore AugmentedImage示例应用程序在示例AugmentedImageDatabase中包含的示例图像周围放置了一个相框。如果找到它们,它将在场景中的多个图像周围放置一个相框,并且仅在完全失去跟踪后才销毁这些相框。
假设您只想在最近识别的图像周围显示相框-并从上一张图像中删除该相框?检查给定图像的TrackingState没有帮助,因为默认情况下跟踪已扩展且没有任何关闭方式,并且锚定API也未提供任何有帮助的信息。
一旦包含可跟踪图像的列表超过1,我就通过销毁旧会话(并创建一个新会话)来工作,但这导致该应用暂时冻结一秒钟,然后再继续。
是否有更好的建议?
答案 0 :(得分:1)
考虑到Google开发人员对此github issue的回复,这不是一个确切的解决方案,但可以解决此问题。正如我在评论中所说的,TrackableQueryFilter.Updated
为您提供了在当前帧中更新的图像(不仅是状态,还包括位置等)。因此,当我的图像在手机视图中并被跟踪时,当m_TempAugmentedImages.Count
记录318帧时,我的图像将更新18次。
由于没有办法知道何时更新映像并且它不经常发生,因此我想到检查映像是否在3秒钟内未更新,因此可以销毁映像。为此,我在public float TimePassed
脚本中添加了AugmentedImageVisualizer
。然后,在我的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秒钟,也可以降低它。祝你好运
答案 1 :(得分:0)
5个月后,这个问题仍然存在,从Google真的很奇怪,他们没有解决此问题,并且忽略了Github上的此类问题。
我发现了一种利用AugmentedImageTrackingMethod的解决方法,它不是非常理想,但我发现唯一可行的方法:在AugmentedImageController.cs的Update方法中
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,就可以解决问题。
答案 2 :(得分:0)
使用以下代码实现与TrackingState.Tracking和TrackingState.Stopped相同的方案。我在这里使用过AugmentedImageTrackingMethod。FullTracking和AugmentedImageTrackingMethod。LastKnownPose。工作正常,并在Unity Engine中使用其他图像进行了测试。
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。