【问题标题】:Render arrow with direction between 2 anchors ARCore用 2 个锚点 ARCore 之间的方向渲染箭头
【发布时间】:2020-04-15 17:35:33
【问题描述】:

我有 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;
            });
}

您会看到箭头已渲染,但其方向不正确。 Current situation. See image

【问题讨论】:

    标签: java android arcore sceneform


    【解决方案1】:

    我认为您希望一个锚点上的箭头指向另一个锚点 - 您可以使用“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)
    

    在此处查看 API 文档:

    这实际上是针对 Scenefrom 1.15 的,较新的 1.16 版本现已在 GitHub 上开源,但我认为不存在详细的 API 描述,因此此时(2020 年 5 月)上面仍然是一个好地方。

    您可以对两个vector3 使用自己的值。

    第一个 Vector3 是您希望可渲染对象“查看”的点,在您的情况下最有可能是另一个锚点,第二个 Vector3 是场景中可渲染对象的方向 - 即,如果您希望它直立,面向离开等等。

    需要注意的一件事,AFAIK,Sceeform 仍然是为横向模式设计的,因此如果不使用横向,您可能需要尝试以您想要的方式获得方向 - 例如示例中的 vector3.left()上面是使可渲染对象在纵向显示上竖直显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多