使用 ViroReact 开发增强实现应用的一个具体例子(一)

简介: 本文开始详细介绍使用 ViroReact 进行编码开发的技术细节。

笔者之前的文章 使用 JavaScript 开发AR(增强现实)移动应用的预备知识和环境搭建,介绍了使用增强现实开发库 ViroReact 进行应用开发所需掌握的一些最基础的概念和环境搭建步骤。


本文开始详细介绍使用 ViroReact 进行编码开发的技术细节。


按照本文步骤开发而成的应用效果,可以从下面两个视频 demo 查看:

  • https://v.qq.com/x/page/o3003z9y4m7.html
  • https://v.qq.com/x/page/q3003wozfve.html

这个增强现实应用支持实时地更换特斯拉车身的颜色,能够帮助使用者方便地查看同一型号的特斯拉汽车,在不同车身颜色外观下的不同视觉效果。

image.png

ViroReact 的官网有一个步骤非常详细的向导:

16.png

一步步照着做,最后就能通过手机摄像头,在真实的场景里能看到一个硬编码的Hello World字符串和一些 3D 物体。

17.png

这个 Hello World 级别的源代码在ViroReact官网上能下载,大家可以下载到本地运行,跑通之后,就能继续学习本文余下部分介绍的技术细节了。


打开基于 ViroReact 的 Node.js 项目,找到 package.json,项目名称为ViroSample, 里面声明了对React-Native和React-viro的依赖。

image.png

React-Native 加 ViroReact这套组合的妙处在于“一次编写,到处运行”的跨平台特性。编写一次JavaScript代码,能在iOS和Android两套操作系统里以原生应用的方式运行。


以Android为例,执行命令行react-native start 加上react-native run-android 后,在android文件夹里能找到针对Android平台生成的原生应用部分源代码。最重要的两个应用引导文件,一个是MainActivity.java, 通过回调函数的方式返回了AR应用的项目名称:

image.png

MainApplication.java的getJSMainModuleName通过回调函数的方式指明了JavaScript入口模块的名称:

image.png

因为本文不是React-Native的讲解文章,所以不深入阐述React-Native应用在Android平台的启动原理,感兴趣的朋友可以自行搜索。React-Native生态圈非常活跃,类似的原理分析文章数不胜数。

18.png

React-Native + ViroReact开发的增强现实应用,其典型实现套路Jerry归纳起来就三步:Match - Replace - Augment

Match - 匹配

由于增强现实应用都是将代码生成的虚拟物品叠加到现实场景中,因此应用开发人员需要帮助ViroReact找到现实场景中的一个依附平面,这样ViroReact可以把这个依附平面映射到手机的二维屏幕上,接下来 ViroReact 就能在二维屏幕上绘制虚拟物体了。

ViroReact提供了一个标签 ViroARImageMarker, 顾名思义,该标签能够允许应用开发人员定义一个“Marker”(标识,标记)。

image.png

用编程术语来说,这个标签定义的就是一个place holder,通过target属性,关联一个应用开发人员指定的图片。当用户使用增强现实应用通过摄像头在现实世界扫描到和ViroARImageMarker指定的图片相匹配的图形时,ViroReact就会将Marker指定的图形替换成应用开发人员事先准备好的3D模型。这个匹配 - 替换过程是ViroReact自动完成的,应用开发人员只需要提供Marker指向的图片和待替换的3D模型即可。采用这种方式实现的AR应用也称为Marker based AR应用(当然还有不借助Marker实现的AR应用).


从上图能看出target指向的Marker内容为一个名为logo的对象,这个对象通过API ViroARTrackingTargets.createTargets创建,输入参数是该图片在AR项目里的相对路径:


image.png

该图片如下所示。这也是为什么我们在演示这个应用时,第一步总是先在电脑上打开这张图片,然后再用手机摄像头去扫描的原因。

19.png



image.png

目录
相关文章
|
9月前
|
存储 缓存 监控
《优化接口设计的思路》系列:第二篇—接口用户上下文的设计与实现
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
73 0
|
18天前
|
编解码 算法 计算机视觉
YOLOv8数据增强预处理方式详解:包括数据增强的作用,数据增强方式与方法
YOLOv8数据增强预处理方式详解:包括数据增强的作用,数据增强方式与方法
|
2月前
|
存储 编译器 C语言
【C++基础】 --- C++在C的基础上对一些语法的增强
【C++基础】 --- C++在C的基础上对一些语法的增强
18 3
|
11月前
|
Java 编译器 应用服务中间件
代码开发优化细节
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50% 。
196 2
代码开发优化细节
|
10月前
|
前端开发 JavaScript 程序员
使用 ViroReact 开发增强实现应用的一个具体例子
使用 ViroReact 开发增强实现应用的一个具体例子
|
12月前
|
C#
一个 C#例子,代码简化的过程
一个 C#例子,代码简化的过程
54 0
jira学习案例15-用泛型增强useDebounce类型灵活性
jira学习案例15-用泛型增强useDebounce类型灵活性
48 0
jira学习案例15-用泛型增强useDebounce类型灵活性
|
安全 Java 开发者
案例之简化模式测试|学习笔记
快速学习案例之简化模式测试
57 0
案例之简化模式测试|学习笔记
|
前端开发 JavaScript 程序员
使用 ViroReact 开发增强实现应用的一个具体例子(二)
本文开始详细介绍使用 ViroReact 进行编码开发的技术细节。
205 0
使用 ViroReact 开发增强实现应用的一个具体例子(二)
|
设计模式 算法 Java
代码简化利器-行为参数化
在软件工程中,一个众所周知的问题就是,不管做什么,用户的需求肯定会变。比方说,有个应用程序是帮助农民了解自己的库存的。这位农民可能想有一个查找库存中所有绿色苹果的功能。但到了第二天,他可能会告诉你:“其实我还想找出所有重量超过150克的苹果。”又过了两天,农民又跑回来补充道:“要是我可以找出所有既是绿色,重量也超过150克的苹果,那就太棒了。”要如何应对这样不断变化的需求?理想的状态下,应该把工作量降到最少。此外,类似的新功能实现起来还应该很简单,而且易于长期维护。
105 0
代码简化利器-行为参数化