Всякий раз, когда вы хотите смешать 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);
}
Если вы запустите его:
Обратите внимание, что вы можете взаимодействовать со сферой (с помощью перетаскиваемых мышью событий), а также можете запускать / останавливать полное вращение сферы и стержня.