我正在一个项目上,但是我想在点击按钮时更改3D资产(例如,Andy)的位置。
我一直在使用.getLocalPosition
来获取资产的头寸,但是我不知道它是否正确。
如果正确,我不知道.setLocalPosoition
是否可行。任何帮助请
答案 0 :(得分:0)
如果您的目标是更改模型相对于其父模型的翻译(位置),则应使用.setLocalPosition()
传递代表新翻译的Vector。
public void setLocalPosition (Vector3 position)
编辑(从答案中移出):
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(); }
}