我正在我的一个项目中使用 ARCore。在那里,我需要检测一个平面并在其上放置一些对象(锚)。
在我的 onResume 函数中,我创建了一个 AR 会话,并且能够使用会话配置仅检测水平面。
@Override
protected void onResume() {
super.onResume();
if (arSceneView == null) {
return;
}
if (arSceneView.getSession() == null) {
// If the session wasn't created yet, don't resume rendering.
// This can happen if ARCore needs to be updated or permissions are not granted yet.
try {
session = DemoUtils.createArSession(this, installRequested);
mArConfig = session.getConfig();
mArConfig.setPlaneFindingMode(Config.PlaneFindingMode.HORIZONTAL);
mArConfig.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE);
session.configure(mArConfig);
if (session == null) {
installRequested = DemoUtils.hasCameraPermission(this);
return;
} else {
arSceneView.setupSession(session);
}
} catch (UnavailableException e) {
DemoUtils.handleSessionException(this, e);
}
}
try {
arSceneView.resume();
} catch (CameraNotAvailableException ex) {
DemoUtils.displayError(this, "Unable to get camera", ex);
finish();
return;
}
if (arSceneView.getSession() != null) {
try {
session.resume();
} catch (CameraNotAvailableException e) {
e.printStackTrace();
}
}
}
在这里,我得到了许多水平面。我的要求是只获得一个首先检测到的水平面。
因此,我尝试在 setOnUpdateListener 中禁用平面查找模式,如下所示,
arSceneView.getScene().setOnUpdateListener(frameTime -> {
if (loadingMessageSnackbar == null){
return;
}
Frame frame = arSceneView.getArFrame();
if (frame == null){
return;
}
if (frame.getCamera().getTrackingState() != TrackingState.TRACKING){
return;
}
for (Plane plane : frame.getUpdatedTrackables(Plane.class)){
if (plane.getTrackingState() == TrackingState.TRACKING){
Config c =arSceneView.getSession().getConfig();
c.setPlaneFindingMode(Config.PlaneFindingMode.DISABLED);
arSceneView.getSession().configure(c);
}
}
});
在这里,一旦检测到飞机,它就会隐藏起来。
谁能建议任何方法来获取第一个检测到的水平面并将对象仅放置在该平面中?
提前致谢...!!