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

2023-10-22 13:21

本文主要是介绍如何用AR Engine环境Mesh能力实现虚实遮挡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

效果展示

实现方法

AR Engine提供实时计算并输出画面环境Mesh数据的能力。通过环境Mesh能力虚拟角色可以准确识别当前所处三维空间的情况,让虚拟物体不仅仅能放置在水平面和垂直面上,还可以放置在任意可重建的曲面上。开发者可利用重建的环境Mesh实现虚实遮挡和碰撞检测,可以让虚拟物体藏在真实物品后,避免现实物体和虚拟物体融合现象的发生,从而实现沉浸式AR体验。

集成步骤

开发环境要求:

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. 创建HitResultDisplay类,这个类根据指定的参数来绘制虚拟对象
Public class HitResultDisplay implements SceneMeshComponenDisplay{//初始化VirtualObjectDataVirtualObjectData mVirtualObject = new VirtualObjectData();//在init方法中给mVirtualObject传入上下文Public void init(Context context){mVirtualObject.init(context);//传入材质属性mVirtualObject.setMaterialProperties();}//在onDrawFrame方法中传入ARFrame,用来获取光照估计Public void onDrawFrame(ARFrame arframe){//获取光照估计ARLightEstimate le = arframe.getLightEstimate();//获取当前相机视野的像素强度lightIntensity = le.getPixelIntensity();//获取好之后,需要给mVirtualObject中一些方法传入数据mVirtualObject.draw(…,…,lightIntensity,…);//创建handleTap方法传入ARFrame对象来获取坐标信息handleTap(arframe);}//实现handleTap方法Private void handleTap(ARFrame frame){//用ARFrame对象调用hitTestList<ARHitResult> hitTestResults = frame.hitTest(tap);//检测平面是否被击中,是否在平面多边形中被击中For(int i = 0;i<hitTestResults.size();i++){ARHitResult hitResultTemp = hitTestResults.get(i);Trackable = hitResultTemp.getTrackable();If(trackable instanceof ARPoint && ((ARPoint) trackable).getOrientationMode() == ARPoint.OrientationMode.ESTIMATED_SURFACE_NORMAL){isHasHitFlag = true;hitResult = hitResultTemp;}}}
}
  1. 创建SceneMeshDisplay类,用来渲染场景网络
Public class SceneMeshDiaplay implements SceneMeshComponenDisplay{//需要在init中实现openGL的一些操作Public void init(Context context){}//在onDrawFrame方法中获取当前对应的环境MeshPublic void onDrawFrame(ARFrame arframe){ARSceneMesh arSceneMesh = arframe.acquireSceneMesh();//创建一个用来更新数据的方法把arSceneMesh传入进去updateSceneMeshData(arSceneMesh);//arSceneMesh使用完之后需要释放arSceneMesh.release();}//实现这个方法用来更新数据Public void updateSceneMeshData(ARSceneMesh sceneMesh){//返回当前视角下环境Mesh顶点坐标数组FloatBuffer meshVertices = sceneMesh.getVertices();//返回当前视角下环境Mesh三角面片顶点索引的数组IntBuffer meshTriangleIndices = sceneMesh.getTriangleIndices();}
}
  1. 创建SceneMeshRenderManager类,这个类来提供与外部场景相关的渲染管理器,

包括虚拟对象渲染管理

public class SceneMeshRenderManager implements GLSurfaceView.Render{//初始化更新网络数据和执行渲染的类private SceneMeshDisplay mSceneMesh = new SceneMeshDisplay();//初始化绘制虚拟对象的类Private HitResultDisplay mHitResultDisplay = new HitResultDisplay();//实现onSurfaceCreated()方法public  void  onSurfaceCreated(){//需要给mSceneMesh 类和mHitResultDisplay类传入 contextmSceneMesh.init(mContext);mHitResultDisplay.init(mContext);
}	//实现onDrawFrame()方法;public void onDrawFrame(){//用ARSession对象来配置camera。mArSession.setCameraTexTureName();ARFrame arFrame = mArSession.update();ARCamera arCamera = arframe.getCamera();//把SceneMeshDisplay类需要的数据传过去mSceneMesh.onDrawFrame(arframe,viewmtxs,projmtxs);
}
}
  1. 创建SceneMeshActivity用来展示功能
public class SceneMeshActivity extends BaseActivity{//提供与外部场景相关的渲染管理器,包括虚拟对象渲染管理类。private ScemeMeshRenderManager mSceneMeshRenderManager;//用来管理AR Engine的整个运行状态,private ARSession mArSession;
//需要初始化一些类和对象protected void onCreate(Bundle savedInstanceState){mSceneMeshRenderManager = new SceneMeshRenderManager();
}
//在onResume方法中初始化ARSession
protected void onResume(){//初始化ARSessionmArSession = new ARSession(this.getApplicationContext());//基于session参数创建ARWorldTrackingConfig对象ARConfigBase config = new ARWorldTrackingConfig(mArSession);//需要把ARSession传给SceneMeshRenderManagermSceneMeshRenderManager.setArSession(mArSession);
//需要开启mesh,用config调用setEnableItem方法
config.setEnableItem(ARConfigBase.ENABLE_MESH | ARConfigBase.ENABLE_DEPTH);
}
}

具体实现可参考示例代码

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee

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

这篇关于如何用AR Engine环境Mesh能力实现虚实遮挡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/261729

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联