You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中AR图像追踪无法识别图片问题求助

ARFoundation+ARKit图像追踪失效问题求助

我正在使用Unity 2020.3结合ARKit与ARFoundation开发一款图像追踪应用,需求是在不同二维码上生成立方体。最初按官方教程操作,但图像追踪功能完全无法正常工作——没有立方体生成,仿佛Reference Library和图像追踪完全识别不了我的图片。

以下是我最初使用教程图片和二维码测试的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

[RequireComponent(typeof(ARTrackedImageManager))]
public class TrackingManager : MonoBehaviour
{
    ARTrackedImageManager imageManager;

    [SerializeField]
    GameObject spawnablePrefab;
    GameObject spawnedObject;

    // Start is called before the first frame update
    void Start()
    {
        imageManager = GetComponent<ARTrackedImageManager>();
    }

    // Update is called once per frame
    void Update()
    {
        if(imageManager == null)
        {
            Debug.Log("Could not find the image manager.");
        }
    }

    void OnEnable() => imageManager.trackedImagesChanged += OnChanged;

    void OnDisable() => imageManager.trackedImagesChanged -= OnChanged;

    void OnChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        foreach (ARTrackedImage newImage in eventArgs.added)
        {
             if(newImage.referenceImage.name == "arMarker1") // && trackedImage.trackingState == TrackingState.Tracking)
            {
                Debug.Log("Found Marker 1!");
                if (spawnedObject == null)
                {
                    SpawnPrefab(newImage.transform.position, newImage.transform.rotation);
                }
                    
                spawnedObject.transform.position = newImage.transform.position;
                spawnedObject.transform.rotation = newImage.transform.rotation;
            }
        }

        foreach (ARTrackedImage updatedImage in eventArgs.updated)
        {
            if (updatedImage.referenceImage.name.Equals("arMarker1") && updatedImage.trackingState == TrackingState.Tracking)
            {
                if(spawnedObject != null)
                {
                    spawnedObject.transform.SetPositionAndRotation(updatedImage.transform.position, updatedImage.transform.rotation);
                }
            }
        }

        foreach (ARTrackedImage removedImage in eventArgs.removed)
        {
            if (removedImage.referenceImage.name.Equals("arMarker1") && removedImage.trackingState == TrackingState.None)
            {
                if (spawnedObject != null)
                {
                    Destroy(spawnedObject);
                }
            }
        }
    }
    private void SpawnPrefab(Vector3 spawnPosition, Quaternion spawnRotation)
    {
        spawnedObject = Instantiate(spawnablePrefab, spawnPosition, spawnRotation);
    }
}

此后我尝试了多种不同方案,但问题仍未解决。以下是我当前用于测试二维码的脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

[RequireComponent(typeof(ARTrackedImageManager))]
public class TrackingManager : MonoBehaviour
{

    List<string> prefabs;

    ARTrackedImageManager imageManager;

    //Maps reference images to their associated prefabs.
    Dictionary<Guid, GameObject> imageToPrefab = new Dictionary<Guid, GameObject>();
    //Tracks currently instanciated prefabs.
    Dictionary<Guid, GameObject> instantiated = new Dictionary<Guid, GameObject>();

    // Start is called before the first frame update
    void Start()
    {
        imageManager = GetComponent<ARTrackedImageManager>();

        prefabs = new List<string>();
        prefabs.Add("orange"); 
        prefabs.Add("green");
        prefabs.Add("blue");

        SetupPrefabs();
    }

    // Update is called once per frame
    void Update()
    {
        if(imageManager == null)
        {
            Debug.Log("Could not find the image manager.");
        }
    }
    
    void OnEnable() => imageManager.trackedImagesChanged += OnChanged;

    void OnDisable() => imageManager.trackedImagesChanged -= OnChanged;

    void OnChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        foreach (ARTrackedImage newImage in eventArgs.added)
        {
            if(imageToPrefab.TryGetValue(newImage.referenceImage.guid, out var prefab))
            {
                instantiated[newImage.referenceImage.guid] = Instantiate(prefab, newImage.transform);
            }
        }

        foreach (ARTrackedImage updatedImage in eventArgs.updated)
        {
            if(imageToPrefab.ContainsKey(updatedImage.referenceImage.guid))
            {
                instantiated[updatedImage.referenceImage.guid].transform.position = updatedImage.transform.position;
                instantiated[updatedImage.referenceImage.guid].transform.rotation = updatedImage.transform.rotation;
            }
        }
    }

    private void SetupPrefabs()
    {
        for(int i=0; i<imageLib.count; i++)
        {
            imageToPrefab.Add(imageLib[i].guid, (GameObject)Resources.Load("/Prefabs/" + prefabs[i] + "Cube"));
        }
    }
}

我现在完全不知道该尝试什么方法了,希望能得到帮助!

(编辑于5/5:最初发布了错误代码)


内容的提问来源于stack exchange,提问作者Haley C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:30:39