随着电子产品的广泛应用,AR技术也开始广泛普及,并涉足游戏、电商、家居装饰等领域。例如在室内设计中,我们可以在实际场景中利用AR技术匹配虚拟软装,在实际应用中利用华为AREngine运动追踪能力输出室内环境的实时3D坐标信息,判断真实的室内环境和虚拟软装。装饰品之间的转换关系,从而稳定、准确地实现软装饰在室内空间的合理摆放。运动追踪能力作为华为AREngine的一项基础能力,主要是持续稳定地追踪终端设备相对于周围环境的位置和姿态的变化,同时输出周围环境特征的3D坐标信息,对AR技术的实际应用起到了重要作用。框架构建的作用是在现实世界和虚拟世界之间架起一座桥梁。特性介绍运动跟踪能力通过跟踪终端设备相对于周围环境的位置和姿态的变化,可以确定终端设备的虚拟坐标系与周围环境的世界坐标系之间的变换关系,并且终端设备的虚拟坐标系可以与周围环境统一在世界坐标系中,从观察者的角度渲染虚拟物体,然后叠加到摄像头图像上,从而实现虚拟和虚拟的几何融合现实。比如下图AR车展的场景,就需要利用运动追踪的能力,实时追踪摄像头相对于周围环境的运动姿态和轨迹变化。通过在虚拟世界和现实世界之间建立一个统一的几何空间,虚拟汽车可以在真实地面上实现。精确放置。实现虚实融合的基本条件是实时跟踪终端设备的运动,并根据运动跟踪结果实时更新虚拟对象的状态,从而建立现实与虚拟之间的稳定连接世界。因此,运动追踪的准确性和质量直接影响AR应用的整体效果,任何延迟、错误等,都会导致虚拟物体晃动或漂移,极大破坏AR体验的真实感和沉浸感。特点与优势近期,华为AREngine3.0采用了SLAM3.0技术,在技术指标上取得了进一步的提升。实现6DOF运动追踪方式(世界追踪方式),可从不同距离、方向、角度观察虚拟物体,营造更逼真的AR体验环境;实现低至1.6cm的单目ATE(绝对轨迹误差),保证虚拟物体的稳定性,体验效果更佳。平面检测时间小于1秒,平面识别和展开速度更快。集成步骤1.登录华为开发者联盟官网,创建应用。2.集成AREngineSDK。打开AndroidStudio项目级“build.gradle”文件。添加Maven存储库。(这里以7.0以下版本为例)在“buildscript>repositories”配置HMSCoreSDK的Maven仓库地址。在“allprojects>repositories”配置HMSCoreSDK的Maven仓库地址。buildscript{repositories{google()jcenter()//配置HMSCoreSDK的Maven仓库地址。maven{url"https://developer.huawei.com/repo/"}}}allprojects{repositories{google()jcenter()//配置HMSCoreSDK的Maven仓库地址。maven{url"https://developer.huawei.com/repo/"}}}打开项目中的应用级“build.gradle”文件。dependencies{implementation'com.huawei.hms:arenginesdk:3.1.0.1'}3.代码开发检查当前设备是否安装了AREngine。如果已安装,它将正常运行。如果没有安装,会自动跳转到应用市场要求安装AREngine。.privatebooleanarEngineAbilityCheck(){booleanisInstallArEngineApk=AREnginesApk.isAREngineApkReady(this);if(!isInstallArEngineApk&&isRemindInstall){Toast.makeText(this,"请同意安装。",Toast.LENGTH_LONG).show();结束();}LogUtil.debug(TAG,"是否安装AR引擎Apk:"+isInstallArEngineApk);if(!isInstallArEngineApk){startActivity(newIntent(this,com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));isRemindInstall=true;}returnAREnginesApk.isAREngineApkReady(this);}运行前权限检查AndroidManifest里面配置相机权限privatestaticfinalintREQUEST_CODE_ASK_PERMISSIONS=1;MAX_privatestaticfinalint10;privatestaticfinalString[]PERMISSIONS_ARRAYS=newString[]{Manifest.permission.CAMERA};ListpermissionsList=newArrayList<>(MAX_ARRAYS);booleanisHasPermission=true;for(Stringpermission:PERMISSIONS_ARRAYS){if(ContextCompat.checkSelfPermission(activity,permission)!=PackageManager.PERMISSION_GRANTED){isHasPermission=false;休息;}}if(!isHasPermission){for(Stringpermission:PERMISSIONS_ARRAYS){if(ContextCompat.checkSelfPermission(activity,permission)!=PackageManager.PERMISSION_GRANTED){permissionsList.add(permission);}}ActivityCompat.requestPermissions(activity,permissionsList.toArray(newString[permissionsList.size()]),REQUEST_CODE_ASK_PERMISSIONS);}调用ARWorldTrackingConfig接口,创建运动跟踪ARSession,privateARSessionmArSession;privateARWorldTrackingConfigmConfig;config.setCameraLensF(ARWorldTrackingConfigmConfig;config.setCameraLensFCameraLensFacing.FRONT);//通过config.setXXX方法配置场景参数config.setPowerMode(ARConfigBase.PowerMode.ULTRA_POWER_SAVING);mArSession.configure(config);mArSession.resume();mArSession.configure(config);mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());ARFramearFrame=mSession.update();//从ARSession中获取一帧数据//设置相机初始化后的环境纹理探针和模式.setEnvTextureData();ARCameraarCamera=arFrame.getCamera();//ARCamera可以从ARFrame获取,ARCamera对象可以获取相机的投影矩阵来渲染窗口。//投影矩阵的大小为4*4.float[]projectionMatrix=newfloat[16];arCamera.getProjectionMatrix(projectionMatrix,PROJ_MATRIX_OFFSET,PROJ_MATRIX_NEAR,PROJ_MATRIX_FAR);mTextureDisplay.onDrawFrame(arFrame);StringBuilderStringsb=new);updateMessageData(arFrame,sb);mTextDisplay.onDrawFrame(sb);//ViewMatrix的大小为4*4.float[]viewMatrix=newfloat[16];arCamera.getViewMatrix(viewMatrix,0);for(ARPlaneplane:mSession.getAllTrackables(ARPlane.class)){//从ARSession获取所有可跟踪平面。if(plane.getType()!=ARPlane.PlaneType.UNKNOWN_FACING&&plane.getTrackingState()==ARTrackable.TrackingState.TRACKING){hideLoadingMessage();休息;}}drawTarget(mSession.getAllTrackables(ARTarget.class),arCamera,viewMatrix,projectionMatrix);mLabelDisplay.onDrawFrame(mSession.getAllTrackables(ARPlane.class),arCamera.getDisplayOrientedPose(),projectionMatrix);handleGestureEvent(arFrame,arCamera,投影矩阵,viewMatrix);ARLightEstimatelightEstimate=arFrame.getLightEstimate();ARPointCloudarPointCloud=arFrame.acquirePointCloud();getEnvironmentTexture(lightEstimate);drawAllObjects(projectionMatrix,viewMatrix,getPixelIntensity(lightEstimate));mPointCloud.onDrawFrame(arPointCloud,viewMatrix,projectionMatrix);ARHitResulthitResult=hitTest4Result(arFrame,arCamera,event.getEventSecond());if(hitResult!=null){mSelectedObj.setAnchor(hitResult.createAnchor());//在命中检测位置设置创建位置,使得ARenginecontinuoustracking}根据锚点位置画出想要的虚拟物体。mEnvTextureBtn.setOnCheckedChangeListener((compoundButton,b)->{mEnvTextureBtn.setEnabled(false);handler.sendEmptyMessageDelayed(MSG_ENV_TEXTURE_BUTTON_CLICK_ENABLE,BUTTON_REPEAT_CLICK_INTERVAL_TIME);mEnvTextureModeOpen=!mEnvTextureModeOpen;if(mEnvTextureModeOpen){mEnvTextureLayout.setVisibility(View.VISIBLE);}else{mEnvTextureLayout.setVisibility(View.GONE);}intlightingMode=refreshLightMode(mEnvTextureModeOpen,ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE);refreshConfig(lightingMode);});更多详情>>访问华为AREngine官网了解更多华为AREngine开发指导文档华为AREngine开源仓库地址:GitHub、Gitee访问华为开发者联盟官网了解更多开发指导文档关注我们,第一篇是时候了解HMSCore的最新技术资料了~