如何在 ARCore Android 中禁用表面检测

Posted

技术标签:

【中文标题】如何在 ARCore Android 中禁用表面检测【英文标题】:How to disable surface detection in ARCore Android 【发布时间】:2019-01-06 09:42:01 【问题描述】:

我正在处理一个项目,但遇到了 ARCore 问题。我在我的项目中使用了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】:

使用 EnablePlaneFinding = false 修改会话配置,然后禁用并重新启用 ARCoreSession。这将禁用飞机查找功能,但会保留现有飞机目前的状态。

如果您不想禁用会话,您可以在会话上强制 OnEnable() 调用而不禁用它:

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

【讨论】:

【参考方案2】:

您可以使用hide() 方法在android 中隐藏平面发现。此外,通过将setEnabled() 方法设置为 false 来禁用平面渲染器。

这样试试,

arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
arFragment.getPlaneDiscoveryController().hide();
arFragment.getPlaneDiscoveryController().setInstructionView(null);
arFragment.getArSceneView().getPlaneRenderer().setEnabled(false);

【讨论】:

以上是关于如何在 ARCore Android 中禁用表面检测的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅如何在Android中使用ARCore来增强人脸Augmented Faces?

ARCore – 如何在没有任何特征点的情况下在墙壁等表面上放置/创建对象?

没有平面的 ARCore 对象跟踪

如何在使用ARCORE将3d.obj放入曲面后更改texture.png?

如何在 ARCore 中显示 PNG 图像?

我的OpenGL学习进阶之旅如何在Android中使用ARCore结合OpenGL ES来实现增强人脸Augmented Faces?