AR.js框架调研报告

一.简介

AR.js:https://github.com/jeromeetienne/AR.js它是一个web端的增强现实框架,它运行在任何支持webgl和webrtc(Real-Time Communications)技术规范的浏览器中(android chrome已支持,ios需要升级到ios11及以上)。该框架建立在three.js、aframe.js、artoolkit5、emscripten and asm.js、chromium之上。

Demo:

aframe : https://jeromeetienne.github.io/AR.js/aframe/examples/basic.html

three.js: https://render-pre.alipay.com/p/h5/zm-ar/www/dogg.html

aframe: https://render-pre.alipay.com/p/h5/zm-ar/www/index.html

二.AR.JS框架

AR.js框架分为应用层和基础框架层。

1.AR应用层

AR应用分为aframe-ar、babylon-ar以及three-ar三种模式的web ar应用,aframe-ar.js/babylon-ar.js/ar.js均是基于基础框架层threex开发而来。

1.1Aframe AR

它基于threex编译生成,aframe-ar应用主要由aframe.js、aframe-ar.js aframe-component以及html组成。其中的自定义component处理aframe组件传入的参数,并传入threex封装提供的API中进行处理。

1.2 BabylonJS AR

Babylon-ar.js是基于three.js和babylon.js的3D游戏引擎。

1.3ThreeJS AR

该模式的AR应用主要利用threejs作为渲染引擎,并利用封装的threex进行完成AR应用的输入输出。

  1. AR基础框架层

AR基础框架分为threex、marker-area、ar api以及3rd lib,该框架的核心部分ar.js就是由这几部分编译生成。

2.1第三方库

三种追踪方式:arcuo, tango, artoolkit

这里的第三方ar库是分为三种,google的tango、aruco和jsartoolkit5。

three.webar.js: google tango基于three.js封装的ar库,用于跟踪后端。

aruco.js:一种基于OpenCV(Open Computer Vision Library)的AR应用库,跟artoolkit作用类似。

Artoolkit:目前使用最广泛的AR追踪库。追踪视频中的特殊影像(AR marker),能够识别marker的位置及方向。三个要素AR marker, camera, 3D模型

artoolkit.js:一个开源的AR应用库,目前使用最为广泛。

artoolkit.three.js:用设备相机作为输入帮助three.js建立ar场景。

artoolkit.api.js:AR控制器,主要用于标记的探测。

artoolkit工作原理:

2.2 threex

该模块的主要功能是利用第三方库进行图片的获取、分析以及标记的控制等操作。

threex.artoolkitsource:图片(摄像头/视频/图像)分析,摄像头位置追踪

threex.artoolkitcontext:主要引擎,在图像源中查找标记位置。

threex.armarkercontrols:控制标记的位置

2.3 markers-area

它的主要功能是多标记的区域控制

2.4 ar api

该部分主要是ar api的输出部分,目前主要给予aframe-ar提供api接口。

三.其他

  1. webvr-polyfill

webvr-polyfill主要用于把浏览器webvr新增api中的部分ES6的写法转成成ES5。

2.ARToolKit

它作为目前使用最为广泛的一个AR SD,主要是一方面通过它可以创建marker标记,并进行训练生成pattern文件。另一方面,需要通过它来识别pattern文件的marker标记。

2.1 Camera_para文件

artoolkit工具生成摄像机参数文件camera_para.dat,在AR应用的摄像头追踪过程中,通过camera_para.dat文件artoolkit可以在运行时自动校正对摄像机的畸变进行(需要依赖自身硬件的支持)。

camera_para具体参数:

https://archive.artoolkit.org/documentation/doku.php?id=2_Configuration:config_camera_calibration

2.2 Marker标记

Marker必须是正方形的,必须有一个连续的边界(一般是全黑色或纯白色),标记图像pattern不得旋转对称(避免偶数阶旋转对称)。

2.3生成marker pattern的几种方式

A. artoolkit的mk_patt命令方式,图片必须是jpg格式

文档:https://www.artoolkit.org/documentation/doku.php?id=3_Marker_Training:marker_training

B. artoolkit的genTexData xxx.jpg方式(生成自然特征的文件)

C.网络生成(图片必须是黑白色):http://flash.tarotaro.org/blog/2009/07/12/mgo2/

D.生成二维码的方式:

http://www.artoolworks.com/support/applications/marker/

  1. AR模型

目前为止该框架支持所有Three.JS库所支持的3D模型,例如:.gltf /. ply /.obj等等。但需注意3D动画由于自己的动画库在升级,如果ThreeJS不支持,需要自己写loader。目前Three.JS支持的loader有:GLTFLoader(不支持GLTF2Loader)、MTLLoader、OBJLoader、OBJLoader2等,详情见Three.JS Loaders:https://threejs.org/docs/index.html#manual/introduction/Creating-a-scene。

4.实现WebAR应用的两种方法及步骤

4.1 ThreeJS模式

A.引入第三方three.js库及ar.js库,设置context.baseURL。

B.新建并初始化WebGL渲染引擎和AR场景。

C.新建并初始化摄像头

D.初始化ARToolkit相关参数(设置图片被训练成marker时的摄像头参数以及检测模式等参数),用于识别marker。

E.新建ARMarker的控制器(摄像头读取marker并与图片训练成marker的pattern文件进行比较识别)

F.新建需要被显示的AR实体模型,并添加到AR场景中(该步骤业务方可以发挥地方)

G.页面AR动画循环渲染

4.2 AFrame模式

A.引入第三方aframe.js库及aframe-ar.js库,设置context.baseURL。

B.编写aframe场景a-sene

C.编写aframe-ar配置组件(配置摄像头和pattern文件),例如:a-anchor/a-camera/a-camera-static。

D.编写aframe摄像头组件

E.编写或加载aframe 3d模型(业务方发挥的地方)

F.其他aframe组件(配合动画模型编写)

注意:aframe模式时,需要自己参考aframe框架的语法来写或改component以实现自己的component接口。

四.遇到的问题(坑)

1.利用artoolkit生成marker pattern时一直不成功,原因:图片格式(宽高、JPG)不对,图片特征不够明显,图片不够清晰,图片分界边缘不够鲜明。

2.WebAR应用的浏览器必须支持webrtc的技术规范(ios11以下不支持),并且基于安全策略的问题navigator.mediaDevices.getUserMedia接口只能在https(安全源)中被调用,否则会报证书错误的问题。

3.部分手机设备上只能调用前置摄像头(哪怕强制调用后置摄像头的时候),目前暂未找到有效解决办法。

4.开源的原AR.js项目源码JS库跟Demo没有实现代码完全分离,导致在编写个性化Demo时会遇到一些参数及资源配置是默认demo的资源等等方面的问题。

5.蜻蜓/basement不支持上传部署.dat/.pat/.patt/.dt等参数配置文件及AR模型文件,(目前已经联系集团相关同学迭代开发支持),如果把资源文件上传到其他CDN又会有跨域的问题。

6.该条注意点是针对使用aframe框架开发的AR应用:如果通过basement编译部署,项目中所有用到的参数配置文件(.dat/.pat等)url必须通过第三方框架react/vue在js中处理后传递到template,要不然basement在通过线上部署时会在文件后面加上hash后template就查找不到资源文件(离线包无该问题,但AR资源文件足够大时,不推荐离线包的方法部署)。

results matching ""

    No results matching ""