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

EasyAR 初学者入门指南(7)---3D物体识别与跟踪

AlbertLee 2017-12-22 10:59

如何使用EasyAR SDK来进行有纹理的3D物体识别与跟踪

目前市面上的AR内容多数是基于平面2d图片的,基于3d物体识别与跟踪的案例或营销十分少,其主要原因是由于底层算法的不成熟。EasyAR SDK目前的版本很好的支持了有纹理的3d物体识别与跟踪。

Step 1: 开发环境
EasyAR 3d 物体的识别与跟踪的开发过程类似最开始的平面图片的搭建过程。首先到官网申请一个Pro Key(必须是Pro,你可以购买或免费试用)


然后下载EasyAR SDK Pro for unitypackage


新建一个Unity 项目,导入sdk


Step 2: 准备3D模型
实现3d物体识别与跟踪最重要的一个步骤是准备被跟踪的3d物体。

1.获得OBJ格式的模型
  • 从现有的模型中导出:如使用3Ds Max 或Maya 其他建模工具把导入的FBX或其他格式的模型导出为OBJ
  • 创建新模型:使用3Ds Max 或Maya 其他建模工具创建新的3D模型并导出OBJ格式
  • 扫描真实世界中的物体,使用一些3D重建工具生成3D模型

2. 3D模型规格说明

(1)支持的格式 : Wavefront obj格式(.obj)

(2) 对模型文件的最低要求
  • 一个3D模型应该包括一个OBJ (.obj)文件以及相应的MTL (.mtl)文件和纹理贴图文件,并放在同一个目录下
  • 纹理贴图文件支持.jpg和.png格式
  • 文件名以及文件内部的路径不能有空格
  • 文件应使用 UTF-8 格式编码

(3)对于OBJ文件的最低要求
  • 几何顶点(vertex),用(x, y, z [, w])坐标表示,w为可选项,默认为1.0。顶点的色彩参数不是必须的,如果提供了色彩参数系统并不会加载;
  • 纹理坐标(texture coordinates),用(u, v [,w])坐标表示,w为可选项,默认为0。通常情况下,u和v的取值应该是在0至1之间。对于小于0或者大于1的情形,系 统默认会以REPEAT模式进行处理,即坐标的整数部分被忽略,然后构建一个重复的模式;(与OpenGL中的GL_REPEAT处理方式相同)
  • 面元素(face),应当至少包含顶点的索引,以及顶点的纹理坐标的索引。超过3个顶点的多边形(如四边形)面片结构同样支持
  • 材质文件的引用(mtllib),要求至少指定一个外部MTL材质文件,文件路径必须是相对路径,不能是绝对路径
  • 模型元素所引用的材质需指定材质名字(usemtl),这个材质名字应当与外部MTL材质文件中定义的材质名字保持一致

(4)MTL(.mtl)文件的最低要求
  • 一个MTL文件中应当定义至少一个材质
  • 纹理贴图(texture map)是必须的。通常情况下,只需要制定环境光(ambient)或者漫反射(diffuse)的纹理贴图。纹理贴图的路径必须是相对路径,不能是绝对路径
  • 纹理贴图的其他可选参数不是必须的,如果提供了系统并不会采用


在Unity 里新建一个文件夹(StreamingAssets)用来存放我们的模型文件



必要的3个模型文件:模型(.obj)贴图(.jpg or .png)文件说明(.mtl)






PS:对于.mtl 文件有以下需要注意的几点:

1.模型文件中不能引用绝对路径


2.文件名以及模型文件内部的路径不能有空格


3.模型文件应该使用 UTF-8 编码格式

4.模型面的法向量的正向遵循右手准则


第二个立方体中阴影部分的面片的法向量是负值取向。这种面片在EasyAR中会当成不可见面处理。如果从里面看出去,会发现显示成第三个立方体的样子。模型应当避免一切负值取向的面片


Step 3: 开发

删除原有的Main camera,将 EasyAR_ImageTracker-1_ObjectTracker-1 这个prefab 拖到面板中



填写Pro Key



将预制体 "ObjectTarget" 拖到面板中




新建一个脚本"SampleObjectTargetBehaviour" ,其实处理的方法与之前的ImageTargetBehaviour类似:

using UnityEngine;
using EasyAR;

namespace Sample
{
    public class SampleObjectTargetBehaviour : ObjectTargetBehaviour
    {
        protected override void Awake()
        {
            base.Awake();
            TargetFound += OnTargetFound;
            TargetLost += OnTargetLost;
            TargetLoad += OnTargetLoad;
            TargetUnload += OnTargetUnload;
        }

        void OnTargetFound(TargetAbstractBehaviour behaviour)
        {
            Debug.Log("Found: " + Target.Id);
        }

        void OnTargetLost(TargetAbstractBehaviour behaviour)
        {
            Debug.Log("Lost: " + Target.Id);
        }
        void OnTargetLoad(ObjectTargetBaseBehaviour behaviour, ObjectTrackerBaseBehaviour tracker, bool status)
        {
            Debug.Log("Load target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
        }

        void OnTargetUnload(ObjectTargetBaseBehaviour behaviour, ObjectTrackerBaseBehaviour tracker, bool status)
        {
            Debug.Log("Unload target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
        }
    }
}


写好之后,我们再去填写相关信息:



此时基本工作就算完成了,接下来就是一些效果的实现了,比如我们在ObjectTarget 这个预制体下面创建一个模型"hexagon",它的Rotation必须设置成:

x:90 y:180 z:0

那么在camera 识别追踪到物体之后,这个模型就会出现




Step 4:接口

在3d识别与跟踪功能部分,最重要的就是 ObjectTargetBasebehaviour 这个类,在讲到ObjectTargetBasebehaviour 之前,先讲一下ObjectTarget 这个类。:

1. ObjectTarget 表示3D物体target,它被ObjectTargetBasebehaviour 所跟踪
2.它的大小由obj文件决定。可以通过修改scale 来修改。
3.ObjectTarget 可以通过显式调用 ObjectTrackerBaseBehaviour.LoadObjectTargetBehaviour 或 通过 ObjectTargetBaseBehaviour.Bind 隐式加载到 ObjectTrackerBaseBehaviour 中。在成功加载后可以被 ObjectTrackerBaseBehaviour 跟踪。在加载之后, ObjectTrackerBaseBehaviour.TargetLoad 和 ObjectTargetBaseBehaviour.TargetLoad 事件将会被触发。


那么关于ObjectTargetBasebehaviour 它是在AR场景中控制ObjectTarget的组件,它也有几种加载obj模型的方法




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