如何使用Unity在ARcore增强图像场景中为不同图像显示不同的预制件?

时间:2018-11-24 06:54:46

标签: unity3d augmented-reality arcore

嗨,我正在尝试为大约20个模型的不同图像增加不同的预制件。当前在AugmentedImage示例场景中使用2个模型对2个图像进行测试。我向每个预制件添加了脚本AugmentedImageVisualizer.cs,我将这两个模型拖放了脚本的模型。在AugmenetedImageExampleController.cs中,我进行了以下更改。

" 0"

我的统一屏幕如下所示 Unity screen view

在Rabbit预制件和Monkey预制件的预制件中添加了增强图像可视化脚本。 Prefab-Inspector

这是应该怎么做的?一旦模型出现,问题就不会消失。所以当我显示下一个图像时,另一个模型就放在了它上面。如何在不跟踪图像的情况下隐藏模型? / 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);

            }

3 个答案:

答案 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

相关问题