如何改变平面中节点的位置?
How to change the position of a node in a plane?
我正在做一个项目,但我想在点击按钮时更改 3D 资产(例如 Andy)的位置。
我一直在使用 .getLocalPosition
来获取资产的位置,但我不知道它是否是正确的函数。
如果正确,不知道.setLocalPosoition
行不行。请帮忙
如果您的目标是更改模型相对于其 parent 的平移(位置),您应该使用 .setLocalPosition()
传入表示新平移的向量。
public void setLocalPosition (Vector3 position)
编辑(从回答中的评论):
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(); }
}
我正在做一个项目,但我想在点击按钮时更改 3D 资产(例如 Andy)的位置。
我一直在使用 .getLocalPosition
来获取资产的位置,但我不知道它是否是正确的函数。
如果正确,不知道.setLocalPosoition
行不行。请帮忙
如果您的目标是更改模型相对于其 parent 的平移(位置),您应该使用 .setLocalPosition()
传入表示新平移的向量。
public void setLocalPosition (Vector3 position)
编辑(从回答中的评论):
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(); }
}