首页 > 解决方案 > 有没有办法稳定增强图像上的 3D 对象

问题描述

我正在设置一个场景,需要我的对象出现在增强图像的一个角落。

我创建了一个脚本来查找增强图像并将其设置为锚点。domPrefab 在锚点的位置上实例化

            if (image.TrackingState == TrackingState.Tracking && visualizer == null)
            {
                //First: detect the augmented image

                Anchor imageAnchor = image.CreateAnchor(image.CenterPose);
                visualizer = Instantiate(AugmentedImageVisualizerPrefab, imageAnchor.transform, imageAnchor);
                visualizer.Image = image;
                m_Visualizers.Add(image.DatabaseIndex, visualizer);

                //Second: Instantiate the prefabs

            GameObject prefab = domPrefab;
            var domObject = Instantiate(prefab, anchor.transform.position, anchor.transform.rotation);
            domObject.transform.Rotate(0, k_ModelRotation, 0, Space.Self);
            domObject.transform.SetParent(anchor.transform, true);
            }

我希望 domPrefab 被实例化在增强图像的中心,当我将学习如何将它放置在角落时,然后让 domPrefab 出现在图像的角落。

实际结果是:domPrefab 出现在图像中间但不稳定。当相机环顾四周时,它会移动一点,并且它的比例会发生变化。

标签: c#imageunity3danchorarcore

解决方案


因为您正在使用这条线在图像中心创建锚点

Anchor imageAnchor = image.CreateAnchor(image.CenterPose);

然后在位置实例化您的可视化imageAnchor器,然后尝试旋转移动或其他东西,但您可以在AugmentedImageVisualizer. 去做这个

  1. 创建一个空对象并将AugmentedImageVisualizer脚本附加到它。
  2. 创建一个public GameObject myModelAugmentedImageVisualizer
  3. 将您的模型作为子对象放入该对象并将其拖到myModel检查器中。
  4. 用这个对象创建一个预制件
  5. 像这样修改你的AugmentedImageVisualizer

    public AugmentedImage Image;
    public GameObject myModel;
    
    public void Update()
    {
    
        float halfWidth = Image.ExtentX / 2;
        float halfHeight = Image.ExtentZ / 2;
    
        // for upper left
        myModel.transform.localPosition = (halfWidth * Vector3.left) + (halfHeight * Vector3.back);
        //for upper right
        myModel.transform.localPosition = (halfWidth * Vector3.right) + (halfHeight * Vector3.back);
        //for lower left
        myModel.transform.localPosition = (halfWidth * Vector3.left) + (halfHeight * Vector3.forward);
        //for lower right
        myModel.transform.localPosition = (halfWidth * Vector3.right) + (halfHeight * Vector3.forward);
    
    }
    
  6. AugmentedImageVisualizer在你的一样使用它AugmentedImageExampleController

如果您希望它稳定且不随时间改变位置,请在第五步中执行操作,Start而不是在另一个函数中Update或在另一个函数中执行,并确保它只运行一次

我希望这有助于祝你好运!


推荐阅读