当前位置: 首页 > 知识库问答 >
问题:

场景形式:如何禁用表面检测并将对象放置在摄像机前面?

夏俊人
2023-03-14

我在Android上与ARCore一起使用Sceneform,无法通过提供的文档清楚地理解这些概念。我正试图从github修改现有的HelloSceneform应用程序,并尝试创建一个应用程序,在这个应用程序中,一旦启动,用户就会直接在他/她的前面看到一个3D对象。这和我发现的很相似https://github.com/google-ar/arcore-unity-sdk/issues/144,但我不知道如何改进现有代码以获得它。

setContentView(R.layout.activity_ux);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
ModelRenderable.builder()
    .setSource(this, R.raw.andy)
    .build()
    .thenAccept(modelRenderable -> {
        andyRenderable=modelRenderable;
    });

arFragment.setOnTapArPlaneListener(
    (HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {  
      Anchor anchor = hitResult.createAnchor(); 
      AnchorNode anchorNode = new AnchorNode(anchor);
      anchorNode.setParent(arFragment.getArSceneView().getScene()); 
      TransformableNode andy = new TransformableNode(arFragment.getTransformationSystem());
      andy.setParent(anchorNode);
      andy.setRenderable(andyRenderable);
      andy.select();
    });

我只需要禁用表面检测,获取一个姿势对象,一个锚点,并在android上直接设置对象,而无需任何触摸侦听器,以及所有这些在java代码中。当我尝试使用姿势创建锚点时,它会给我一个NotTrackingException。

 session=new Session(this);
 ...
 Pose pose = Pose.makeTranslation(-0.41058916f, -0.6668466f,  
 Anchor anchor = session.createAnchor(pose);

我希望有人能花时间帮忙。

共有1个答案

巫经义
2023-03-14
 @Override
    public void onUpdate(FrameTime frameTime) {
        Frame frame = playFragment.getArSceneView().getArFrame();
        if (frame == null) {
            return;
        }
        if (frame.getCamera().getTrackingState() != TrackingState.TRACKING) {
            return;
        }
        for (Plane plane : frame.getUpdatedTrackables(Plane.class)) {
            playFragment.getPlaneDiscoveryController().hide();
            if (plane.getTrackingState() == TrackingState.TRACKING) {
                for (HitResult hit : frame.hitTest(getScreenCenter().x, getScreenCenter().y)) {
                    Trackable trackable = hit.getTrackable();
                    if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
                        Anchor anchor = hit.createAnchor();
                        AnchorNode anchorNode = new AnchorNode(anchor);
                        anchorNode.setParent(playFragment.getArSceneView().getScene());
                        Pose pose = hit.getHitPose();
                        Node node = new Node();
                        node.setRenderable(modelRenderable);
                        node.setLocalPosition(new Vector3(pose.tx(), pose.compose(Pose.makeTranslation(0.0f, 0.05f, 0.0f)).ty(), pose.tz()));
                        node.setParent(anchorNode);
                    }
                }
            }
        }
    }

    private Vector3 getScreenCenter() {
        View vw = findViewById(android.R.id.content);
        return new Vector3(vw.getWidth() / 2f, vw.getHeight() / 2f, 0f);
    }
 类似资料:
  • 场景摄像机配置面板可以配置编辑器场景中摄像机的操作以及渲染参数。 2D Editor Camera:配置 2D 编辑模式下的 camera 参数。 3D Editor Camera:配置 3D 编辑模式下的 camera 参数。 配置参数 Navigation Speed:编辑器移动或缩放摄像机的速度。 2D 编辑模式下会影响 滚轮缩放 模式。 3D 编辑模式下会影响 滚轮缩放 和 漫游 模式。

  • 我正在工作的一个项目和面临一个问题与ARCORE。我在我的项目中使用了ARCore定位,我使用纬度和经度来设置对象的位置。但当我在设备中看到它时,对象位置在AR中是不同的。 它的主要问题是它检测表面和放置图像根据它,如果有任何可能禁用表面检测,那么它的工作是完美的。

  • 是否可以在arcore中使用sceneform设置3d对象的动画?如果是,是否有可用的文件?如果不是的话,谷歌是否计划在近期在sceneform中添加动画支持?

  • 我正在使用ArCore为Android构建一个简单的导航应用程序(Java)。我开始在Google(https://github.com/google-ar/sceneform-android-sdk/tree/master/samples/hellosceneform)的场景表单演示上构建我的应用程序。 目前,该应用程序正在扫描环境中的锚点。用户可以通过点击锚点将对象放置在锚点上。是否可以使用这

  • 我们希望使用后摄像头进行扫描,并选择正确的后摄像头-主摄像头,而不是宽镜头摄像头。 较新的移动设备(例如三星galaxy s10)有几个前后摄像头。调用enumerateDevices()时,我们会得到前后摄像头的列表。我们想从后摄像机列表中选择主摄像机。我们可以使用约束来选择后置摄像机(面向:“环境”),但我们不知道如何区分每个设备的摄像机是主摄像机还是宽镜头摄像机。