随着电子产品的广泛利用,AR 技术也开始宽泛遍及,在游戏、电商、家装等畛域都有波及。比方,在室内设计时,咱们能够通过 AR 技术在理论场景中进行虚构软装的搭配,使用华为 AR Engine 静止跟踪能力在理论利用中实时输入室内环境的三维坐标信息,确定事实室内环境和虚构软装之间的变换关系,从而稳固精准的实现软装在室内空间的正当搁置。
作为华为 AR Engine 的一项根本能力,静止跟踪能力次要通过继续稳固跟踪终端设备的地位和姿势绝对于周围环境的变动,同时输入周围环境特色的三维坐标信息,在 AR 技术的理论利用中起到了框架搭建的作用,是构建事实世界和虚拟世界的桥梁。
个性介绍
静止跟踪能力通过跟踪终端设备的地位和姿势绝对于周围环境的变动,能够确定终端设备的虚构坐标系与周围环境世界坐标系的变换关系,把终端设备的虚构坐标系一起对立到周围环境的世界坐标系下,从观察者视角渲染虚构物体,再叠加到摄像头图像中,从而实现虚构与事实在几何上的交融。
比方在下图 AR 车展的场景中,就须要借助静止跟踪的能力,实时跟踪摄像头绝对于周围环境的静止姿势和变动轨迹,通过建设虚拟世界和事实世界对立的几何空间,实现虚构汽车在事实高空上的精准搁置。
实现虚实交融的根本条件是实时跟踪终端设备的静止,并依据静止跟踪后果实时更新虚构物体状态,能力在事实和虚拟世界之间建设稳固的分割,所以说,静止跟踪的精度与品质间接影响 AR 利用的整体成果,但凡呈现提早、误差等状况,都会造成虚构物体抖动或者漂移,很大水平上毁坏 AR 体验的真实感和沉迷性。
个性劣势
近日,华为 AR Engine 3.0 应用 SLAM 3.0 技术,在技术指标方面获得了进一步的晋升。
- 实现 6DOF 的静止跟踪形式(世界跟踪形式),能从不同间隔、方向、角度观察虚构物体,营造更加实在的 AR 体验环境;
- 实现单目 ATE(相对轨迹误差)低至 1.6cm,确保虚构物体稳定性,体验成果更佳。
- 立体检测时长小于 1 秒,立体辨认和扩大速度更快。
集成步骤
一、登录华为开发者联盟官网,创立利用。
二、集成 AR Engine SDK。
- 关上 Android Studio 我的项目级“build.gradle”文件。增加 Maven 代码库。(这里以 7.0 以下版本举例)
在“buildscript > repositories”中配置 HMS Core SDK 的 Maven 仓地址。
在“allprojects > repositories”中配置 HMS Core SDK 的 Maven 仓地址。
buildscript {
repositories {google()
jcenter()
// 配置 HMS Core SDK 的 Maven 仓地址。maven {url "https://developer.huawei.com/repo/"}
}
}
allprojects {
repositories {google()
jcenter()
// 配置 HMS Core SDK 的 Maven 仓地址。maven {url "https://developer.huawei.com/repo/"}
}
}
- 关上我的项目中利用级的“build.gradle”文件。
dependencies {implementation 'com.huawei.hms:arenginesdk:3.1.0.1'}
三、代码开发
- 查看以后设施是否装置了 AR Engine,若曾经装置则失常运行,若没有装置被动跳转利用市场,申请装置 AR Engine。
private boolean arEngineAbilityCheck() {boolean isInstallArEngineApk = AREnginesApk.isAREngineApkReady(this);
if (!isInstallArEngineApk && isRemindInstall) {Toast.makeText(this, "Please agree to install.", Toast.LENGTH_LONG).show();
finish();}
LogUtil.debug(TAG, "Is Install AR Engine Apk:" + isInstallArEngineApk);
if (!isInstallArEngineApk) {startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));
isRemindInstall = true;
}
return AREnginesApk.isAREngineApkReady(this);
}
- 运行前权限查看
AndroidManifest 外面配置相机权限
<uses-permission android:name="android.permission.CAMERA" />
private static final int REQUEST_CODE_ASK_PERMISSIONS = 1;
private static final int MAX_ARRAYS = 10;
private static final String[] PERMISSIONS_ARRAYS = new String[]{Manifest.permission.CAMERA};
List<String> permissionsList = new ArrayList<>(MAX_ARRAYS);
boolean isHasPermission = true;
for (String permission : PERMISSIONS_ARRAYS) {if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
isHasPermission = false;
break;
}
}
if (!isHasPermission) {for (String permission : PERMISSIONS_ARRAYS) {if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {permissionsList.add(permission);
}
}
ActivityCompat.requestPermissions(activity,
permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_PERMISSIONS);
}
- 调用 ARWorldTrackingConfig 接口,创立静止跟踪 ARSession,
private ARSession mArSession;
private ARWorldTrackingConfig mConfig;
config.setCameraLensFacing(ARConfigBase.CameraLensFacing.FRONT); // 通过 config.setXXX 办法配置场景参数
config.setPowerMode(ARConfigBase.PowerMode.ULTRA_POWER_SAVING);
mArSession.configure(config);
mArSession.resume();
mArSession.configure(config);
mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
ARFrame arFrame = mSession.update(); // 从 ARSession 中获取一帧的数据。// Set the environment texture probe and mode after the camera is initialized.
setEnvTextureData();
ARCamera arCamera = arFrame.getCamera(); // 能够从 ARFrame 中获取 ARCamera,ARCamera 对象能够获取相机的投影矩阵,用来渲染窗口。// The size of the projection matrix is 4 * 4.
float[] projectionMatrix = new float[16];
arCamera.getProjectionMatrix(projectionMatrix, PROJ_MATRIX_OFFSET, PROJ_MATRIX_NEAR, PROJ_MATRIX_FAR);
mTextureDisplay.onDrawFrame(arFrame);
StringBuilder sb = new StringBuilder();
updateMessageData(arFrame, sb);
mTextDisplay.onDrawFrame(sb);
// The size of ViewMatrix is 4 * 4.
float[] viewMatrix = new float[16];
arCamera.getViewMatrix(viewMatrix, 0);
for (ARPlane plane : mSession.getAllTrackables(ARPlane.class)) { // 从 ARSession 中获取所有的可跟踪立体。if (plane.getType() != ARPlane.PlaneType.UNKNOWN_FACING
&& plane.getTrackingState() == ARTrackable.TrackingState.TRACKING) {hideLoadingMessage();
break;
}
}
drawTarget(mSession.getAllTrackables(ARTarget.class), arCamera, viewMatrix, projectionMatrix);
mLabelDisplay.onDrawFrame(mSession.getAllTrackables(ARPlane.class), arCamera.getDisplayOrientedPose(),
projectionMatrix);
handleGestureEvent(arFrame, arCamera, projectionMatrix, viewMatrix);
ARLightEstimate lightEstimate = arFrame.getLightEstimate();
ARPointCloud arPointCloud = arFrame.acquirePointCloud();
getEnvironmentTexture(lightEstimate);
drawAllObjects(projectionMatrix, viewMatrix, getPixelIntensity(lightEstimate));
mPointCloud.onDrawFrame(arPointCloud, viewMatrix, projectionMatrix);
ARHitResult hitResult = hitTest4Result(arFrame, arCamera, event.getEventSecond());
if (hitResult != null) {mSelectedObj.setAnchor(hitResult.createAnchor()); // 在命中检测地位创立锚点,使得 AREngine 继续跟踪。}
- 依据锚点地位来绘制所需的虚构物体。
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);
}
int lightingMode = refreshLightMode(mEnvTextureModeOpen, ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE);
refreshConfig(lightingMode);
});
理解更多详情 >>
拜访华为 AR Engine 官网,理解更多相干内容
获取华为 AR Engine 开发领导文档
华为 AR Engine 开源仓库地址:GitHub、Gitee
拜访华为开发者联盟官网,理解更多相干内容
获取开发领导文档
关注咱们,第一工夫理解 HMS Core 最新技术资讯~