ARCore - Как обнаружить только одну горизонтальную плоскость - PullRequest
0 голосов
/ 29 октября 2018

Я работаю с 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);
            }
        }
    });

Здесь, когда самолет обнаружен, он скрывается.

Может кто-нибудь предложить какой-нибудь метод, чтобы получить первую обнаруженную горизонтальную плоскость и поместить объекты только в эту плоскость ??

Заранее спасибо ... !!

1 Ответ

0 голосов
/ 05 декабря 2018
Config config = arFragment.getArSceneView().getSession().getConfig();
config.setPlaneFindingMode(Config.PlaneFindingMode.DISABLED);  
arFragment.getArSceneView().getSession().configure(config);
...