当前位置: 首页 > 后端技术 > Java

如何在真实场景中自由放置AR虚拟物体?

时间:2023-04-01 15:40:06 Java

随着AR的发展和电子设备的普及,降低了人们在日常生活中使用AR技术的门槛。例如,用AR测量不方便测量的物体,既方便又准确;也很方便;在线购物时,可以用AR来选购不确定的商品,体验更真实。要将虚拟物体与现实世界融合,一个重要的步骤就是将虚拟物体准确地放置在真实场景中。当用户触摸电子屏幕上的任意位置时,可以创建一个AR对象以实现良好的交互体验。华为HMSCoreAREngine持续追踪设备相对于周围环境的位置和姿态变化,在虚拟数字世界和真实物理世界之间建立统一的几何空间,为您的应用提供虚实融合的基础平台相互作用。命中检测技术允许用户通过点击终端设备的屏幕来选择真实环境中的兴趣点。将终端设备屏幕上的兴趣点映射到真实环境中的兴趣点,从兴趣点发出射线连接到摄像头所在位置。,返回与该射线相交的任何平面或特征点在真实世界空间中的位置和姿态以及相交位置。命中检测和平面碰撞,获取碰撞点的位置和法向量,方便用户自由选择环境中的物体或与之交互。Demo开发步骤开发环境要求:JDK1.8.211及以上版本。安装AndroidStudio3.0及以上:minSdkVersion26及以上targetSdkVersion29(推荐)compileSdkVersion29(推荐)Gradle6.1.1及以上(推荐)在华为终端设备上的应用商店下载AREngine服务器APK(需要在华为应用商店,搜索“HuaweiAREngine”),在终端设备上安装。测试应用的设备:参见AREngine特性软硬件依赖表中Mesh环境支持的设备列表。如果同时使用多个HMSCore服务,需要使用每个Kit对应的最大值。开发准备在开发应用之前,您需要在华为开发者联盟网站注册为开发者并完成实名认证。具体请参见账号注册与认证。华为以Maven仓库集成方式提供AREngineSDK包。在开始开发之前,您需要将AREngineSDK集成到您的开发环境中。对于7.0、7.0和7.1及以上版本的Gradle插件,AndroidStudio的代码库配置有所不同。请根据您当前的Gradle插件版本选择相应的配置流程。以7.0为例:打开AndroidStudio项目级“build.gradle”文件,添加Maven代码库。在“buildscript>repositories”配置HMSCoreSDK的Maven仓库地址。buildscript{repositories{google()jcenter()maven{url"https://developer.huawei.com/repo/"}}}打开项目级"settings.gradle"文件,配置HMS的Maven仓库地址CoreSDKdependencyResolutionManagement{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,它提供与世界场景相关的渲染管理,包括标签渲染和虚拟对象渲染管理。publicclassWorldRenderManagerimplementsGLSurfaceView.Renderer{//此方法构造函数传递上下文publicWorldRenderManager(Activityactivity,Contextcontext){mActivity=activity;mContext=上下文;...}//该方法设置了ARSession,ARSession会更新并获取OnDrawFrame的最新数据。publicvoidsetArSession(ARSessionarSession){if(arSession==null){LogUtil.error(TAG,"setSession错误,arSession为空!");返回;}mSession=arSession;}//设置ARWorldTrackingConfig并获取配置模式。publicvoidsetArWorldTrackingConfig(ARWorldTrackingConfigarConfig){if(arConfig==null){LogUtil.error(TAG,"setArWorldTrackingConfig错误,arConfig为空!");返回;}mArWorldTrackingConfig=arConfig;}//实现onDrawFrame方法@Overridepublic(GL10未使用){mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());ARFramearFrame=mSession.update();ARCameraarCamera=arFrame.getCamera();...}//命中结果输出privateARHitResulthitTest4Result(ARFrameframe,ARCameracamera,MotionEventevent){ARHitResulthitResult=null;ListhitTestResults=frame.hitTest(event);//判断命中点是否在平面多边形内。ARHitResulthitResultTemp=hitTestResults.get(i);如果(hitResultTemp==null){继续;}ARTrackabletrackable=hitResultTemp.getTrackable();//判断点云是否被点击,点是否正对相机。booleanisPointHitJudge=trackableinstanceofARPoint&&((ARPoint)trackable).getOrientationMode()==ARPoint.OrientationMode.ESTIMATED_SURFACE_NORMAL;//优先考虑平面上的点。如果(isPlanHitJudge||isPointHitJudge){hitResult=hitResultTemp;if(trackableinstanceofARPlane){break;}}returnhitResult;}}创建一个WorldActivity。本AR实例介绍如何使用HUAWEIAREngine的世界AR场景。publicclassWorldActivityextendsBaseActivity{privateARSessionmArSession;privateGLSurfaceViewmSurfaceView;privateARWorldTrackingConfigmConfig;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){LogUtil.info(TAG,“onCreate”);super.onCreate(savedInstanceState);setContentView(R.layout.world_java_activity_main);mWorldRenderManager=newWorldRenderManager(this,this);mWorldRenderManager.setDisplayRotationManage(mDisplayRotationManager);mWorldRenderManager.setQueuedSingleTaps(mQueuedSingleTaps)}errorMessage=null;如果(mArSession==null){尝试{如果(!arEngineAbilityCheck()){完成();返回;}mArSession=newARSession(this.getApplicationContext());mConfig=newARWorldTrackingConfig(mArSession);refreshConfig(ARConfigBase.LIGHT_MODE_ENVIRONMENT_LIGHTING|ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE);}catch(ExceptioncapturedException){setMessageWhenError(capturedException);}if(errorMessage!=null){stopArSession();返回;}}@OverrideprotectedvoidonPause(){LogUtil.info(TAG,"onPausestart.");超级.onPause();if(mArSession!=null){mDisplayRotationManager.unregisterDisplayListener();mSurfaceView.onPause();mArSession.pause();}LogUtil.info(TAG,"onPauseend.");}@OverrideprotectedvoidonDestroy(){LogUtil.info(TAG,"onDestroystart.");如果(mArSession!=null){mArSession.stop();mArSession=null;}如果(mWorldRenderManager!=null){mWorldRenderManager.releaseARAnchor();}super.onDestroy();LogUtil.info(TAG,"onDestroyend.");}…..}更多详情>>访问HUAWEIDevelopers开发指导文档官网华为移动服务开源仓库地址:关注GitHub和Gitee,了解HMSCore最新技术资讯~