Как изменить положение узла на плоскости? - PullRequest
1 голос
/ 13 мая 2019

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

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

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

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

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

    }
0 голосов
/ 13 мая 2019

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

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

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

...