JavaFX动画/使用窗格查看3d

时间:2018-07-05 14:49:48

标签: java javafx javafx-8 javafx-3d

我第一次使用JavaFX尝试制作一个可以用来演示带有按钮控件的简单动画的应用程序。为此,我在主要阶段使用了BoarderPane,左侧,右侧和底部均使用Gridpanes。

但是,对于中心,我需要能够在其中绘制带有线的球体,我可以旋转该球体以获得不同的视图,同时能够对其中的线进行动画处理,或者至少可以快速移动其中的线。 / p>

我尝试将Pane用作中心,但无法正常工作。我试图使其成为自己的场景和子场景不起作用。而且我不能使用画布,因为画布仅用于2D动画。

是否可以在保持我创建的BoarderPane布局的同时对线条进行动画处理或旋转相机?

在尝试了解以下内容之前,我尝试查看以下内容,但大多数似乎与BoarderPane不兼容:

JavaFX Rotating Camera Around a Pivot

JavaFX Canvas rotate image with fixed center (and without bouncing)

1 个答案:

答案 0 :(得分:3)

每当您要混合2D和3D(以及相机)时,都必须对3D内容使用SubScene container

  

SubScene提供了场景不同部分的分离,每个部分都可以使用不同的相机,深度缓冲区或场景抗锯齿进行渲染。 SubScene嵌入到主场景或另一个子场景中。

如果您有BorderPane容器,则可以完美地将subScene添加到其中心。

对于类似的用例,您可以检查here中的Qubit3D类,该类主要是一个包含带有球体和圆柱体的子场景的组(均来自FXyz 3D {{ 3}})。

您可以轻松地将该组添加到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);
}

如果运行它:

library

请注意,您可以与球体互动(通过鼠标拖动事件),同时还可以启动/停止球体和杆的完整旋转。