Как поставить объект без прикосновения к экрану - Android AR - PullRequest
2 голосов
/ 28 октября 2019

Я пытаюсь показать объект, не нажимая на экран, используя ARCore. В базовом примере ARCore Sceneform, предоставленном Google, вам нужно нажать на экран после того, как он обнаружит поверхность.

Я хочу реализовать, чтобы AR отображал объект, не касаясь экрана (в Java).

У меня есть это:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (!checkIsSupportedDeviceOrFinish(this)) {
        return;
    }

    setContentView(R.layout.activity_main);

    arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);

    // 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().
    ModelRenderable.builder()
            .setSource(this, R.raw.model)
            .build()
            .thenAccept(renderable -> andyRenderable = renderable)
            .exceptionally(
                    throwable -> {
                        Toast toast =
                                Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
                        toast.setGravity(Gravity.CENTER, 0, 0);
                        toast.show();
                        return null;
                    });


    arFragment.setOnTapArPlaneListener(
            (HitResult hitResult, Image.Plane plane, MotionEvent motionEvent) -> {
                if (andyRenderable == null) {
                    return;
                }

                // Create the Anchor.
                Anchor anchor = hitResult.createAnchor();
                AnchorNode anchorNode = new AnchorNode(anchor);
                anchorNode.setParent(arFragment.getArSceneView().getScene());

                // Create the transformable andy and add it to the anchor.
                TransformableNode andy = new TransformableNode(arFragment.getTransformationSystem());
                andy.setParent(anchorNode);
                andy.setRenderable(andyRenderable);
                andy.select();
            });
}

1 Ответ

2 голосов
/ 29 октября 2019

я сделал аналогично тому, как я получал x, y от пользователя во время видеовызова, это не совсем так, но это поможет вам. Создайте motionEvent, передавая любую точку на экране по умолчанию в x, у. если это вам помогло, то пометьте как ответ.

// MotionEvent parameters
                            long downTime = SystemClock.uptimeMillis();
                            long eventTime = SystemClock.uptimeMillis();
                            int action = MotionEvent.ACTION_DOWN;
                            int metaState = 2;

// dispatch the event
                            MotionEvent event = MotionEvent.obtain(downTime, eventTime, action, x, y, metaState);

создайте событие попадания, используя

HitResult hit = frame.hitTest(event )

, а затем создайте привязку, используя его.

               Trackable trackable = hit.getTrackable();
                // Creates an anchor if a plane or an oriented point was hit.
                if ((trackable instanceof Plane && ((Plane) 
                trackable).isPoseInExtents(hit.getHitPose()))
                        || (trackable instanceof Point
                        && (((Point) trackable).getOrientationMode()
                        == Point.OrientationMode.ESTIMATED_SURFACE_NORMAL || ((Point) 
                  trackable).getOrientationMode()
                        == Point.OrientationMode.INITIALIZED_TO_IDENTITY))) {
                    // Hits are sorted by depth. Consider only closest hit on //a plane 
                   // or oriented point.
                    // Cap the number of objects created. This avoids //overloading 
                     // both the
                    // rendering system and ARCore.
                    if (anchors.size() >= 500) {
                        anchors.get(0).detach();
                        anchors.remove(0);
                    }
                    // Adding an Anchor tells ARCore that it should track //this
                     // position in
                    // space. This anchor is created on the Plane to place //the 3D 
                     //model
                    // in the correct position relative both to the world and //to the 
                        //plane.
                    anchors.add(hit.createAnchor());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...