【问题标题】:ARCore + Unity + Augmented Images - Load different prefabs for different ImagesARCore + Unity + 增强图像 - 为不同图像加载不同的预制件
【发布时间】:2018-07-06 13:26:16
【问题描述】:

如何将不同的预制件分配给不同的图像?

现在,我的所有预制件都在彼此之上加载,但是我如何获得它,以便每个预制件仅在一个图像之上加载一次,因此每个图像都有不同的预制件?

我已经修改了示例代码(框架角)以加载到我自己的预制件中,并使用字典将预制件与数据库中的图像配对,但是当程序运行时,它会将所有预制件设置在同一个位置而不是在每张图片上放置一个预制件,它会将所有预制件放在每张图片上 - 这是我一直在使用的代码:

        public GameObject obj1, obj2, obj3, obj4;
    Dictionary<int, GameObject> imagePrefabPairs;
    public AugmentedImage Image;

    void Start()
    {
        instantiateDictionary();
    }

    // TODO: make initialisation dynamic, to match the size of the db.
    public void instantiateDictionary()
    {
        imagePrefabPairs = new Dictionary<int, GameObject>
        {
            { 0, obj1 },
            { 1, obj2 },
            { 2, obj3 },
            { 3, obj4 }
        };
    }

    public void Update()
    {
        if (Image == null || Image.TrackingState != TrackingState.Tracking)
        {
            obj1.SetActive(false);
            obj2.SetActive(false);
            obj3.SetActive(false);
            obj4.SetActive(false);
            return;
        }
        Pose _centerPose = Image.CenterPose;
        imagePrefabPairs[Image.DatabaseIndex].transform.localPosition = _centerPose.position;
        imagePrefabPairs[Image.DatabaseIndex].transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
        imagePrefabPairs[Image.DatabaseIndex].SetActive(true);
    }

我认为我需要某种 if 语句来询问是否加载了一个预制件,然后选择加载下一个预制件并让他们一次实例化一个,但我不知道该怎么做,或者是否有更直接的方法可以实现...?

【问题讨论】:

  • 你的描述很模糊。到目前为止,您尝试过什么?
  • *问题编辑得更清楚

标签: unity3d augmented-reality arcore android-augmented-reality


【解决方案1】:

您可以更改您的 AugmentedImageVisualizer 预制件,以便在开始时所有不同的对象都处于非活动状态 (.SetActive(false);) 要更改预制件,您可以将其添加到您的层次结构中,将所有对象设置为非活动状态,然后 应用 变化。应用后,您可以从游戏层次结构中删除预制件。

图 1:将现有预制添加到游戏层次结构中 图 2:将所有附加的对象设置为非活动(1)并将更改应用到预制件(2)

因此,当您从图像数据库中检测到图像时,会附加 AugmentedImageVisualizer 预制件,并且仅将具有给定索引的对象设置为活动状态。那么你的代码应该可以工作了。

因为一开始所有对象都处于非活动状态,所以您可以更改这部分代码:

if (Image == null || Image.TrackingState != TrackingState.Tracking)
    {
        obj1.SetActive(false);
        obj2.SetActive(false);
        obj3.SetActive(false);
        obj4.SetActive(false);
        return;
    }

这样您就只停用活动对象:

if (Image.TrackingState != TrackingState.Tracking)
        {
            imagePrefabPairs[Image.DatabaseIndex].SetActive(false);
            return;
        }

【讨论】:

  • 公共增强图像图像;公共 Gameobject [20] 模型;如何为特定图像设置特定模型?在上面的代码中,什么是 imagePrefabPairs?
  • @zyonneo imagePrefabPairs 是一个带有图像索引和 3d 游戏对象的字典: imagePrefabPairs = new Dictionary { { 0, obj1 }, { 1, obj2 }, { 2, obj3 }, { 3, obj4 } }; -> 查看问题中的代码
  • 如果没有跟踪到目标图像,如何隐藏预制件?
  • @zyonneo 我会尽力帮助您解决问题:stackoverflow.com/questions/53455908/…
【解决方案2】:

我通过这种方式将不同的预制件分配给不同的图像:

  • 我修改了AugmentedImageExampleController.cs:。
  • 我添加了一个预制件列表:

public List&lt;AugmentedImageVisualizer&gt; prefabs = new List&lt;AugmentedImageVisualizer&gt;();

  • 对于预制件的相关图像,我在可视化工具中使用image.DatabaseIndex 做了参考:

visualizer = (AugmentedImageVisualizer)Instantiate(prefabs[image.DatabaseIndex], anchor.transform);

您现在可以在ExampleController 的检查器中放入预制件(AugmentedImageVisualizer)。

就是这样,它工作正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2016-06-08
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多