Дополненное изображение ARCore - объект, который вы хотите создать, имеет значение null - PullRequest
0 голосов
/ 13 июля 2020

Я хочу создать приложение, которое будет распознавать изображения и добавлять к ним различные объекты. Я работаю над примером Google augmentedimage.

У меня есть сфера из двух объектов и куб. Оба являются префабами, и им обоим назначен AugmentedImageVisualizer.

AugmentedImageExampleController разделяет изображения должным образом, но когда AugmentedImageVisualizer хочет включить видимость для куба или сферы, происходит сбой с ошибкой. Объект, который вы хотите создать, имеет значение null.

Вот скрипты

public class AugmentedImageExampleController : MonoBehaviour
 {
     /// <summary>
     /// A prefab for visualizing an AugmentedImage.
     /// </summary>
     public AugmentedImageVisualizer[] AugmentedImageVisualizerPrefab;

     /// <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();
         }

         // 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)
         {
             int i = image.DatabaseIndex;
             AugmentedImageVisualizer visualizer = null;
             m_Visualizers.TryGetValue(image.DatabaseIndex, out visualizer);

             Debug.Log(image.DatabaseIndex);
             if (image.TrackingMethod  == AugmentedImageTrackingMethod.FullTracking && visualizer == null)
             {
                 // Create an anchor to ensure that ARCore keeps tracking this augmented image.
                 Anchor anchor = image.CreateAnchor(image.CenterPose);
                 Debug.Log("Anchor created");

                 visualizer = (AugmentedImageVisualizer)Instantiate(
                     AugmentedImageVisualizerPrefab[i], anchor.transform);
                 visualizer.Image = image;
                 m_Visualizers.Add(image.DatabaseIndex, visualizer);
             }
             else if (image.TrackingMethod  == AugmentedImageTrackingMethod.NotTracking && 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.TrackingMethod  == AugmentedImageTrackingMethod.FullTracking)
             {
                 FitToScanOverlay.SetActive(false);
                 return;
             }
         }

         FitToScanOverlay.SetActive(true);
     }
 }

и скрипт Visualiser

public class AugmentedImageVisualizer : MonoBehaviour
 {
     /// <summary>
     /// The AugmentedImage to visualize.
     /// </summary>
       public AugmentedImage Image;

  

     public GameObject prefabToInstantiate;

     /// <summary>
     /// The Unity Update method.
     /// </summary>
     public void Update()
     {
         if (Image == null || Image.TrackingMethod != AugmentedImageTrackingMethod.FullTracking)
         {
          
             prefabToInstantiate.SetActive(false);

             return;
         }

         float halfWidth = Image.ExtentX / 2;
         float halfHeight = Image.ExtentZ / 2;
         prefabToInstantiate.transform.localPosition =
             (halfWidth * Vector3.left) + (halfHeight * Vector3.back);
         prefabToInstantiate.SetActive(true);

     }

 }

Я попытался решить проблему с его запуском при запуске с помощью Instantiate ()

В визуализаторе но все равно не удалось. В оригинальном примере он не используется, он просто обеспечивает видимость игрового объекта.

Скриншоты: Пример контроллера: enter image description here

Sphere and cube are the same: введите описание изображения здесь

Unity error: 07-13 14:02:39.642 32121 32161 E Unity   : ArgumentException: The Object you want to instantiate is null.
07-13 14:02:39.642 32121 32161 E Unity   :   at UnityEngine.Object.Instantiate (UnityEngine.Object original, UnityEngine.Transform parent, System.Boolean instantiateInWorldSpace) [0x00044] in /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/UnityEngineObject.bindings.cs:261 
07-13 14:02:39.642 32121 32161 E Unity   :   at UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Transform parent, System.Boolean worldPositionStays) [0x00001] in /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/UnityEngineObject.bindings.cs:291 
07-13 14:02:39.642 32121 32161 E Unity   :   at UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Transform parent) [0x00001] in /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/UnityEngineObject.bindings.cs:286 
07-13 14:02:39.642 32121 32161 E Unity   :   at GoogleARCore.Examples.AugmentedImage.AugmentedImageExampleController.Update () [0x0009f] in C:\Users\\arcore\Assets\GoogleARCore\Examples\AugmentedImage\Scripts\AugmentedImageExampleController.cs:90 
...