代码之家  ›  专栏  ›  技术社区  ›  Akash Mishra

如何禁用arcore android中的表面检测

  •  2
  • Akash Mishra  · 技术社区  · 7 年前

    我正在做一个项目,并面临与阿科雷的问题。我用过 ARCore Location 在我的项目中,我使用经纬度设置对象的位置。但当我在设备中看到它时,对象的位置在ar中是不同的。

    CompletableFuture<ViewRenderable> exampleLayout = ViewRenderable.builder()
                        .setView(this, R.layout.example_layout)
                        .build();
    
        // When you build a Renderable, Sceneform loads its resources in the background while returning
        // a CompletableFuture. Call thenAccept(), handle(), or check isDone() before calling get().
        CompletableFuture<ModelRenderable> andy = ModelRenderable.builder()
                .setSource(this, R.raw.andy)
                .build();
    
    
        CompletableFuture.allOf(
                exampleLayout,
                andy)
                .handle(
                        (notUsed, throwable) -> {
                            // When you build a Renderable, Sceneform loads its resources in the background while
                            // returning a CompletableFuture. Call handle(), thenAccept(), or check isDone()
                            // before calling get().
    
                            if (throwable != null) {
                                DemoUtils.displayError(this, "Unable to load renderables", throwable);
                                return null;
                            }
    
                            try {
                                exampleLayoutRenderable = exampleLayout.get();
                                andyRenderable = andy.get();
                                hasFinishedLoading = true;
    
                            } catch (InterruptedException | ExecutionException ex) {
                                DemoUtils.displayError(this, "Unable to load renderables", ex);
                            }
    
                            return null;
                        });
    
        // Set an update listener on the Scene that will hide the loading message once a Plane is
        // detected.
        arSceneView
                .getScene()
                .setOnUpdateListener(
                        frameTime -> {
                            if (!hasFinishedLoading) {
                                return;
                            }
    
                            if (locationScene == null) {
                                // If our locationScene object hasn't been setup yet, this is a good time to do it
                                // We know that here, the AR components have been initiated.
                                locationScene = new LocationScene(this, this, arSceneView);
    
                                // Now lets create our location markers.
                                // First, a layout
                                LocationMarker layoutLocationMarker = new LocationMarker(
                                        77.398151,
                                        28.540926,
                                        getExampleView()
                                );
    
                                // An example "onRender" event, called every frame
                                // Updates the layout with the markers distance
                                layoutLocationMarker.setRenderEvent(new LocationNodeRender() {
                                    @SuppressLint("SetTextI18n")
                                    @Override
                                    public void render(LocationNode node) {
                                        View eView = exampleLayoutRenderable.getView();
                                        TextView distanceTextView = eView.findViewById(R.id.textView2);
                                        distanceTextView.setText(node.getDistance() + "M");
                                    }
                                });
                                // Adding the marker
                                locationScene.mLocationMarkers.add(layoutLocationMarker);
    
                                // Adding a simple location marker of a 3D model
                                locationScene.mLocationMarkers.add(
                                        new LocationMarker(
                                                77.398151,
                                                28.540926,
                                                getAndy()));
                            }
    
                            Frame frame = arSceneView.getArFrame();
                            if (frame == null) {
                                return;
                            }
    
                            if (frame.getCamera().getTrackingState() != TrackingState.TRACKING) {
                                return;
                            }
    
                            if (locationScene != null) {
                                locationScene.processFrame(frame);
                            }
    
                            if (loadingMessageSnackbar != null) {
                                for (Plane plane : frame.getUpdatedTrackables(Plane.class)) {
                                    if (plane.getTrackingState() == TrackingState.TRACKING) {
                                        hideLoadingMessage();
                                    }
                                }
                            }
                        });
    
    
        // Lastly request CAMERA & fine location permission which is required by ARCore-Location.
        ARLocationPermissionHelper.requestPermission(this);
    

    其中的主要问题是,它检测表面并据此放置图像,如果有任何可能禁用表面检测,那么它将完美工作。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mohammad Raheem    7 年前

    使用enablePlaneFinding=false修改会话配置,然后禁用并重新启用arcoreSession。这会使飞机无法找到,但会使现有飞机保持原样。

    如果不想禁用会话,可以在不禁用会话的情况下强制对会话执行onEnable()调用:

     var session = GameObject.Find("ARCore Device").GetComponent<ARCoreSession>(); 
    session.SessionConfig.EnablePlaneFinding = false; session.OnEnable();
    
    推荐文章