Unity3d Unity中的ARCore扩展图像跟踪/锚定API
Unity SDK包附带的ARCore AugmenteImage示例应用程序会在示例AugmenteImage数据库中包含的示例图像周围放置一个图片框。如果发现了场景中的多个图像,它会在这些图像周围放置一个画框,并且只有在跟踪完全丢失后才会销毁这些画框 假设您只想在最近识别的图像周围显示一个相框,并从上一个图像中删除该相框?检查给定图像的TrackingState没有帮助,因为默认情况下跟踪是扩展的,没有任何关闭的方法,并且锚API也没有提供任何有用的信息 一旦保存可跟踪图像的列表超过1,我就会销毁旧会话(并创建一个新会话),但这会导致应用程序在恢复之前暂时冻结一秒钟Unity3d Unity中的ARCore扩展图像跟踪/锚定API,unity3d,augmented-reality,arcore,Unity3d,Augmented Reality,Arcore,Unity SDK包附带的ARCore AugmenteImage示例应用程序会在示例AugmenteImage数据库中包含的示例图像周围放置一个图片框。如果发现了场景中的多个图像,它会在这些图像周围放置一个画框,并且只有在跟踪完全丢失后才会销毁这些画框 假设您只想在最近识别的图像周围显示一个相框,并从上一个图像中删除该相框?检查给定图像的TrackingState没有帮助,因为默认情况下跟踪是扩展的,没有任何关闭的方法,并且锚API也没有提供任何有用的信息 一旦保存可跟踪图像的列表超过1,我就
有没有关于更好的方法的建议?好的,考虑到谷歌开发者对github的回复,这不是一个确切的解决方案,但它解决了这个问题。正如我在评论
TrackableQueryFilter.Updated中所说,Updated
为您提供在当前帧中更新的图像(不仅是状态,还包括位置等)。因此,当我在手机视图中记录我的图像并被跟踪时,我的图像会被更新18次
由于无法知道图像何时更新,而且更新也不频繁,所以我考虑检查图像是否在3秒钟内未更新,这样我就可以销毁图像。为此,我在我的AugmentedImageVisualizer
脚本中添加了public float TimePassed
。然后,在我的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上忽略了这些问题 我发现了一个利用AugmenteMageTrackingMethod的解决方法,它不是很理想,但我发现唯一有效的方法是:在augmenteMageController.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相同的场景。就在这里,我用过了。FullTracking和。lastnownpose。工作良好,并在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);
}
}
答案参考来自。您已经有一个列表,其中包含ARCOre跟踪的所有增强图像,并且在您的
增强图像控制器中称为m_TempAugmentedImages
。为什么不使用m_TempAugmentedImages[m_TempAugmentedImages.Count]
?问题是,一旦识别出图像,其跟踪状态即变为TrackingState.tracking,即使之后识别出新图像。如果使用TrackableQueryFilter.New来填充m_TempAugmenteImage,则可以在上一个图像上销毁可视化工具并仅显示新图像,但如果要返回到上一个图像,则此操作无效。如果要在先前可视化的图像上可视化跟踪,该怎么办(并因此销毁了可视化工具)?该图像的TrackingState几乎肯定不会从跟踪更改,因此它不会在m_TempAugmenteImage中显示为正在更新。好的,我今天有机会构建并运行它。我们都有一个误解。我今天意识到,当您使用TrackableQueryFilter时。updated
这只返回该f中的更新图像rame。因此,如果您的图像未更新,则不会返回任何内容。但是,此更新并不意味着其状态已更新。可能与图像的位置或理解有关,并且这种情况不会经常发生。如果我可以解决此问题,我将编辑此问题completely@giacomohomunculus我用定时器解决了这个问题并编辑了答案。我已经更新了我的代码,请看一下。。。。。。