近年来,AR版块成为时下大热,这是一种将现实环境中不存在的虚拟物体融合到真实环境里的技术,用户借助显示设备可以拥有真实的感官体验。AR的应用场景十分广泛,涉及娱乐、社交、广告、购物、教育等领域:AR可以让游戏更具互动性;商品通过AR展示更真实;使用AR进行教育教学让抽象事物更形象等,可以说AR技术已经渗透人们生活的方方面面。

为了让人们产生强烈的视觉真实感,AR首先要解决的问题就是如何将虚拟对象准确地融合到现实世界中,即让虚拟对象以正确的姿态显示在真实场景的正确位置上。一些AR方案完成环境识别与摄像机位姿计算之后,没有进行平面检测就直接叠加虚拟对象显示,导致虚拟对象与真实环境没有很好的贴合度,用户容易产生视觉错位,影响虚拟对象在现实中的呈现效果。因此,如何在不同的真实环境中准确检测出水平或垂直平面,与放置虚拟对象位置的平面保持一致,是用户与AR进行交互的重要一步。

华为HMS Core AR Engine跟踪设备周围的光照、平面、图像、物体、环境表面等环境信息,辅助开发者们的应用实现虚拟物体以场景化的方式逼真地融入现实物理世界。其中平面检测能力可识别到水平和垂直平面(地面或墙面)上的成群特征点,并可识别到平面的边界,开发者们的应用可使用这些平面来放置需要的虚拟物体。

Demo

功能特点

支持识别水平平面、垂直平面识别

准确度2.5cm@1m

识别正常纹理速度<1s

支持多边形拟合和平面合并

开发步骤

开发环境要求:

JDK 1.8.211及以上。

安装Android Studio 3.0及以上:

minSdkVersion 26及以上

targetSdkVersion 29(推荐)

compileSdkVersion 29(推荐)

Gradle 6.1.1及以上(推荐)

在华为终端设备上的应用市场下载AR Engine服务端APK(需在华为应用市场,搜索“华为AR Engine”)并安装到终端设备。

测试应用的设备:参见AREngine特性软硬件依赖表中环境Mesh支持设备列表。如果同时使用多个HMS Core的服务,则需要使用各个Kit对应的最大值。

开发准备

  1. 在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法请参见帐号注册认证

  2. 华为提供了Maven仓集成方式的AR Engine SDK包,在开始开发前,需要将AR Engine SDK集成到您的开发环境中。

  3. Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请根据您当前的Gradle插件版本,选择对应的配置过程。

  4. 以7.0为例:

打开Android Studio项目级“build.gradle”文件,添加Maven代码库。

在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。

buildscript {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}

打开项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}
}
  1. 添加依赖 在“dependencies”中添加如下编译依赖:
dependencies {
implementation 'com.huawei.hms:arenginesdk:{version}
}

开发步骤

  1. 首先创建WorldActivity,这个Activity介绍如何使用HUAWEI AR Engine的世界AR场景。
Public class WorldActivity extends BaseActivity{
Protected void onCreate(Bundle saveInstanceState){
初始化DisplayRotationManager
mDisplayRotationManager = new DisplayRotationManager(this);
初始化WorldRenderManager
mWorldRenderManager = new WorldRenderManager(this,this);
}
//写一个手势处理器
Private void initGestureDetector(){
mGestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener()){
}
}
mSurfaceView.setOnTouchListener(new View.OnTouchListener()){
public Boolean onTouch(View v,MotionEvent event){
return mGestureDetector.onTouchEvent(event);
}
}
//在onResume生命周期中创建ARWorldTrackingConfig
protected void onResume(){
mArSession = new ARSession(this.getApplicationContext());
mConfig = new ARWorldTrackingConfig(mArSession);

}
//创建刷新配置类
private void refreshConfig(int lightingMode){
//设置对焦
mConfig.setFocusMode(ARConfigBase.FocusMode.AUTO_FOCUS);
mArSession.configure(mConfig);
}
}
  1. 创建WorldRenderManager类,该类提供与世界场景相关的渲染管理,包括标签渲染和虚拟对象渲染管理。
public class WorldRenderManager implements GLSurfaceView.Renderr{
//需要创建一个绘制框架的类
Public void onDrawFrame(GL10 unused){
//设置可用于存储相机预览流数据的openGL textureId
mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
//更新AR Engine的计算结果,应用应在需要获取最新的数据时调用此接口
ARFrame arFrame = mSession.update();
//获取当前帧的相机参数。
ARCamera arCamera = arFrame.getCamera();
//返回一个坐标运算相关的投影矩阵,可用于相机坐标系到裁剪坐标系转换。
arCamera.getProjectionMatrix(projectionMatrix, PROJ_MATRIX_OFFSET, PROJ_MATRIX_NEAR, PROJ_MATRIX_FAR);
Session.getAllTrackables(ARPlane.class)
…..
}
}
  1. 创建VirtualObject类,该类提供虚拟对象的属性以及与虚拟对象渲染相关的必要方法。
Public class VirtualObject{
}
  1. 创建ObjectDisplay类,根据指定的参数绘制虚拟对象。
Public class ObjectDisplay{
}

了解更多详情>>

访问华为开发者联盟官网

获取开发指导文档

华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

AR Engine毫秒级平面检测,带来更准确的呈现效果的更多相关文章

  1. 毫秒级检测!你见过带GPU的树莓派吗?

    树莓派3B+英特尔神经计算棒进行高速目标检测 转载请注明作者梦里茶 代码: 训练数据预处理: https://gist.github.com/ahangchen/ae1b7562c1f93fdad1d ...

  2. HMS Core AR Engine 2D图片/3D物体跟踪技术 助力打造更智能AR交互体验

    AR技术已经被广泛应用于营销.教育.游戏.展览等场景.通过2D图像跟踪技术和3D物体跟踪技术,用户只需使用一台手机进行拍摄,即可实现海报.卡牌等平面物体以及文物.手办等立体物体的AR效果.尽管近年来2 ...

  3. AR Engine运动跟踪能力,高精度实现沉浸式AR体验

    随着电子产品的普遍应用,AR技术也开始广泛普及,在游戏.电商.家装等领域都有涉及.比如,在室内设计时,我们可以通过AR技术在实际场景中进行虚拟软装的搭配,运用华为AR Engine运动跟踪能力在实际应 ...

  4. 如何用AR Engine环境Mesh能力实现虚实遮挡

    在AR应用中,用户最不希望看到不真实的穿模现象发生,如虚拟形象部分身体陷入墙壁之中,或者未碰到墙壁却已无法移动,这种不真实的交互十分影响用户体验.那如何才能让避免虚拟物体的穿模问题呢?使用AR Eng ...

  5. 如何用AR Engine开发一个虚拟形象表情包?

    现如今,人们在网上聊天.发帖时越来越爱用表情包,表情包一方面是一种个性化的表达方式,另一方面更能传达出当下的心理活动,可以说在网络社交中表情包是一个不可或缺的存在.加上近年来元宇宙的兴起,3D虚拟形象 ...

  6. 用AR Engine手部骨骼跟踪能力实现虚拟手表试戴

    AR技术的落地应用,推动着电商领域的不断升级,通过增强现实为用户带来了虚拟与现实结合的AR购物体验.如AR试衣.AR试鞋.AR试妆等功能的出现让用户在手机上就能体验产品的佩戴效果,可以让用户更直观.更 ...

  7. VC中如何获取当前时间(精度达到毫秒级)

    标 题: VC中如何获取当前时间(精度达到毫秒级)作 者: 0xFFFFCCCC时 间: 2013-06-24链 接: http://www.cnblogs.com/Y4ng/p/Millisecon ...

  8. 使用bitset实现毫秒级查询

    前言 因为业务要求api的一次请求响应时间在10ms以内,所以传统的数据库查询操作直接被排除(网络io和磁盘io).通过调研,最终使用了bieset,目前已经正常运行了很久 *** bitset介绍 ...

  9. php Swoole实现毫秒级定时任务

    项目开发中,如果有定时任务的业务要求,我们会使用linux的crontab来解决,但是它的最小粒度是分钟级别,如果要求粒度是秒级别的,甚至毫秒级别的,crontab就无法满足,值得庆幸的是swoole ...

  10. 突破!阿里云CDN实现毫秒级全网刷新

    通常在某网站使用了CDN节点来实现内容分发加速后,当源站内容更新的时候,CDN刷新系统会通过提交刷新请求将CDN节点上的指定缓存内容强制过期.当用户访问的时候,CDN节点将回源获取最新内容返回给用户, ...

随机推荐

  1. Jmeter——请求响应内容乱码解决办法

    前段时间,换过一次设备,重新下载了Jmeter.有一次在编写脚本时,响应内容中的中文一直显示乱码. 遇到乱码不要慌,肯定是有办法来解决的.具体解决办法,可以参考之前的博文,Jmeter--BeanSh ...

  2. uniapp/微信小程序 项目day03

    一.商品列表 1.1 获取数据 首先能够进入商品列表的途径 传的数据有 了解了这个之后就可以开始了,先创建分支 创建编译模式,并分配初试数据 这个时候就可以获取数据了 需要的数据 所以在发起请求之前需 ...

  3. 第一章:TypeScript快速入门

    一.TypeScript 开发环境搭建 1.TypeScript 是什么? TypeScript 是一种由微软开发的自由和开源的编程语言.它是 JavaScript 的一个超集,而且本质上向这个语言添 ...

  4. 2022春每日一题:Day 22

    题目:[HAOI2008]糖果传递 光看题几乎没有思路,但是显然到最后每个人手中一定有 d=s/n个糖果(s为所有人糖果总和),不妨设2号给1号x2个糖果,3号给2号x3个.....1号给n号x1个, ...

  5. Huawei OJ 题解 - 31. 整数拆分 - Go 参考解答

    ## 简介- 详情:http://oj.rnd.huawei.com/problems/31/details- 难度:简单## 思路TODO## 用例TODO## 解答```gopackage mai ...

  6. AtCoder Regular Contest 151补题

    AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...

  7. PHY驱动调试之 --- PHY控制器驱动(二)

    1. 前言 内核版本:linux 4.9.225,以freescale为例. 2. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII ...

  8. 理解MySQL事务

    事务是什么 百度百科是这么定义的: 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元.在关系数据库中,一个事务可以是一条 ...

  9. javaweb string

    今天遇到一个跨域请求jsonp格式报错,其原因是其中一个参数过从我方数据库取出就带有换行格式的,类似于: 这条数据竟然自带格式换行. 而我们现常用的trim()只能去掉字符串的头部和尾部的空格, 而要 ...

  10. 微信小程序实战,基于vue2实现瀑布流

    1.什么是瀑布流呢? 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 瀑布流对于图片的展现, ...