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

How to change the position of a node in a plane?

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

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

如果正确,不知道.setLocalPosoition行不行。请帮忙

如果您的目标是更改模型相对于其 parent 的平移(位置),您应该使用 .setLocalPosition() 传入表示新平移的向量。

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) 相对于 parent 节点原点的平移,而 WorldPosition 指的是相对于世界原点的翻译。

例如:

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

如果您正在检测一个平面并将其用作模型的 parent,那么您将需要使用 LocalPosition 相对于平面移动模型。由于您 parent 模型的使用方式,您不想使用 WorldPosition,因为您无法准确了解世界位置。

当parent将模型连接到使用平面检测检测到的平面时,您必须关心的一件事是保持锚点参考。如果平面的锚点参考丢失,则模型定位将不一致。

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

这是需要更改房间位置的代码部分。我试过 .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(); }

    }