如何在现实场景中随心放置AR虚拟对象?
随着AR的发展和电子设备的普及,人们在生活中使用AR技术的门槛降低,比如对于不方便测量的物体使用AR测量,方便又准确;遇到陌生的路段使用AR导航,清楚又便捷;网购时拿不准的物品使用AR购物,体验更逼真。
想要让虚拟物体和现实世界相融合,重要的一步就是将虚拟对象准确放置在现实场景中,当用户触摸电子屏幕上的任意地方时即可创建AR对象,达到良好的交互体验。
华为HMS Core AR Engine持续跟踪设备相对于周围环境的位置和姿态变化轨迹,建立虚拟数字世界和现实物理世界的统一几何空间,为您的应用提供虚实融合的交互基础平台。其中命中检测技术让用户可通过点击终端设备屏幕选中现实环境中的兴趣点,终端设备屏幕上的兴趣点映射为现实环境中的兴趣点,并以兴趣点为源发出一条射线连接到摄像头所在位置,返回这条射线贯穿的任何平面或特征点以及交叉位置在现实世界空间中的位置和姿态。命中检测与平面碰撞,获得碰撞点的位置及法向量,让用户可以自由选择环境中的物体或者与它们互动。
Demo
开发步骤
开发环境要求:
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对应的最大值。
开发准备
华为提供了Maven仓集成方式的AR Engine SDK包,在开始开发前,需要将AR Engine SDK集成到您的开发环境中。
Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请根据您当前的Gradle插件版本,选择对应的配置过程。
以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/" } } } }
- 添加依赖 在“dependencies”中添加如下编译依赖:
dependencies { implementation 'com.huawei.hms:arenginesdk:{version} }
开发步骤
- 首先创建WorldRenderManager,这个类提供了与世界场景相关的渲染管理,包括标签渲染和虚拟对象渲染管理。
public class WorldRenderManager implementsGLSurfaceView.Renderer{ //此方法构造函数传递上下文 public WorldRenderManager(Activity activity, Context context) { mActivity = activity; mContext = context; … } //此方法设置ARSession,它将更新并获取OnDrawFrame中的最新数据。 public void setArSession(ARSession arSession) { if (arSession == null) { LogUtil.error(TAG, "setSession error, arSession is null!"); return; } mSession = arSession; } //设置ARWorldTrackingConfig,获取配置模式。 public void setArWorldTrackingConfig(ARWorldTrackingConfig arConfig) { if (arConfig == null) { LogUtil.error(TAG, "setArWorldTrackingConfig error, arConfig is null!"); return; } mArWorldTrackingConfig = arConfig; } //实现onDrawFrame方法 @Override public void onDrawFrame(GL10 unused) { mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId()); ARFrame arFrame = mSession.update(); ARCamera arCamera = arFrame.getCamera(); ……. } //命中结果输出 private ARHitResult hitTest4Result(ARFrame frame, ARCamera camera, MotionEvent event) { ARHitResult hitResult = null; List<ARHitResult> hitTestResults = frame.hitTest(event); //确定命中点是否在平面多边形内。 ARHitResult hitResultTemp = hitTestResults.get(i); if (hitResultTemp == null) { continue; } ARTrackable trackable = hitResultTemp.getTrackable(); //确定点云是否被单击,以及点是否面向相机。 boolean isPointHitJudge = trackable instanceof ARPoint && ((ARPoint) trackable).getOrientationMode() == ARPoint.OrientationMode.ESTIMATED_SURFACE_NORMAL; //优先选择平面上的点。 if (isPlanHitJudge || isPointHitJudge) { hitResult = hitResultTemp; if (trackable instanceof ARPlane) { break; } } return hitResult; } }
- 创建WorldActivity,本AR示例介绍了如何使用HUAWEI AR Engine的世界AR场景。
public class WorldActivity extends BaseActivity { private ARSession mArSession; private GLSurfaceView mSurfaceView; private ARWorldTrackingConfig mConfig; @Override protected void onCreate(Bundle savedInstanceState) { LogUtil.info(TAG, "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.world_java_activity_main); mWorldRenderManager = new WorldRenderManager(this, this); mWorldRenderManager.setDisplayRotationManage(mDisplayRotationManager); mWorldRenderManager.setQueuedSingleTaps(mQueuedSingleTaps) } @Override protected void onResume() { if (!PermissionManager.hasPermission(this)) { this.finish(); } errorMessage = null; if (mArSession == null) { try { if (!arEngineAbilityCheck()) { finish(); return; } mArSession = new ARSession(this.getApplicationContext()); mConfig = new ARWorldTrackingConfig(mArSession); refreshConfig(ARConfigBase.LIGHT_MODE_ENVIRONMENT_LIGHTING | ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE); } catch (Exception capturedException) { setMessageWhenError(capturedException); } if (errorMessage != null) { stopArSession(); return; } } @Override protected void onPause() { LogUtil.info(TAG, "onPause start."); super.onPause(); if (mArSession != null) { mDisplayRotationManager.unregisterDisplayListener(); mSurfaceView.onPause(); mArSession.pause(); } LogUtil.info(TAG, "onPause end."); } @Override protected void onDestroy() { LogUtil.info(TAG, "onDestroy start."); if (mArSession != null) { mArSession.stop(); mArSession = null; } if (mWorldRenderManager != null) { mWorldRenderManager.releaseARAnchor(); } super.onDestroy(); LogUtil.info(TAG, "onDestroy end."); } ….. }
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何从1到99做好产品 | 得物技术
0.前言 如果说推动一款产品从0到1的上线是产品成功的第一步,那么如何实现增长是我们还需要探索努力的99步,本文来聊聊对增长的一些看法。 1.如何判断到了增长期 先简单回顾一下产品生命周期(product life cycle),亦称“商品生命周期”。是指产品从准备进入市场开始到被淘汰退出市场为止的全部运动过程,是由需求与技术的生产周期所决定。是产品或商品在市场运动中的经济寿命,也即在市场流通过程中,由于消费者的需求变化以及影响市场的其他因素所造成的商品由盛转衰的周期。一般分为导入引入期、成长期、成熟期、衰退期四个阶段。 1.1 用户角度:用户增长曲线 ①当新产品推出后,活跃用户曲线忽上忽下,新增用户比例大于流失率,产品处于发展成长阶段,很多用户在体验后觉得无法满足需求并抛弃了软件,也就是此时产品的留存相当低;这时产品生命周期处于引入探索期。②新增用户比例与流失率持平:持平处于成熟稳定阶段。当活跃用户走势出现明显向上拉伸时,产品开始进入成长期,成长期应当越长越好。③当活跃用户增长进入平缓期时,产品进入成熟期。企业可以通过一系列营销、推广策略,延长成熟期,让活跃用户稳定在一个范围内,有足...
- 下一篇
【游戏多媒体】一张图看懂游戏多媒体服务
尊敬的开发者,您好 Petal Gaming Services(花瓣游戏开发者服务)致力于为开发者提供立项、研发、测试、分发、运营全生命周期的游戏服务,提升游戏研运效率,协助开发者打造更好的游戏产品。 现推出“游戏多媒体服务”一页图介绍方便大家了解,欢迎接入体验。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器