JavaFX анимация / Просмотр 3d с панелями - PullRequest
0 голосов
/ 05 июля 2018

Я впервые работаю в JavaFX, чтобы попытаться создать приложение, которое я могу использовать для демонстрации простой анимации с кнопочными элементами управления. Чтобы сделать это, я использовал BoarderPane для начальной стадии, и слева, справа и снизу, используя Gridpanes.

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

Я пытался использовать панель для центра, которая не работает. Я пытался сделать это своей собственной сценой и вспомогательной сценой, которая не работает. И я не могу использовать холст, поскольку он предназначен только для 2D-анимации.

Есть ли способ, которым я могу анимировать линию или повернуть камеру, сохраняя созданный мной макет BoarderPane?

Я пытался посмотреть на следующее прежде, чтобы понять, что я мог сделать, но большинство просто кажется несовместимым с панелью BoarderPane:

вращающаяся камера вокруг оси поворота JavaFX

Поворот изображения в формате JavaFX Canvas с фиксированным центром (без отскока)

1 Ответ

0 голосов
/ 05 июля 2018

Всякий раз, когда вы хотите смешать 2D и 3D (и камеру), вы должны использовать SubScene контейнер для 3D-контента:

SubScene обеспечивает разделение различных частей сцены, каждая из которых может быть визуализирована с использованием другой камеры, буфера глубины или сглаживания сцены. Вспомогательная сцена встроена в основную сцену или другую вспомогательную сцену.

Если у вас есть контейнер BorderPane, вы можете прекрасно добавить подсцену к его центру.

Для аналогичного случая использования вы можете проверить класс Qubit3D из здесь , который в основном представляет собой группу, которая содержит вспомогательную сцену со сферой и цилиндром (оба из FXyz 3D библиотека ).

Вы можете легко добавить эту группу в свою 2D-сцену:

private final Rotate rotate = new Rotate(0, 0, 0, 0, javafx.geometry.Point3D.ZERO.add(1, 1, 1));

@Override
public void start(Stage primaryStage) throws Exception {

    final Timeline timeline = new Timeline(
        new KeyFrame(Duration.seconds(10), 
            new KeyValue(rotate.angleProperty(), 360)));

    final Qubit3D qubit = new Qubit3D();

    final BorderPane root = new BorderPane(qubit);

    final Button buttonAnimate = new Button("Animate");
    buttonAnimate.setOnAction(e -> {
        rotate.setAngle(0);
        timeline.playFromStart();
    });

    root.setLeft(new StackPane(buttonAnimate));
    final Button buttonStop = new Button("Stop");
    buttonStop.setOnAction(e -> timeline.stop());
    root.setRight(new StackPane(buttonStop));

    Scene scene = new Scene(root, 600, 400, true, SceneAntialiasing.BALANCED);
    scene.setFill(Color.BISQUE);

    primaryStage.setScene(scene);
    primaryStage.setTitle("Qubit3D Sample");
    primaryStage.show();

    qubit.rotateRod(rotate);

}

Единственная модификация, которую я добавил в Qubit3D:

public void rotateRod(Rotate rotate) {
    rodSphere.getTransforms().setAll(rotate);
}

Если вы запустите его:

Qubit3D

Обратите внимание, что вы можете взаимодействовать со сферой (с помощью перетаскиваемых мышью событий), а также можете запускать / останавливать полное вращение сферы и стержня.

...