JavaFX: Как я могу повернуть 3D-блок на 90 градусов с помощью клавиатуры, а затем сохранить и загрузить вращение с помощью JSON? - PullRequest
1 голос
/ 28 мая 2019

У меня есть «javafx.scene.shape.Box» с «javafx.scene.shape.MeshView», показанным в его координатах.

Я хочу повернуть это поле на 90 градусов с помощью клавиатуры (возможно, WASDQE, WS, QE и AD для разных осей).Я также хочу сохранить вращение блока в JSON и затем снова установить его.

То, что я пробовал (свойства box- и meshview связаны):

box.setRotate(box.getRotate + angle); // angle being +-90 and reset on > 360 or < -360
box.setRotationAxis(Rotate.X_AXIS); // Axis depending on key pressed


Этот подход работает для текущей оси, и он работает для сохранения и загрузки с использованием JSON, так как я могу установить / получить это значение.Однако при этом кажется, что я не могу повернуть все углы, потому что, когда я меняю ось вращения, он забывает предыдущее вращение и начинает с поворота «по умолчанию» / «запуск».

У меня естьтакже попытался сделать это, как показано ниже:

this.setRotationAxis(this.getRotationAxis().normalize().add(Rotate.X_AXIS));

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

Последнее, что я пытался, это добавить вращение как преобразование:


this.getTransforms().add(new Rotate(angle, Rotate.X_AXIS));

(
also tried this with some code I found that did this with inverseDeltaTransform (where node being the box):

private void addRotate(Node node, Point3D rotationAxis, double angle) {
      ObservableList<Transform> transforms = node.getTransforms();
      try {
          for (Transform t : transforms) {
             rotationAxis = t.inverseDeltaTransform(rotationAxis);
          }
      } catch (NonInvertibleTransformException ex) {
          throw new IllegalStateException(ex);
      }
          transforms.add(new Rotate(angle, rotationAxis));
     }

)

Однако этот подход оставляет мне две проблемы.

Проблема 1: Если я рендеринг окна, он вращается очень хорошо, но если я рендеринг сетки, он, кажется, вращается вокруг оси, а не вращается на месте.

Проблема 2: Еслия добавляю вращение с помощью преобразований, как сохранить текущее вращение в JSON, а затем снова применить его при загрузке?box.getRotationAxis () и box.getRotate () теперь будут просто отображать значения по умолчанию, как будто box никогда не поворачивается, и box.getTransforms (), кажется, не облегчает это.

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

...