Sceneform: Как отключить обнаружение поверхности и поместить объект перед камерой? - PullRequest
0 голосов
/ 02 декабря 2018

Я использую Sceneform с ARCore на Android и не могу четко понять концепции с помощью предоставленной документации.Я пытаюсь изменить существующее приложение HelloSceneform из github и пытаюсь создать приложение, в котором, как только оно запускается, пользователь видит трехмерный объект прямо перед собой.Это очень похоже на то, что я нашел 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();
    });

Мне просто нужно отключить обнаружение поверхности, получить объект Pose, привязку и установить объект напрямую, без каких-либо сенсорных прослушивателей на Android, и все это в Java-коде.Когда я пытаюсь создать якорь, используя позу, это вызывает исключение NotTrackingException.

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

Я надеюсь, что кто-то может найти время, чтобы помочь.

1 Ответ

0 голосов
/ 03 декабря 2018
 @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);
    }
...