Сделать стрелку с направлением между 2 якорями ARCore - PullRequest
1 голос
/ 15 апреля 2020

У меня есть 2 якоря, я хотел бы визуализировать объект стрелки на одном якоре и направление наконечника стрелки на другой. Я вставил некоторый код, но он не работал должным образом

private void drawLine(AnchorNode node1, AnchorNode node2) {

    Vector3 point1, point2;
    point1 = node1.getWorldPosition();
    point2 = node2.getWorldPosition();
    node1.setParent(mArFragment.getArSceneView().getScene());

    //find the vector extending between the two points and define a look rotation
    //in terms of this Vector.
    final Vector3 difference = Vector3.subtract(point1, point2);
    final Vector3 directionFromTopToBottom = difference.normalized();
    final Quaternion rotationFromAToB =
            Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
    MaterialFactory.makeTransparentWithColor(getApplicationContext(), new Color(247, 181, 0, 0.7f))
            .thenAccept(
                    material -> {
                        // create a rectangular prism, using ShapeFactory.makeCube()
                        // use the difference vector to extend to the necessary length
                        ModelRenderable model = ShapeFactory.makeCube(
                                new Vector3(.15f, .001f, difference.length()),
                                Vector3.zero(), material);

                        // set the world rotation of the node to the rotation calculated earlier
                        // and set the world position to the midpoint between the given points
                        Node nodeForLine = new Node();
                        nodeForLine.setParent(node1);
                        nodeForLine.setRenderable(model);
                        nodeForLine.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
                        nodeForLine.setWorldRotation(rotationFromAToB);
                    }
            ); // end rendering

    ModelRenderable.builder()
            .setSource(this, Uri.parse("model.sfb"))
            .build()
            .thenAccept(modelRenderable -> {
                AnchorNode anchorNode = new AnchorNode(node1.getAnchor());
                TransformableNode transformableNode = new TransformableNode(mArFragment.getTransformationSystem());
                transformableNode.setParent(anchorNode);
                transformableNode.setRenderable(modelRenderable);
                transformableNode.setWorldRotation(rotationFromAToB);
                mArFragment.getArSceneView().getScene().addChild(anchorNode);

                transformableNode.select();
            })
            .exceptionally(throwable -> {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage(throwable.getMessage()).show();
                return null;
            });
}

Вы видите стрелку, но ее направление не правильное. Текущая ситуация. Посмотреть изображение

1 Ответ

0 голосов
/ 16 апреля 2020

Я думаю, что вы хотите, чтобы стрелка на одной привязке указывала на другую привязку - вы можете сделать это, используя 'setLookDirection' и TransformableNode.

См. Пример ниже:

                var newAnchorNode:AnchorNode = AnchorNode(newAnchor)
                var transNode = TransformableNode(arFragment.transformationSystem)
                transNode.setLookDirection(Vector3(0f, 1f, 1f), Vector3.left())
                transNode.renderable = selectedRenderable
                transNode.setParent(newAnchorNode)
                newAnchorNode.setParent(arFragment.arSceneView.scene)

Вы можете использовать свои собственные значения для двух векторов 3. Позже я обновлю описание метода (ссылки на документацию для ARCore на данный момент не работают), но первый Vector3 - это точка, на которую вы хотите, чтобы ваш визуализируемый объект «смотрел», в вашем случае скорее всего другой якорь, а второй Vector3 - это ориентация рендеринга в сцене - то есть, если вы хотите, чтобы он был в вертикальном положении, лицом влево и т. Д. c.

Одна вещь, о которой следует помнить, AFAIK, Sceeform по-прежнему предназначен для ландшафтного режима, поэтому вы можете нужно поэкспериментировать, чтобы получить ориентацию так, как вы хотите, если она не использует альбомную ориентацию - например, vector3.left () в приведенном выше примере - сделать так, чтобы визуализируемый объект отображался вертикально на портретном дисплее.

...