第5章 WebAR解决方案介绍 5.1基于Kivicube的WebAR应用开发 Kivicube是成都弥知科技有限公司推出的国内首款免费的WebXR在线制作平台,于2018年10月上线,帮助用户零门槛制作AR场景,支持如图像跟踪与实物跟踪、空间SLAM等场景使用,持续为品牌提供AR制作能力支持。Kivicube可以在线制作AR、VR与3D场景,制作的3D场景可运行在通用的Web平台上。用户可以在其官网(网址请参考本书配套资源)注册账号并进行项目的制作,在大部分情况下用户无须编写代码。由于使用Kivicube开发WebXR项目无须用户在本地搭建复杂的开发环境,只需要在有网络的情况下就可以进行访问和制作,因此可以认为Kivicube是一种SaaS(软件即服务)平台。 5.1.1项目创建 1. 注册并登录Kivicube平台 在浏览器(推荐使用Windows Edge、火狐或者Google浏览器)中访问Kivicube官方网站,默认弹出注册和登录界面,如图5.1所示。可以选择使用手机号、邮箱或者用户名的方式来注册登录Kivicube,在后续的使用过程中,每次访问Kivicube都需要使用已经注册好的账户进行登录。 图5.1Kivicube注册和登录界面 注册登录成功之后,即可进入Kivicube的后台主页面,如图5.2所示。在该页面的上方,可以选择为创建好的项目添加AR场景、3D场景,或者进行AR场景定制; 在下方,可以单击ALL按钮来显示当前用户所拥有的所有项目。单击“+”按钮可以进行项目的新建。在左下角可以通过切换标签选项卡,来显示当前用户的项目、素材或者用户中心。 图5.2Kivicube后台主页 在用户中心可以看到当前用户的权限信息,可以看出当前用户为免费账号,可以创建的场景数最大为2个,如图5.3所示。 图5.3用户中心 2. 场景创建 单击后台主页下方的“+”按钮新建项目,如图5.4所示。 图5.4新建项目 在弹出的“新建项目”界面中,需要填写项目信息,如图5.5所示,包括项目名称、项目描述、项目Logo和项目类型。其中,项目名称和项目Logo为必选项,上传一个封面图片作为项目Logo,默认的项目类型为Web3D,然后单击“保存”按钮,这样一个WebXR项目就创建成功了。 3. 项目设置 默认情况下,新建的项目为Web3D项目,即在Web浏览器中展示三维模型。应用此默认选项后,项目入口没有任何效果,用户无法通过扫描打开项目下的场景。如果设置项目为“云识别”,则项目下所有的云识别场景都可以通过项目入口扫描识别图进入。如果设置项目为“图像检测与跟踪”,则场景也可以通过项目入口扫描识别图进入。 这里需要特别说明的是,如果项目同时含有Web3D、云识别、图像检测与跟踪3类场景,此时当项目被设置为云识别,那么项目入口就只能扫描到云识别场景,图像检测与跟踪场景同理。 5.1.2场景创建 1. 选择需要创建的场景类型 可以为当前已经创建好的项目添加AR场景、3D场景以及定制化的AR场景,如图5.6所示。 (1) AR场景: AR场景是指在实时摄像头画面上呈现AR内容的场景。 (2) 3D场景: 指普通的3D场景,并且体验时不会呈现摄像头的画面。 (3) AR场景定制: 指创建适用于各个流量平台的场景,包括支付宝、淘宝、天猫、京东等购物类网站、Facebook、Snapchat等。该案例中选择场景的类型为3D场景。 图5.5项目信息填写 图5.6新建场景 图5.7创建3D场景 2. 创建3D场景 基于3D内容的3D互动体验,广泛地运用于智慧电商、3D广告、3D传媒等,能够广泛支持所有安卓版浏览器与带浏览器功能的App、安卓微信、安卓微信小程序、所有iOS浏览器与带浏览器功能的App,以及iOS微信小程序。创建此类场景时首先要填写3D互动场景信息,如图5.7所示; 选择当前场景所属的项目名称,并且填写场景名称与场景描述,单击“立即制作”按钮,即可完成3D场景的创建。 在这里输入的场景名称会显示在展示端的主页,如图5.8所示。 3. 创建AR场景 创建AR场景,用户可以通过扫描现实世界中的平面图像(如杂志封面、照片与名片等),然后呈现出与之对应的场景内容与交互,并实现实时位置匹配与跟踪。 选择场景类型为AR场景后,需要填写图像检测与跟踪场景信息,如图5.9所示。同样包括所属项目的名称和场景名称,同时需要上传待识别的图片,然后单击“立即制作”按钮完成创建。 图5.83D场景的预览效果 图5.9创建AR场景 例如,创建一个AR场景,添加Babylon.js的Logo作为识别图,单击“立即制作”按钮,如图5.10所示。 图5.10添加识别图 可以为一个场景添加多张识别图,一方面用户通过扫描不同的识别图进入同一个场景体验,另一方面也可以完成对实物的识别。AR体验场景还支持空间位置定位与跟踪,用户通过扫描现实环境中的平面,然后在平面上呈现与之对应的场景内容与交互,并实现实时位置匹配与跟踪。 同样,系统支持陀螺仪。陀螺仪是基于移动设备的陀螺仪传感器,用户可以转动设备查看四周的场景内容,并与之交互。云识别基于云端图像识别与匹配,能够支持10万张图片的识别。 4. 创建流量平台AR场景 平台支持支付宝、淘宝/天猫、Facebook、Snapchat、京东等平台,可以轻松地在上述平台中进行数字化建模,并将虚拟的商品放置在地板、桌面等现实世界中。其中支付宝能够支持图像检测与跟踪、平面检测与跟踪、人脸检测与跟踪、微笑检测、人体姿态检测、手势检测等功能。 5.1.3创建场景内容 1. 打开场景 单击打开在上述的操作中已经创建好的AR场景,如图5.11所示。 图5.11打开AR场景 2. 上传素材 Kivicube目前支持图片、模型、AR视频、音频、透明视频、全景图6种类型的素材,其中“AR场景”→“图像检测与跟踪”不支持全景图。如图5.12所示,这里选择上传的素材类型为3D模型,然后单击“上传素材”按钮。 图5.12选择素材的类型并上传 这里要求上传的模型文件类型为zip格式,建议将模型从3ds Max/Maya/Blender等三维建模软件中导出,然后将其压缩为zip格式压缩包并拖入指定的区域后,模型开始上传,当上传进度为100%或者上传进度提示信息消失时,单击“完成”按钮,如图5.13所示。 图5.13上传模型素材 3. 将素材添加至场景 上传后的模型素材会显示在左侧的素材列表中,直接将需要的模型拖入场景,如图5.14所示。 图5.14将模型素材添加至场景 素材添加完成后,就能从编辑器右边的“场景结构”选项卡中查看已添加的素材内容了。 5.1.4创建场景交互 1. 添加自动循环播放的音频 按照上述方法,还可添加音频类素材,如图5.15所示。添加完成后,将音频素材同样拖入场景中,然后在素材列表中选择该音频素材,单击“音频控制”按钮,在音频控制界面可以设置该音频文件的播放模式为“循环播放”(Loop),并且设置音频播放的触发条件为“扫描识别到”。 图5.15音频控制 2. 添加单击图片打开网页的交互(可选) 如果要为图片添加网页交互,那么可以选择图片素材,然后单击“打开网页”按钮。在弹出的打开网页设置界面中,设置功能的名称,添加将要打开的网址,并且设置触发条件为“扫描识别到”,如图5.16所示。 图5.16添加网页设置 图5.17显示/隐藏设置 3. 添加模型素材显示或隐藏的交互 选择模型素材,单击“显示/隐藏”按钮,在弹出的“显示/隐藏”设置界面选择具体的功能设置,这里选中当前的3D模型名称(3DPlayer)。然后选择要执行的操作为“显示”或者“隐藏”,并且选择具体的触发条件,例如“扫描识别到”,如图5.17所示。 5.1.5场景保存与分享 上述步骤完成后,就可以保存场景并分享体验了。首先选择右上角的“场景结构”选项卡,确认场景中添加的素材节点(包括模型、音频、图片等)以及相关的控制设置(例如,音频控制、模型控制等)符合要求,如图5.18(a)所示。然后选择 “场景设置”选项卡,确认当前场景的设置信息,或者对已经存在的设置信息进行重新修改,如图5.18(b)所示。最后单击“保存”按钮保存场景。 图5.18项目设置与保存 项目保存完毕之后,可以单击“分享”按钮进行项目的发布,如图5.19(a)所示。在场景发布界面,可以设置分享的Logo图片、分享的名称以及分享的描述信息。同时,还会自动生成分享二维码以及网址链接,如图5.19(b)所示。二维码可以直接扫描并进行体验,而网址链接可以在移动端或者固定端的浏览器中进行访问。就便捷性而言,二维码方式的分享体验更好一些。 图5.19场景分享 最终的场景效果请读者结合本书配套资源中的素材资源,亲自动手实践进行体验。 5.2基于EasyAR的WebAR应用开发 5.2.1EasyAR WebAR简介 EasyAR WebAR是以 Web 平台来集成 AR 技术,区别于原生 AR 应用,具有模式轻、部署快、传播能力强等特点,可以轻松地运行在 Android、iOS、Windows、macOS 等系统的 Web 浏览器上,无需App,真正实现跨平台。EasyAR WebAR提供在 Web 端嵌入 AR 技术的整套服务和解决方案,后续也会向开发者发布 WebAR SDK。 EasyAR WebAR由Web前端和EasyAR云服务两部分组成,支持平面图片识别、云识别、3D渲染、复杂互动等功能,主要以 URL 的格式来传播,符合微信等社交媒体信息流动的基本技术要求,配合创意策划方案,可以形成爆炸式的营销效果。 5.2.2EasyAR WebAR快速入门 使用EasyAR开发WebAR应用之前,需要做好如下准备工作。 1. EasyAR WebAR 授权 访问EasyAR官方网站(网址请参考本书配套资源),在图5.20右侧进行EasyAR账户的注册和登录,详细的操作步骤与Kivicube相同,此处不再赘述。 图5.20EasyAR官网首页 通过邮箱注册之后,可以在邮件中通过链接激活EasyAR账户,然后使用新账户登录就能够访问图5.20中的开发中心了。初次进入开发中心时,系统会要求补全用户信息,如图5.21所示,可以选择下次再填写,将当前窗口关闭。 图5.21EasyAR官网服务使用情况调查 EasyAR开发之前首先需要为项目申请Sense授权。EasyAR Sense能够实现Mega云定位服务、AR图像识别、稠密空间地图、稀疏空间地图、3D物体跟踪、运动跟踪、平面图像跟踪、表面跟踪、录屏等多种功能。默认情况下,开发中心是没有Sense授权的,此时可以单击“Sense授权管理”下的“我需要一个新的Sense许可证密钥”按钮来申请新的授权,如图5.22所示。 图5.22Sense授权申请 在展开的Sense订阅界面可以看出,支持的授权类型有3种,分别是个人版、专业版和经典版,如图5.23所示。其中专业版和经典版都是需要付费进行使用的,不同的是专业版是按月付费订阅,而经典版是一次性付费永久使用。这里的案例仅用于学习和研究,开发的应用并不用于商业目的,因此申请个人版免费授权即可。 图5.23Sense授权类型 选择授权类型为个人版之后,选择所需要的授权功能。如果需要使用稀疏空间地图,则可以选择“是”,否则选择“否”即可。在“创建应用”中分别设置AR应用的名称以及在不同的移动端系统中的参数。这里如果是iOS系统,那么需要绑定Bundle ID; 如果是Android系统,那么需要填写打包时的Package Name,这里将二者设置为一致即可。AR应用的有效期可以视情况而定,这里设置为无限期,即永久生效,然后单击“确认”按钮,就将应用的名称与Sense授权进行绑定了,如图5.24所示。 图5.24申请个人版Sense授权 申请后的授权列表如图5.25所示。 图5.25申请后的授权列表 如果开发的EasyAR应用是微信小程序,那么接下来在授权管理中,可以创建Mega微信小程序许可证密钥。这里选择授权类型为测试版,在“创建应用”中需要填写小程序的名称以及小程序的APP ID,然后单击“确认”按钮,如图5.26所示。 图5.26申请Mega微信小程序授权 如果要使用EasyAR云服务,那么首先需要创建一个云服务,这里选择“云识别管理”,然后创建一个图库,名为ARImages,如图5.27所示。图库分为按调用次数计费和按日活计费两种方式,这里选择默认的“按调用次数”进行计费,并且可以默认拥有500次/日的试用次数。 接下来需要申请云服务API Key,如图5.28所示,将应用名称与云服务的类型进行绑定。这里创建名为ARTest的应用,并且选择云服务类型为“云识别”。 2. Web服务器 用于存储HTML等静态网页内容。可以通过部署Windows下的IIS服务器或者是在Linux中安装Web服务器来提供静态网页内容的访问。 3. 支持HTTPS的域名 在浏览器上使用摄像头,需要HTTPS协议支持。 具体的开发步骤可以通过如下代码实现,基本的代码还是遵循了HTML+CSS+JavaScript的编程风格。 图5.27创建云识别图库 图5.28申请云识别API Key 1) 打开摄像头 1.// 更多参数请查看 2.//https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints 3.const constraints = { 4.audio: false, 5.video: {facingMode: {exact: 'environment'}} 6.//video: {facingMode: {exact: 'user'}} 7.//video: true 8.}; 9. 10.navigator.mediaDevices.getUserMedia(constraints) 11..then((stream) => { 12.// videoElement为video元素,将摄像头视频流绑定到video上实时预览 13.videoElement.srcObject = stream; 14.videoElement.style.display = 'block'; 15.videoElement.play(); 16.resolve(true); 17.}) 18..catch((err) => { 19.reject(err); 20.}); 2) 截取摄像头图像 1.// canvasElement为canvas元素 2.// canvasContext为canvas的context 2D对象 3.// videoSetting为video元素的宽、高 4.canvasContext.drawImage(videoElement, 0, 0, videoSetting.width, videoSetting.height); 5.const image = canvasElement.toDataURL('image/jpeg', 0.5).split('base64,')[1]; 3) 将图像发送到服务器识别 在EasyAR开发中心中选择“授权”→“云服务API Key”,查看云服务API Key,如图5.29所示。通过上述操作已经为ARTest应用申请了API Key,此时单击后面的“管理”按钮。 图5.29API Key列表 选择Token有效期的天数后,单击“生成Token”按钮,如图5.30所示。可以看出,生成的Token能够支持为期5天的云识别服务,并且将新建的图库名称进行了绑定。 图5.30生成Token Token会过期,支持动态刷新。Token是写在JavaScript文件中的,适合在安全要求较低的环境中使用,建议调用接口动态获取Token。 在“云服务”的“云识别管理”中,可以看到之前申请的云识别图库,如图5.31所示。 图5.31云识别图库列表 单击该图库后面的“管理”按钮,可以查看云识别库的相关信息,如图5.32所示。其中,在“识别图”标签中,可以看到当前没有识别图,可根据具体的应用开发,单击“上传识别图”按钮,将需要识别的图片进行上传。 图5.32云识别库详细信息 然后在“密钥”标签中可以看到实现识别所需要的相关密钥信息,如图5.33所示,包括CRS AppId、API KEY以及Cloud URLs三项内容。 图5.33云识别库密钥 单击图5.33中的“API KEY列表”按钮,弹出如图5.34所示的基于应用名称的API Key列表,然后根据实际情况进行选择。 图5.34API Key列表 接下来,将获取的上述3项内容,补充到如下代码中,就能够完成识别代码的编写。 1.// 云图库的Client-end URL 2.const clientendUrl = '您云图库的Client-end URL/search'; 3.// 云图库的Cloud Token 4.const token = '这里是云图库的Cloud Token'; 5.// 云图库的CRS AppId 6.const appId = '这里是云图库的CRS AppId'; 7. 8.// 可以使用 jQuery 或 axios 等发送网络请求 9.const http = new XMLHttpRequest(); 10.http.onload = () => { 11.try { 12.const msg = JSON.parse(http.responseText); 13.if (http.status === 200) { 14.if (msg.statusCode === 0) { 15.resolve(msg.result); 16.} else { 17.reject(msg); 18.} 19.} else { 20.reject(msg); 21.} 22.} catch (err) { 23.reject(err); 24.} 25.}; 26.http.onerror = (err) => { 27.reject(err); 28.}; 29. 30.// 发送到云图库服务器 31.http.open('POST', clientendUrl); 32.http.setRequestHeader('Content-Type', 'application/json;Charset=UTF-8'); 33. 34.// 将Cloud Token写在请求头中 35.http.setRequestHeader('Authorization', token); 36. 37.// image为截取的摄像头图片数据,如:{image: '/9j/4AAQSkZJRgA...', appId: appId} 38.http.send(JSON.stringify(image)); 4. 检测识别结果 如果未识别到内容,则继续识别,否则停止识别,将识别的结果(如targetId、meta等)信息取出处理。通过URL“https://云图库的客户端URL/search”进行目标识别时,若未识别到目标,则HTTP状态码会变为404。 5.2.3EasyAR Web3D模型动画要求 EasyAR能够提供优秀的3D模型展示,通过Web方式展示3D模型动画,比平面HTML5页面具有更强的感染力。例如,在电商活动中,通过Web 3D方式展示产品模型,为用户提供直观感受产品的视觉入口,增强活动传播效果。EasyAR对于3D模型的展示具有如下要求。 (1) 动画模型需要单个mesh(可编辑网格),当模型没有动画时无此要求。 (2) 动画模型骨骼只可以有一套,骨骼权重要和骨骼保持一致,蒙皮权重必须要完整,可以限制网格顶点,受控制骨骼数目最好不超过4个。 (3) 骨骼层级要遵循命名规范,目的在于当动画出现问题时可以追溯。 (4) 避免使用曲线网格。 (5) 动画模型纹理需要使用JPG/PNG格式,不能使用psd作为纹理源文件,材质最好不使用透明通道,若使用透明通道则需要进行代码调试。 (6) Three.js支持的动画文件格式只有FBX、 DAE和JSON三种, FBX格式包括ASCII和二进制两种文件类型,最好可以获得源工程文件,在使用3dsMax/Maya/Blender导入导出时有不兼容的地方需要手动调整。 (7) 模型面数限制在10000以下。 (8) 在动画模型中为了方便绘制角色的运动轨迹,通常会为角色添加一个根节点,这个节点没有对应信息的绑定,会导致导出模型的初始位置出错。这里需要找到根节点并选择根节点的下级节点,再断开其与根节点的链接。 (9) 不支持动画中存在虚拟节点和控制器。 (10) 所有节点不能有负数。 (11) 模型缩放为1,模型只能是一个mesh,单个模型独立对应一种纹理并独立对应一套骨骼。对于绑定过的模型,不要二次返修。 (12) 模型制作使用polygon多边形建模,避免使用NURBS等其他类型建模。制作完成的模型统一导出格式为FBX,导出之前需要将模型历史记录及无关节点清空,模型坐标位于坐标点中心,并将坐标数据清零,冻结变换。 5.3基于开源的AR.js应用开发 AR.js是一个用于网络增强现实(WebAR)的轻量级库,具有图像跟踪、基于位置的AR和基于标记的AR等功能,它是完全开源的,非常适合平时做科研使用。图5.35展示了AR.js的一些使用案例。 图5.35AR.js使用案例 该项目现在属于Github 组织,可以在AR.js官网(网址请参考本书配套资源)找到并免费申请加入。下面介绍AR.js的三大功能。 1. 图像跟踪 当相机发现 2D 图像时,可以在其顶部或附近显示某种内容。其内容可以是 2D 图像、GIF、3D 模型(也是动画)和 2D视频,应用范围包括增强艺术、学习(增强型书籍)、增强型传单或广告等。 2. 基于位置的AR 这种AR使用真实世界的地理位置,以便在用户设备上显示增强现实内容。用户可以移动(最好是户外),并且可以通过智能手机看到现实世界中的 AR 内容。四处移动和旋转手机将使 AR 内容根据用户的位置和旋转而变化(因此地点被“锚定”在其真实位置,并根据它们与用户距离的远近而变小或变大)。借助此解决方案,可以构建诸如导游的交互式支持、探索新城市时的帮助、查找建筑物/博物馆/餐馆/酒店等体验; 还可以构建诸如寻宝、生物学或历史学习游戏等体验,或者将这种技术用于情境艺术(与特定现实世界坐标绑定的视觉艺术体验)。 3. 基于标记的AR 当相机找到标记时,可以显示一些内容(与图像跟踪相同)。标记非常稳定,但形状、颜色和大小有限,使用示例包括增强型书籍、增强型传单或广告等。 5.3.1图像跟踪案例 创建新的项目并添加如下代码: 1.<script src="https://cdn.jsdelivr.net/gh/aframevr/aframe@1c2407b26c61958baa93967b54124 87cd94b290b/dist/aframe-master.min.js"> 2.</script> 3.<script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar-nft.js"> 4.</script> 5.<style> 6..arjs-loader { 7.height: 100%; 8.width: 100%; 9.position: absolute; 10.top: 0; 11.left: 0; 12.background-color: rgba(0, 0, 0, 0.8); 13.z-index: 9999; 14.display: flex; 15.justify-content: center; 16.align-items: center; 17.} 18. 19..arjs-loader div { 20.text-align: center; 21.font-size: 1.25em; 22.color: white; 23.} 24.</style> 25. 26.<body style="margin : 0px; overflow: hidden;"> 27.<!-- 在加载图像描述符之前显示的最小加载程序 --> 28.<div class="arjs-loader"> 29.<div>Loading, please wait...</div> 30.</div> 31.<a-scene 32.vr-mode-ui="enabled: false;" 33.renderer="logarithmicDepthBuffer: true;" 34.embedded 35.arjs="trackingMethod: best; sourceType: webcam;debugUIEnabled: false;" 36.> 37.<!-- 使用cors代理来避免跨源问题 --> 38.<a-nft 39.type="nft" 40.url="https://arjs-cors-proxy.herokuapp.com/https://raw.githack.com/AR-js-org/AR.js/master/aframe/examples/image-tracking/nft/trex/trex-image/trex" 41.smooth="true" 42.smoothCount="10" 43.smoothTolerance=".01" 44.smoothThreshold="5" 45.> 46.<a-entity 47.gltf-model="https://arjs-cors-proxy.herokuapp.com/https://raw.githack.com/AR-js-org/AR.js/master/aframe/examples/image-tracking/nft/trex/scene.gltf" 48.scale="5 5 5" 49.position="50 150 0" 50.> 51.</a-entity> 52.</a-nft> 53.<a-entity camera></a-entity> 54.</a-scene> 55.</body> 图5.36AR效果实验图(一) 将上述代码部署至已经搭建好的Web服务器中,可以使用基于Windows的IIS服务器或者是基于Linux的Apache/Nginx服务器。 在手机浏览器中访问Web服务器提供的URL,对上述配置的站点进行访问。 扫描如图5.36所示的图像,就能够在手机中体验AR应用了。 5.3.2基于位置的AR案例 使用以下代码创建一个项目,将第22行代码中的 addyourlatitude 和 addyourlongitude 属性更改为实际的纬度和经度,注意不带 “<>”。 1.<!DOCTYPE html> 2.<html> 3.<head> 4.<meta charset="utf-8" /> 5.<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 6.<title>GeoAR.js demo</title> 7.<script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script> 8.<script src="https://unpkg.com/aframe-look-at-component@0.8.0/dist/aframe-look-at-component.min.js"></script> 9.<script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar-nft.js"></script> 10.</head> 11. 12.<body style="margin: 0; overflow: hidden;"> 13.<a-scene 14.vr-mode-ui="enabled: false" 15.embedded 16.arjs="sourceType: webcam; debugUIEnabled: false;" 17.> 18.<a-text 19.value="This content will always face you." 20.look-at="[gps-camera]" 21.scale="120 120 120" 22.gps-entity-place="latitude: <add-your-latitude>; longitude: <add-your-longitude>;" 23.></a-text> 24.<a-camera gps-camera rotation-reader> </a-camera> 25.</a-scene> 26.</body> 27.</html> 将上述代码部署至已经搭建好的Web服务器中,可以使用基于Windows的IIS服务器或者是基于Linux的Apache/Nginx服务器。 在手机上激活 GPS 并导航到示例 URL。即使环顾四周并移动手机,也应该看到文本正对着用户,出现在请求的位置。 5.3.3基于标记的AR案例 使用下列代码创建项目: 1.<!DOCTYPE html> 2.<html> 3.<script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script> 4.<!-- 导入ARjs版本,不带NFT,但支持标记+位置 --> 5.<script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar.js"></script> 6.<body style="margin : 0px; overflow: hidden;"> 7.<a-scene embedded arjs> 8.<a-marker preset="hiro"> 9.<a-entity 10.position="0 0 0" 11.scale="0.05 0.05 0.05" 12.gltf-model="https://arjs-cors-proxy.herokuapp.com/https://raw.githack.com/AR-js-org/AR.js/master/aframe/examples/image-tracking/nft/trex/scene.gltf" 13.></a-entity> 14.</a-marker> 15.<a-entity camera></a-entity> 16.</a-scene> 17.</body> 18.</html> 将上述代码部署至已经搭建好的Web服务器中,可以使用基于Windows的IIS服务器或者是基于Linux的Apache/Nginx服务器。 在手机浏览器中访问Web服务器提供的URL网址,对上述配置的站点进行访问。 扫描如图5.37所示的图像,就能够在手机中体验AR应用了。 图5.37AR效果实验图(二)