ARCore + Unity +增强图像-为不同图像加载不同的预制件

时间:2018-07-06 13:26:16

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

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

现在,我所有的预制件都相互装载,但是如何获取,这样每个预制件只能在一个图像上装载一次,因此每个图像都有不同的预制件?

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

        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语句来询问是否加载了一个预制件,然后选择加载下一个预制件并让它们一次实例化一个,但是我不确定如何做到这一点。 ,或者是否有更直接的方法来实现这一目标...?

2 个答案:

答案 0 :(得分:2)

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

enter image description here 图1:将现有的预制件添加到游戏层次中 enter image description here 图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;
        }

答案 1 :(得分:0)

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

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

public List<AugmentedImageVisualizer> prefabs = new List<AugmentedImageVisualizer>();

  • 对于预制件的相关图像,我通过使用可视化器中的image.DatabaseIndex作了参考:

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

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

就这样,它可以正常工作!