附带统一SDK包ARCORE AugmentedImage示例应用程序将围绕包括在样品AugmentedImageDatabase样本图像的图像帧。它将周围放置多张图像的相框在现场,如果他们被发现,只有破坏一次跟踪完全失去了相框。
假设你想只显示图像周围的图像帧最近的认可 - 从以前的图像删除帧?检查给定的图像的TrackingState没有帮助,因为跟踪默认情况下,没有任何办法来关闭扩展,并锚API不提供,这将有助于要么任何信息。
我把它摧毁旧的会话(并创建一个新的),一旦持有可跟踪图像超过1名单的工作,但是这会导致应用程序恢复之前暂时冻结了一秒钟。
是否有一个更好的办法的建议做到这一点?
好吧,这是不考虑的回应来自谷歌开发这个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秒就可以降低它。祝好运
5个月后,这问题还是存在的,从谷歌真的奇怪,他们并没有解决这个问题,并忽略在Github等问题。
我发现,利用AugmentedImageTrackingMethod解决方法,这是不是很最优的,但我发现的唯一的事情是工作原理:在更新方法AugmentedImageController.cs
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
使用下面的代码来实现相同的情况TrackingState.Tracking和TrackingState.Stopped的。它只是这里我用AugmentedImageTrackingMethod.FullTracking和AugmentedImageTrackingMethod.LastKnownPose。做工精细,并与Unity引擎不同的图像测试。
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。