Прикрепите объект к камере Arcore - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь создать объект, который прикреплен к камере, и это не якорь в студии android. Он будет двигаться вместе с камерой. Здесь в коде я попытался сохранить положение камеры и сохранить его в Vectore3, что бесполезно. Я нашел https://github.com/google-ar/arcore-android-sdk/issues/103, который выполняется с помощью единичной матрицы, но это сложно. Итак, мне нужно знать, как сопоставить объект и камеру и как ее обновить.

                    Frame frame = arFragment.getArSceneView().getArFrame();
                    float x = frame.getCamera().getPose().qx();
                    float y = frame.getCamera().getPose().qy();
                    float z = frame.getCamera().getPose().qz();
                    Vector3 vec = new Vector3(x,y,z)

                Vector3 node = anchorNode.getWorldPosition();
                MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 0))
                        .thenAccept(
                                material -> {
                                    ModelRenderable model2 = ShapeFactory.makeCube(
                                            new Vector3(.01f, .01f, 0.1f),
                                            zero(), material);
                                    nodeForLine2 = new Node();
                                    nodeForLine2.setParent(anchorNode);
                                    nodeForLine2.setRenderable(model2);
                                    nodeForLine2.setWorldPosition(?vec?);
                                    nodeForLine2.setLocalRotation(Quaternion.axisAngle(new Vector3(1.0f, 0.0f, 0.0f), -40f));
                                }
                        );

1 Ответ

0 голосов
/ 06 августа 2020

Если вы пытаетесь показать изображение объекта, который всегда должен находиться в одном и том же месте при предварительном просмотре, например, в видоискателе или зоне фокусировки в центре предварительного просмотра, тогда вам может быть проще просто добавьте его как отдельный вид поверх AR View.

Например, на макете ниже есть кнопка, наложенная на AR Fragment, но вы можете заменить его представлением, содержащим, например, ваш объект или изображение.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="LineViewMainActivity">

  <RelativeLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent">

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/blank_button_bottom_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="5dp"
        android:visibility="invisible"
        android:src="@mipmap/ic_launcher" />

    <fragment
        android:id="@+id/ux_fragment"
        android:name="com.google.ar.sceneform.ux.ArFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

  </RelativeLayout>

</FrameLayout>

Если ваши требования касаются реального 3D-объекта, который будет выглядеть по-другому при перемещении вокруг него, т.е. вы видите заднюю часть объекта, когда смотрите на него сзади, вы можете обнаружить, что вам нужно изменить его положение. в центре камеры для каждого кадра, при условии, что это не приведет к значительным накладным расходам для вашего приложения.

Пример кода для размещения привязки перед центром камеры и присоединения рендеринга объекта ниже:

            // Place the anchor 1m in front of the camera. 
            Frame frame = arFragment.getArSceneView().getArFrame();
            Session session = arFragment.getArSceneView().getSession();
            Anchor newMarkAnchor = session.createAnchor(
                        frame.getCamera().getPose()
                                .compose(Pose.makeTranslation(0, 0, -1f)) //This will place the anchor 1M in front of the camera
                                .extractTranslation());
            AnchorNode addedAnchorNode = new AnchorNode(newMarkAnchor);
            addedAnchorNode.setRenderable(andyRenderable);                     addedAnchorNode.setParent(arFragment.getArSceneView().getScene());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...