如何更改节点在平面中的位置?

时间:2019-05-13 13:05:22

标签: android augmented-reality arcore sceneform android-augmented-reality

我正在一个项目上,但是我想在点击按钮时更改3D资产(例如,Andy)的位置。

我一直在使用.getLocalPosition来获取资产的头寸,但是我不知道它是否正确。

如果正确,我不知道.setLocalPosoition是否可行。任何帮助请

2 个答案:

答案 0 :(得分:0)

如果您的目标是更改模型相对于其父模型的翻译(位置),则应使用.setLocalPosition()传递代表新翻译的Vector。

public void setLocalPosition (Vector3 position)

ARCore文档: https://developers.google.com/ar/reference/java/sceneform/reference/com/google/ar/sceneform/Node#setLocalPosition(com.google.ar.sceneform.math.Vector3)

编辑(从答案中移出):

LocalPosition是指相对于父节点原点的节点( model )的转换,而WorldPosition是指相对于世界原点的转换。

>

例如:

您的世界原点位于(0,0,0),并且在该场景内有一个平移为(1,1,1)的平面。当您向平面添加一个孩子并将其局部位置设置为(1,1,1)时,这意味着将其相对于平面原点放置在场景中,因此世界位置将为(2,2,2)

如果要检测平面并将其用作模型的父级,则需要使用LocalPosition相对于平面移动模型。由于您对模型进行育儿的方式,您不希望使用WorldPosition,因为您无法准确地知道世界位置。

在将模型作为通过平面检测检测到的平面的父级时,必须要注意的一件事是保留锚点参考。如果对平面的锚参考丢失,则模型位置将不一致。

一种解决方法是从检测到的平面获取世界平移,然后使用平面的位置将模型添加为场景的子级。那么世界和本地位置将是相同的

答案 1 :(得分:0)

这是代码中需要更改房间位置的部分。我尝试了.setLocalPosition(),但是它没有改变模型的位置,但是.setWorldPosition()起作用了。请任何解决方案?

private void changeNodeDetails(float psX, float psY, float psZ,String fnName) { Vector3 furnPosition; furnPosition = new Vector3(psX,psY,psZ);

    this.newOptimizeName = fnName;
    this.psResults = furnPosition;

    List<Node> nodes = arFragment.getArSceneView().getScene().getChildren();

    Optional<Node> optionalNode = nodes.stream().filter(n->n.getName().equals(fnName)).findFirst();`

if(optionalNode.isPresent()){ ``Node node = optionalNode.get(); ``try{ ``Vector3 x = new Vector3(0,0,0); ``Node childNode = node.getChildren().get(0); ``childNode.setWorldPosition(furnPosition); ``node.removeChild(node.getChildren().get(0)); ```node.addChild(childNode); ```Log.i("Furniture Name",String.valueOf(childNode.getName()));

            ```Log.i("Furniture Position x,y,z",String.valueOf(childNode.getWorldPosition()));`

        ``}
        ``catch (IndexOutOfBoundsException ioobe){ ioobe.printStackTrace(); }

    }