123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
阅读:4316回复:11

Vuforia+Unity动态加载识别图和资源测试出问题!

楼主#
更多 发布于:2017-12-28 11:30
我测试下在Hierarchy面板中能实例化imagetarget和每个imagetarget之下都读取到模型,但就是识别图片时不能显示模型出来的,也没有报错的,有人知道这是什么问题啊?谢谢!

描述:可以读取实例化,但识别图片时不显示模型。

图片:QQ截图20171228111509.png

可以读取实例化,但识别图片时不显示模型。


源码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
using System.Xml;


public class SDCardDataSetLoader : MonoBehaviour {


    public GameObject VideoManager;             //在面板拖Easy Movie Texture的预制体VideoManager进来
    DataSet m_Dataset = null;
    ObjectTracker tracker;
    bool Bool_Loaded = false;
    public static bool initDone = false;            //控制模型加载完后再加载Dataset
    string xmlPath;
    public string xmlName;  //例如:StonesAndChips.xml     由Vuforia生成
    int ImageTargetCount;                      //存放要加载的Dataset中的识别图数量
    List<string> ModelName = new List<string>();            //存放模型名字列表
    GameObject a;
    


    // Use this for initialization
    void Start()
    {
        ModelName.Clear();
        ImageTargetCount = 0;
        xmlPath = Application.streamingAssetsPath + "/Vuforia/" + "ARLF3DShowData" + ".xml";
      //  xmlPath = Application.persistentDataPath + "ARLF3DShowData" + ".xml";
        GetXML(xmlPath);
        LoadModel();
      
        
    }


    // Update is called once per frame
    void Update()
    {
        
        
        if (initDone)
        {
            if (VuforiaRuntimeUtilities.IsVuforiaEnabled() && !Bool_Loaded)
            {
                if (m_Dataset == null)
                {
                    tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
                    m_Dataset = tracker.CreateDataSet();


                }
                Bool_Loaded = m_Dataset.Load(xmlPath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE);
                tracker.ActivateDataSet(m_Dataset);


                int i = ImageTargetCount;
                foreach (GameObject go in GameObject.FindObjectsOfType(typeof(GameObject)))
                {


                    if (go.name == "New Game Object")
                    {
                        go.name = "ImageTarget_" + ModelName[i - 1];
                        go.AddComponent<TurnOffBehaviour>();
                        go.AddComponent<DefaultTrackableEventHandler>();
                        go.AddComponent<FindSon>();
                        i--;


                    }
                }
            }
        }


        //     Debug.Log(subGameObject.name);
    }


    void LoadModel()
    {
        for (int i = ImageTargetCount; i > 0; i--)
        {
            if (ModelName[i - 1].Contains("video_"))                            //加载Video
            {
                print("video~~~~~~");
                GameObject tmp = Instantiate(VideoManager) as GameObject;
                tmp.name = ModelName[i - 1] + "(Clone)";
            }
            else
            {
                //加载模型 assetbundle 包,请修改成自己的对应地址
               // string GameObjectPath = "file:///" + Application.persistentDataPath + "/Scenes/" + "ARShow3DModel" + "/" + ModelName[i - 1] + ".assetbundle";
                string GameObjectPath = Application.dataPath + "/StreamingAssets/" + ModelName[i - 1] + ".assetbundle";
              
                StartCoroutine(LoadMainGameObject(GameObjectPath));
            }
        }
        initDone = true;
    }




    /// <summary>
    /// 解析XML
    /// </summary>
    /// <param name="path">XML地址</param>
    void GetXML(string path)
    {
        int _ImageTargetCount = 0;
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(path);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode("QCARConfig").ChildNodes;
        foreach (XmlElement xe in nodeList)
        {
            Debug.Log("NAME :" + xe.Name);
            foreach (XmlElement x1 in xe.ChildNodes)
            {


                if (x1.Name == "ImageTarget")
                {
                    _ImageTargetCount++;
                    Debug.Log("VALUE :" + x1.GetAttribute("name"));
                    ModelName.Add(x1.GetAttribute("name"));
                }
            }
        }
        Debug.Log(_ImageTargetCount);
        ImageTargetCount = _ImageTargetCount;
    }




    /// <summary>
    /// 加载AssetBundle
    /// </summary>
    /// <param name="path">AssetBundle地址</param>
    /// <returns></returns>
   /*  private IEnumerator LoadMainGameObject(string path)
      {
      print(path);
          WWW bundle = new WWW(path);
          yield return bundle;
          yield return Instantiate(bundle.assetBundle.mainAsset);
          bundle.assetBundle.Unload(false);
      }*/
    IEnumerator LoadMainGameObject(string path)
    {
        print(path);
        string path1 = path.Substring(path.Length-16);
        string path2 = path1.Replace(".assetbundle", "");
        print("000:"+path2);
        WWW w = new WWW(path);
        yield return w;


        if (w.isDone)
        {
            AssetBundle ab = AssetBundle.LoadFromFile(path);


            GameObject go = ab.LoadAsset<GameObject>(path2);
            
            a = Instantiate(go);
            ab.Unload(false);
        }
    }
    public void BackButton()
    {
        Application.LoadLevel(0);


    }
}








using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class FindSon : MonoBehaviour {


 
  // Use this for initialization
    void Start () {
 
    }
    
    // Update is called once per frame
    void Update () {
        if(SDCardDataSetLoader.initDone)
        {
            foreach (GameObject go in GameObject.FindObjectsOfType(typeof(GameObject)))
            {
                //print("111:"+gameObject.name.Substring(23) + "(Clone)");
                if (go.name == (gameObject.name.Substring(23) + "(Clone)"))//识别图名字格式:ImageTarget_(模型名字),此处根据模型名字找它的子物体
                {
                    go.transform.parent = gameObject.transform;
                    go.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
                    go.transform.localPosition = new Vector3(0, 0, 0);
 
                    if(go.name.Contains("video_"))//视频(非模型,用的是Easy Movie Texture插件)
                    {
                        go.transform.localEulerAngles = new Vector3(90, 0, 0);
                    }
 
                //    go.AddComponent<Move>();
 
                    Renderer[] rendererComponents = go.GetComponentsInChildren<Renderer>(true);
                    Collider[] colliderComponents = go.GetComponentsInChildren<Collider>(true);
                    // Disable rendering:
                    foreach (Renderer component in rendererComponents)
                    {
                        component.enabled = false;
                    }
                    // Disable colliders:
                    foreach (Collider component in colliderComponents)
                    {
                        component.enabled = false;
                    }
 
                    Destroy(gameObject.GetComponent<FindSon>());
                }
            }
        }
    }
}

欢迎分享

归海一啸
光明使者
光明使者
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2017-12-28 13:02
注意一下加载的路径
AR学院(www.arvrschool.com),从这里感触未来!
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
板凳#
发布于:2017-12-28 13:50
大神,你好!你说加载路径是模型的加载路径?我试过其他的路径了,模型在ImageTarget之下实例化但是识别图片时就不能显示出来的,没有反应,也没有报错的!所以想请教下你!谢谢你!
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
地板#
发布于:2017-12-28 13:54
归海一啸:注意一下加载的路径回到原帖
大神,你好!你说加载路径是模型的加载路径?我试过其他的路径了,模型在ImageTarget之下实例化但是识别图片时就不能显示出来的,没有反应,也没有报错的!所以想请教下你是什么问题!谢谢你!
归海一啸
光明使者
光明使者
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
4楼#
发布于:2017-12-28 14:50
123wu:大神,你好!你说加载路径是模型的加载路径?我试过其他的路径了,模型在ImageTarget之下实例化但是识别图片时就不能显示出来的,没有反应,也没有报错的!所以想请教下你是什么问题!谢谢你!回到原帖
那么看下实例出来的模型的位置和尺寸,可能因为这个而看不到。直接在Hierarchy面板中双击在scene中查看
AR学院(www.arvrschool.com),从这里感触未来!
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
5楼#
发布于:2017-12-28 16:03
归海一啸:那么看下实例出来的模型的位置和尺寸,可能因为这个而看不到。直接在Hierarchy面板中双击在scene中查看回到原帖
大神,我找到问题了!正常静态能识别图片时是这样的:勾上Mesh Renderer渲染的,

图片:QQ截图20171228153756.png

。而动态识别图片时却没有勾上渲染的:

图片:QQ截图20171228153722.png

。所以我想请教下这怎么样解决?非常感谢!
归海一啸
光明使者
光明使者
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
6楼#
发布于:2017-12-28 16:50
试试这个,加载之后用代码去使能,getComponent<>.enabled = true
AR学院(www.arvrschool.com),从这里感触未来!
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
7楼#
发布于:2017-12-28 17:29
归海一啸:试试这个,加载之后用代码去使能,getComponent<>.enabled = true回到原帖
不好意思!因为我是新手小白啊!不太明白! getComponent<>.enabled = true这是让模型加载后渲染吗?Renderer[] rendererComponents = go.GetComponentsInChildren<Renderer>(true);
foreach (Renderer component in rendererComponents)
                    {
                        component.enabled = false;
                    }和原来这个渲染有冲突或关系吗?能详细说明下怎么解决吗?真的非常感谢您!
归海一啸
光明使者
光明使者
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
8楼#
发布于:2017-12-28 17:37
123wu:不好意思!因为我是新手小白啊!不太明白! getComponent<>.enabled = true这是让模型加载后渲染吗?Renderer[] rendererComponents = go.GetComponentsInChildren...回到原帖
好吧,我大概明白了。你这个用的官方的sample改的吗?在未识别到图片的时候,会执行你发的那段代码,然后模型不显示,识别到目标图片之后,才会显示模型。你验证下是否识别出卡片。。
AR学院(www.arvrschool.com),从这里感触未来!
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
9楼#
发布于:2017-12-28 18:08
归海一啸:好吧,我大概明白了。你这个用的官方的sample改的吗?在未识别到图片的时候,会执行你发的那段代码,然后模型不显示,识别到目标图片之后,才会显示模型。你验证下是否识别出卡片。。回到原帖
好的!我想下测试下,非常感谢大神您今天的解答!如果还有问题还希望大神您帮忙解答下的。非常感谢!
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
10楼#
发布于:2017-12-29 11:20
归海一啸:好吧,我大概明白了。你这个用的官方的sample改的吗?在未识别到图片的时候,会执行你发的那段代码,然后模型不显示,识别到目标图片之后,才会显示模型。你验证下是否识别出卡片。。回到原帖
大神,我还有个问题想请问下,我想可能不能识别图片的问题是:动态加载识别图片数据时的ID是从1开始的,但不知道为什么发现识别ID却从5开始了。我看不懂这一段怎么修改!能帮我看下怎么修改下吗?谢谢你!

图片:QQ截图20171229104809.png

图片:QQ截图20171229104724.png




源码:

public class SDCardDataSetLoader : MonoBehaviour {


    DataSet m_Dataset = null;
    ObjectTracker tracker;
    bool Bool_Loaded = false;
    public static bool initDone = false;            //控制模型加载完后再加载Dataset
    string xmlPath;
    public string xmlName;  //例如:StonesAndChips.xml     由Vuforia生成
    int ImageTargetCount;                      //存放要加载的Dataset中的识别图数量
    List<string> ModelName = new List<string>();            //存放模型名字列表
    
    // Use this for initialization
    void Start()
    {
        ModelName.Clear();
        ImageTargetCount = 0;
        xmlPath = Application.streamingAssetsPath + "/Vuforia/" + "ARLF3DShowData" + ".xml";
      //  xmlPath = Application.persistentDataPath + "ARLF3DShowData" + ".xml";
        GetXML(xmlPath);
        LoadModel();
      
        
    }


    // Update is called once per frame
    void Update()
    {
        
        
       if (initDone)
       {
           if (VuforiaRuntimeUtilities.IsVuforiaEnabled() && !Bool_Loaded)
           {
               if (m_Dataset == null)
               {
                   tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
                   m_Dataset = tracker.CreateDataSet();


               }
               Bool_Loaded = m_Dataset.Load(xmlPath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE);
               tracker.ActivateDataSet(m_Dataset);


                int i = ImageTargetCount;
                foreach (GameObject go in GameObject.FindObjectsOfType(typeof(GameObject)))
                {


                    if (go.name == "New Game Object")
                    {
                        go.name = "ImageTarget_" + ModelName[i - 1];
                        go.AddComponent<TurnOffBehaviour>();
                        go.AddComponent<DefaultTrackableEventHandler>();
                        go.AddComponent<FindSon>();
                        i--;


                    }
                }
            }
        }


        //     Debug.Log(subGameObject.name);
    }
123wu
侠客
侠客
  • UID4996
  • 粉丝0
  • 关注0
  • 发帖数14
11楼#
发布于:2018-01-02 11:06
归海一啸:好吧,我大概明白了。你这个用的官方的sample改的吗?在未识别到图片的时候,会执行你发的那段代码,然后模型不显示,识别到目标图片之后,才会显示模型。你验证下是否识别出卡片。。回到原帖
大神,能帮我看下为什么动态加载识别图片和资源时,那个追踪ID会自动增加2位的?例如我读取2张识别图时,那识别图ID是1、2,但那个追踪ID会是4、5的。所以不能识别到图片,模型就不能显示了。非常感谢!
游客

返回顶部