嗨,我正在尝试为大约20个模型的不同图像增加不同的预制件。当前在AugmentedImage示例场景中使用2个模型对2个图像进行测试。我向每个预制件添加了脚本AugmentedImageVisualizer.cs,我将这两个模型拖放了脚本的模型。在AugmenetedImageExampleController.cs中,我进行了以下更改。
" 0"
在Rabbit预制件和Monkey预制件的预制件中添加了增强图像可视化脚本。
这是应该怎么做的?一旦模型出现,问题就不会消失。所以当我显示下一个图像时,另一个模型就放在了它上面。如何在不跟踪图像的情况下隐藏模型? / p>
在AugmentedImageControllerExample.cs中,我们使用下面的代码。我仍然不明白为什么模型在丢失图像跟踪后没有消失。
namespace GoogleARCore.Examples.AugmentedImage
{
using System.Collections.Generic;
using System.Runtime.InteropServices;
using GoogleARCore;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// Controller for AugmentedImage example.
/// </summary>
public class AugmentedImageExampleController : MonoBehaviour
{
/// <summary>
/// A prefab for visualizing an AugmentedImage.
/// </summary>
// public AugmentedImageVisualizer AugmentedImageVisualizerPrefab;
public List<AugmentedImageVisualizer> AugmentedImageVisualizerPrefab = new List<AugmentedImageVisualizer>();
/// <summary>
/// The overlay containing the fit to scan user guide.
/// </summary>
public GameObject FitToScanOverlay;
private Dictionary<int, AugmentedImageVisualizer> m_Visualizers
= new Dictionary<int, AugmentedImageVisualizer>();
private List<AugmentedImage> m_TempAugmentedImages = new List<AugmentedImage>();
/// <summary>
/// The Unity Update method.
/// </summary>
public void Update()
{
// Exit the app when the 'back' button is pressed.
if (Input.GetKey(KeyCode.Escape))
{
Application.Quit();
}
// Check that motion tracking is tracking.
if (Session.Status != SessionStatus.Tracking)
{
return;
}
// Get updated augmented images for this frame.
Session.GetTrackables<AugmentedImage>(m_TempAugmentedImages, TrackableQueryFilter.Updated);
// Create visualizers and anchors for updated augmented images that are tracking and do not previously
// have a visualizer. Remove visualizers for stopped images.
foreach (var image in m_TempAugmentedImages)
{
AugmentedImageVisualizer 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.
Anchor anchor = image.CreateAnchor(image.CenterPose);
visualizer = (AugmentedImageVisualizer)Instantiate(AugmentedImageVisualizerPrefab[image.DatabaseIndex], 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);
}
}
// Show the fit-to-scan overlay if there are no images that are Tracking.
foreach (var visualizer in m_Visualizers.Values)
{
if (visualizer.Image.TrackingState == TrackingState.Tracking)
{
FitToScanOverlay.SetActive(false);
return;
}
}
FitToScanOverlay.SetActive(true);
}
}
}
下面给出的AugmentedImageVisualizer.cs代码?我已经引用了此Link。
else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
{
m_Visualizers.Remove(image.DatabaseIndex);
GameObject.Destroy(visualizer.gameObject);
}
答案 0 :(得分:2)
问题是,在更新功能中,您始终将两个模型都设置为true。但是,您只应将要跟踪的模型设置为活动状态!因此,如评论中所述,您应该使用AugmentedImage DatabseIndex。
例如,您的Models[0]
是对应于数据库中第一个映像的模型,而Models[1]
是对应于第二个映像的模型。
所以代替:
// Wrong code, because you're always setting both models active
Models[0].SetActive(true);
Models[1].SetActive(true);
您可以写:
// Only set the tracking Image active
Models[Image.DatabaseIndex].SetActive(true);
另一件事是在您的if (Image != null && Image.TrackingState == TrackingState.Paused)
和if (Image != null && Image.TrackingState == TrackingState.Stopped)
中,您可以在停用模型后编写一个return;
,以便退出Update函数,而不必再次将模型设置为活动状态。
答案 1 :(得分:1)
TrackingState 无法正常工作。
在使用 TrackingState 的任何地方尝试使用 TrackingMethod 。 AugmentedImageExampleController 和 AugmentedImageVisualizer 脚本
TrackingMethod (跟踪方法)具有3种状态:完全跟踪,不跟踪, LastKnowPose 。
例如:下面的if语句将
if(image.TrackingState == TrackingState.Tracking && visualizer == null){}
更改为
如果(图像。 TrackingMethod == AugmentedImageTrackingMethod.FullTracking && visualizer == null){}
答案 2 :(得分:0)
这里是一个完整的工作示例,以防有人寻找此解决方案。 https://github.com/darshanpv/DigiCard