Как изменить положение узла на плоскости?

Я работаю над проектом, но хочу изменить положение 3D-ресурса (например, Энди) при нажатии кнопки.

Я использовал .getLocalPosition, чтобы получить позицию актива, но я не знаю, правильная ли это функция.

Если это правильно, я не знаю, сработает ли .setLocalPosoition. Любая помощь, пожалуйста

4
0
2 093
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если ваша цель — изменить перевод (положение) модели относительно ее родителя, вы должны использовать .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. Если привязка к плоскости будет потеряна, позиционирование модели будет несогласованным.

Одним из обходных путей может быть получение перевода мира из обнаруженной плоскости, а затем добавление вашей модели в качестве дочернего элемента сцены с использованием положения плоскости. Тогда мировая и локальная позиция были бы одинаковыми.

Итак, в чем разница между .getLocalPosition() и .getWorldPosition() при размещении узла на плоскости?

Jude Asiamah 13.05.2019 16:12
LocalPosition относится к переводу узла (модели) относительно происхождения родительского узла, а WorldPosition относится к переводу относительно начала мира.
Hermes 13.05.2019 16:15

Например, у вас есть начало мира в (0,0,0) и внутри этой сцены есть плоскость с переводом (1,1,1) . Если вы добавите дочерний элемент в плоскость и установите его локальное положение в (1,1,1), это означает, что он будет помещен в сцену относительно источника плоскости, поэтому мировая позиция будет (2,2,2).

Hermes 13.05.2019 16:17

Ох, ну ладно. Мой вопрос может быть широким, но, пожалуйста, помогите мне. После того, как я закончу обнаружение самолета, поместите Энди в центр самолета. Представьте, что это пустая квадратная комната, я ставлю Энди посередине комнаты. Теперь я хочу изменить положение Энди на правую сторону комнаты, мне нужно использовать LocalPosition или WorldPosition?

Jude Asiamah 13.05.2019 16:28

Если вы обнаруживаете плоскость и используете ее в качестве родителя для модели (Энди), вам нужно будет использовать LocalPosition для перемещения модели относительно плоскости. Из-за того, как вы создаете модель, вы не хотели бы использовать WorldPosition, потому что вы точно не знаете положение в мире.

Hermes 13.05.2019 16:40

одна вещь, о которой вы должны заботиться при связывании модели с плоскостью, обнаруженной с помощью обнаружения плоскости, — это сохранение ссылки Anchor. Если якорная ссылка на плоскость будет потеряна, позиционирование модели будет несогласованным.

Hermes 13.05.2019 16:42

Одним из обходных путей может быть получение перевода мира из обнаруженной плоскости, а затем добавление вашей модели в качестве дочернего элемента сцены с использованием положения плоскости. Тогда мировая и локальная позиция были бы одинаковыми.

Hermes 13.05.2019 16:43

Огромное спасибо. Я понимаю это сейчас.

Jude Asiamah 13.05.2019 16:49

Нужно ли очищать старые позиции в узле и заменять их новым набором позиций? Например, после создания случайной позиции из функции для узла, я должен очистить setLocalPosition() на setLocalPosition(0,0 0) и заменить их тем, что предоставила функция.

Jude Asiamah 25.05.2019 06:04

Нет, вам не нужно сбрасывать позицию на (0,0,0). например, у вас есть модель в (1,1,1) и вы хотите переместить ее в (2,2,2). Если вы установите локальную позицию на (0,0,0) файл. Установите снова на (2,2,2), это заставит модель «дрожать» или прыгать, когда ее перевод изменится на (0,0,0), а затем (2,2,2).

Hermes 25.05.2019 14:05

О, хорошо.. Спасибо.

Jude Asiamah 25.05.2019 17:51

У меня есть положение узлов в разных позициях. Вот они будут разные LocalPositions. Я создал кнопку, чтобы присвоить узлам положение (0,0,0), и это означает, что они должны быть в одном и том же положении. Но это не работает ... Пожалуйста, любое решение.

Jude Asiamah 26.05.2019 21:23

Это часть кода, которая должна изменить положение комнаты. Я пробовал .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) и вы пытаетесь изменить ее на то же значение, ничего не сдвинется.

Hermes 28.05.2019 21:15

также... почему вы удаляете дочерний узел только для того, чтобы добавить его в следующей строке?

Hermes 28.05.2019 21:16

Другие вопросы по теме