Я работаю над проектом, но хочу изменить положение 3D-ресурса (например, Энди) при нажатии кнопки.
Я использовал .getLocalPosition
, чтобы получить позицию актива, но я не знаю, правильная ли это функция.
Если это правильно, я не знаю, сработает ли .setLocalPosoition
. Любая помощь, пожалуйста
Если ваша цель — изменить перевод (положение) модели относительно ее родителя, вы должны использовать .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
относится к переводу узла (модель) относительно происхождения родительского узла, а WorldPosition
относится к переводу относительно происхождения мира.
Например:
У вас есть начало мира в (0,0,0) и в этой сцене есть плоскость с переводом (1,1,1) . Когда вы добавляете дочерний элемент в плоскость и устанавливаете его локальное положение в (1,1,1), это означает, что он помещается в сцену относительно источника плоскости, поэтому позиция в мире будет (2,2,2)
Если вы обнаруживаете плоскость и используете ее в качестве родителя для модели, вам нужно будет использовать LocalPosition для перемещения модели относительно плоскости. Из-за того, как вы создаете модель, вы не хотели бы использовать WorldPosition, потому что вы точно не знаете положение в мире.
одна вещь, о которой вы должны заботиться при связывании модели с плоскостью, обнаруженной с помощью обнаружения плоскости, — это сохранение ссылки Anchor. Если привязка к плоскости будет потеряна, позиционирование модели будет несогласованным.
Одним из обходных путей может быть получение перевода мира из обнаруженной плоскости, а затем добавление вашей модели в качестве дочернего элемента сцены с использованием положения плоскости. Тогда мировая и локальная позиция были бы одинаковыми.
LocalPosition
относится к переводу узла (модели) относительно происхождения родительского узла, а WorldPosition
относится к переводу относительно начала мира.
Например, у вас есть начало мира в (0,0,0) и внутри этой сцены есть плоскость с переводом (1,1,1) . Если вы добавите дочерний элемент в плоскость и установите его локальное положение в (1,1,1), это означает, что он будет помещен в сцену относительно источника плоскости, поэтому мировая позиция будет (2,2,2).
Ох, ну ладно. Мой вопрос может быть широким, но, пожалуйста, помогите мне. После того, как я закончу обнаружение самолета, поместите Энди в центр самолета. Представьте, что это пустая квадратная комната, я ставлю Энди посередине комнаты. Теперь я хочу изменить положение Энди на правую сторону комнаты, мне нужно использовать LocalPosition
или WorldPosition
?
Если вы обнаруживаете плоскость и используете ее в качестве родителя для модели (Энди), вам нужно будет использовать LocalPosition для перемещения модели относительно плоскости. Из-за того, как вы создаете модель, вы не хотели бы использовать WorldPosition, потому что вы точно не знаете положение в мире.
одна вещь, о которой вы должны заботиться при связывании модели с плоскостью, обнаруженной с помощью обнаружения плоскости, — это сохранение ссылки Anchor. Если якорная ссылка на плоскость будет потеряна, позиционирование модели будет несогласованным.
Одним из обходных путей может быть получение перевода мира из обнаруженной плоскости, а затем добавление вашей модели в качестве дочернего элемента сцены с использованием положения плоскости. Тогда мировая и локальная позиция были бы одинаковыми.
Огромное спасибо. Я понимаю это сейчас.
Нужно ли очищать старые позиции в узле и заменять их новым набором позиций? Например, после создания случайной позиции из функции для узла, я должен очистить setLocalPosition()
на setLocalPosition(0,0 0)
и заменить их тем, что предоставила функция.
Нет, вам не нужно сбрасывать позицию на (0,0,0). например, у вас есть модель в (1,1,1) и вы хотите переместить ее в (2,2,2). Если вы установите локальную позицию на (0,0,0) файл. Установите снова на (2,2,2), это заставит модель «дрожать» или прыгать, когда ее перевод изменится на (0,0,0), а затем (2,2,2).
О, хорошо.. Спасибо.
У меня есть положение узлов в разных позициях. Вот они будут разные LocalPositions
. Я создал кнопку, чтобы присвоить узлам положение (0,0,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(); }
}
Проверяли ли вы localPosition, прежде чем пытаться изменить его, чтобы убедиться, что вы не устанавливаете аналогичное значение? Например, если локальная позиция (2,2,2) и вы пытаетесь изменить ее на то же значение, ничего не сдвинется.
также... почему вы удаляете дочерний узел только для того, чтобы добавить его в следующей строке?
Итак, в чем разница между .getLocalPosition() и .getWorldPosition() при размещении узла на плоскости?