找回密码
 立即注册
搜索
EasyAR 教程 Unity 查看内容

EasyAR 初学者入门指南(6)---创建ImageTarget的不同方式

AlbertLee 2017-12-14 17:52

创建Target常用的几种方式

本篇主要讲解在Unity加载ImageTarget 的几种不同方式。

Step 1: 说明

1. ImageTarget是表示平面图像的target,大小可以在json文件里设置并通过setup方法来载入。

2.关于setup这个方法,它只会解析json文件或字符串。这个方法一般有三个参数:name,path,StorageType.

 (1)name:非空则配置名字为name的target,否则配置第一个target
 (2)path:若path是json文件路径,storageType 应该设置成APP或Assets或Absolute,表示路径的类型。json文件内部的路径应是绝对路径货相对于json文件的相对路径;若path 是json字符串,storageType应该设成 (App | Json) 或 (Assets | Json) 或 ( Absolute | Json) 。json字符串里的路径应该是绝对路径或相对于storageType所指向的根目录的相对路径。
 (3)StorageType:


3. Imagetarget 需要被ImageTracker 跟踪,或者说ImageTracker 实现了ImageTarget的检测与跟踪。需要首先调用 attachStreamer 将 FrameStreamer连接至ImageTracker,然后FrameStreamer 的输出图像将被tracker使用。可以通过start/stop 来开始和停止追踪。在Target可以被ImageTracker跟踪之前,你需要通过异步方法loadTarget/unloadTarget或同步方法loadTargetBlocked/unloadTargetBlocked将它载入。如果需要非阻塞的调用,推荐使用异步的接口。可以通过传入接口的回调来获取load/unload的结果。它有几个重要的方法:

  (a)loadTarget: 加载一个target进入tracker。这是个入口方法(异步),target只有在成功加载进入tracker 之后才能被识别与跟踪。加载过程会需要一些时间来完成,这段时间内新的和丢失的target的检测可能会花比平时更多的时间,但是检测到之后的跟踪不受影响。如果你希望知道加载的结果,需要处理callback数据。callback将会在其它线程上被调用。跟踪线程和除了其它加载/卸载之外的操作都不会被阻塞。


  (b)Start :开始跟踪算法。在有FrameStreamer 连接之前跟踪不会真正开始


  (c)stop :停止跟踪算法。调用start 来重新启动跟踪

Step 2: 开发环境


下载EasyAR SDK for Basic(Unitypackage),并导入Unity,示例如下:




常规操作,删除 Main Camera EasyAR_ImageTracker-1 拖到面板中,并填写Key


创建一个文件夹"StreamingAssets" 用来储存识别图.


识别图资源:链接: https://pan.baidu.com/s/1nvvb6Et 密码: 8pnw

Step 2: 第一种方法创建ImageTarget----图片名直接法

首先是最常规的方法,在之前的文章"EasyAR 初学者入门指南(1)---显示模型" 也提到过

然后我们把 ImageTarget 拖到面板中去

新建一个脚本"SampleImageTargetBehaviour" ,处理方法与之前相似:


然后删掉原先挂在ImageTarget 上面的脚本,将我们新建的"SampleImageTargetBehaviour" 脚本挂在上面,接下来就是我们第一种创建ImageTarget的方法:直接使用图片名.jpg,示例:


  • Path: 识别图的路径
  • Name:识别图的名字
  • Size:识别图的大小

Step 3: 第二种方法创建ImageTarget---- json 法

json是一种十分轻巧的语言,更容易的来管理识别图集。创建一个json文件"targets"
它的基本格式是:
{
"images" :
[
{
"image" : "idback.jpg",
"name" : "idback",
"size" : [8.56, 5.4],
"uid" : "uid-string, should NOT duplicate",
"meta" : "what ever string you like."
}
]
}
对于json配置图片,我们必要的两个字段是:
  • image ---- 导入到unity中的识别图名字+后缀格式
  • name ---- 识别图名字
ps,如果我们想配置多张图片信息,比如我们还在unity中导入了一张名为"argame00"的图片,那么我们就可以这样配置json,以此类推:
{
"images" :
[
{
"image" : "argame00.jpg",
"name" : "argame"
},
{
"image" : "idback.jpg",
"name" : "idback",
"size" : [8.56, 5.4],
"uid" : "uid-string, should NOT duplicate",
"meta" : "what ever string you like."
}
]
}

本次案例演示的targets(json)内容是:
{
  "images" :
  [
    {
      "image" : "sightplus/argame00.jpg",
      "name" : "argame"
    },
    {
      "image" : "idback.jpg",
      "name" : "idback",
      "size" : [8.56, 5.4],
      "uid" : "uid-string"
    }
  ]
}

然后我们再拖一个ImageTarget组件到面板中,这次用json的方式来配置:


Step 4: 第三种方法创建ImageTarget----代码动态生成

在文章的最开头我们提到了一些与ImageTarget 创建的相关接口与方法。还要给大家介绍一个特别重要的类:ImageTargetBaseBehaviour,它是在AR场景中控制ImageTarget 的组件,这是官网对它的介绍:


它有几个十分重要的方法:

(1)void  Bind(ImageTrackerBaseBehaviour  behaviour)


(2)bool SetupWithImage(string path,StorageType storageType,string targetname,Vector2 size


(3)bool SetupWithJsonFile(string path,StorageType storageType,string targetname)


 (4)bool SetupWithJsonString(string json,StorageType storageType ,string targetname)


下面是4种通过代码的方式灵活的创建ImageTarget。首先创建一个脚本“HelloARTarget” 

1. 通过图片动态加载ImageTarget

首先创建一个公共方法:CreateTarget()

 void CreateTarget(string targetName, out SampleImageTargetBehaviour targetBehaviour)
        {
            GameObject Target = new GameObject(targetName);
            Target.transform.localPosition = Vector3.zero;
            targetBehaviour = Target.AddComponent<SampleImageTargetBehaviour>();
        }

然后在Start()方法中实现,首先是创建两个基本实例:

SampleImageTargetBehaviour targetBehaviour;
ImageTrackerBehaviour tracker = FindObjectOfType<ImageTrackerBehaviour>();

然后通过图片创建Imagetarget 的关键方法:

// 调用之前的createTarget方法,创建ImageTargetBaseBehaviour
CreateTarget("argame01", out targetBehaviour);
// 连接前面创建的tracker
targetBehaviour.Bind(tracker);
//参数是:图片路径,图片名,size
targetBehaviour.SetupWithImage("sightplus/argame01.jpg", StorageType.Assets, "argame01", new Vector2());
//创建3d模型“Resources文件夹下的预制体模型”
GameObject duck02_1 = Instantiate(Resources.Load("duck02")) as GameObject;
duck02_1.transform.parent = targetBehaviour.gameObject.transform;


2. 通过json文件动态加载ImageTarget

CreateTarget("argame00", out targetBehaviour);
targetBehaviour.Bind(tracker);
targetBehaviour.SetupWithJsonFile("targets.json", StorageType.Assets, "argame");
GameObject duck02_2 = Instantiate(Resources.Load("duck02")) as GameObject;
duck02_2.transform.parent = targetBehaviour.gameObject.transform;

3. 通过json 格式动态加载ImageTarget

 string jsonString = @"
{
  ""images"" :
  [
    {
      ""image"" : ""sightplus/argame02.jpg"",
      ""name"" : ""argame02""
    }
  ]
}
";
CreateTarget("argame02", out targetBehaviour);
targetBehaviour.Bind(tracker);
targetBehaviour.SetupWithJsonString(jsonString, StorageType.Assets, "argame02");
GameObject duck02_3 = Instantiate(Resources.Load("duck02")) as GameObject;
duck02_3.transform.parent = targetBehaviour.gameObject.transform;

4. 通过json 文件格式动态加载所有ImageTarget

var targetList = ImageTargetBaseBehaviour.LoadListFromJsonFile("targets2.json", StorageType.Assets);
foreach (var target in targetList.Where(t => t.IsValid).OfType<ImageTarget>())
      {
          CreateTarget("argame03", out targetBehaviour);
          targetBehaviour.Bind(tracker);
          targetBehaviour.SetupWithTarget(target);
          GameObject duck03 = Instantiate(Resources.Load("duck03")) as GameObject;
          duck03.transform.parent = targetBehaviour.gameObject.transform;
       }


Step5 : 常用接口

鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋
分享至 : QQ空间
收藏