相机Part2
1. ARCore Camera
ARCore 原理
ARCore 是 Google 的增强现实体验构建平台。
ARCore 使用三个主要功能将虚拟内容与通过手机摄像头看到的现实世界整合:
- 运动跟踪 让手机可以理解和跟踪它相对于现实世界的位置。
- 环境理解 让手机可以检测各类表面(例如地面、咖啡桌或墙壁等水平、垂直和倾斜表面)的大小和位置。
- 光照估计 让手机可以估测环境当前的光照条件。
2. ARCoreCamera
2.1 检测设备是否支持
public abstract class MTArCoreCamera {
/**
* 检查设备是否支持ArCore,如果不在本地白名单内,将直接返回{@link ArCoreApk.Availability#UNSUPPORTED_DEVICE_NOT_CAPABLE}
* 因为可能存在异步网络请求,所以尽量提早调用已保存检测结果。
* @param context
* @return {@link ArCoreApk.Availability#SUPPORTED_INSTALLED} 支持并且已安装
* {@link ArCoreApk.Availability#SUPPORTED_NOT_INSTALLED} 支持但未安装
* {@link ArCoreApk.Availability#SUPPORTED_APK_TOO_OLD} 支持已安装但版本太久
* {@link ArCoreApk.Availability#UNSUPPORTED_DEVICE_NOT_CAPABLE} 不支持
* 其他:检查失败,建议下次继续请求
*/
public static ArCoreApk.Availability checkArCoreSupport(Context context);
...
...
}
2.2 初始化ARCore相机
-
自定义相机参数MTArCoreCamera.ArCoreCameraConfig。
-
普通相机必备的MTCamera、MTCameraPreviewManager、MTCameraRenderManager对应ARCore相机的MTArCoreCamera、MTArCoreCameraPreviewManager、MTArCoreCameraRenderManager。使用方式与原先一致
MTArCoreCamera.Builder arCoreBuilder = new MTArCoreCamera.Builder(this);
MTArCoreCameraRenderManager mtArCoreCameraRenderManager = new MTArCoreCameraRenderManager.Builder().setMtEngine(mtEngine).build();
MTArCoreCameraPreviewManager mtArCoreCameraPreviewManager = new MTArCoreCameraPreviewManager.Builder(this, R.id.camera_layout, mtArCoreCameraRenderManager).build();
arCoreBuilder.addNodes(mtArCoreCameraRenderManager);
arCoreBuilder.addNodes(mtArCoreCameraPreviewManager);
MTArCoreCamera mtArCoreCamera= arCoreBuilder.build();
- 检测的数据处理
包括:人脸数据与空间矩阵信息,需要分别实现ArCoreDetectReceiver和AugmentedFacesReceiver接口,并且添加进MTArCoreCamera的nodes里。
public interface AugmentedFacesReceiver extends NodesReceiver {
/**
* 是否需要ArCore的人脸检测
* @return
*/
boolean isAugmentedFacesRequired();
/**
* ArCore检测的人脸信息分发,注意切换成后置摄像头时将无检测数据
* @param augmentedFacesList
*/
void onAugmentedFacesDetect(List<AugmentedFace> augmentedFacesList);
}
public interface ArCoreDetectReceiver extends NodesReceiver {
/**
* 是否需要ArCore检测的矩阵信息
* @return
*/
boolean isMatrixRequired();
/**
* 检测矩阵信息分发,注意切换成前置摄像头后理论上不支持检测矩阵,数据准确性无法保证
* @param viewMatrix
* @param projectionMatrix
*/
void onMatrixDetect(float[] viewMatrix, float[] projectionMatrix);
}