ARCore - 如何仅检测单个水平面

我在我的一个项目中与ARCore合作 . 在那里,我需要检测一个平面并在其上放置一些物体(锚点) .

在我的onResume函数中,我创建了一个AR会话,并且只能使用Session配置检测水平平面 .

@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);
            }
        }
    });

在这里,一旦检测到飞机,它就会被隐藏起来 .

任何人都可以建议任何方法来获得第一个检测到的水平面并只在那个平面上放置物体??

提前致谢...!!

回答(1)

3 years ago

Config config = arFragment.getArSceneView().getSession().getConfig();
config.setPlaneFindingMode(Config.PlaneFindingMode.DISABLED);  
arFragment.getArSceneView().getSession().configure(config);