【问题标题】:JavaFX animation/View 3d with panesJavaFX 动画/视图 3d 与窗格
【发布时间】:2018-12-14 02:42:59
【问题描述】:

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

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

我尝试使用窗格作为中心,但不起作用。我试过让它成为自己的场景和子场景,但这不起作用。而且我不能使用画布,因为它只能用于 2D 动画。

有没有一种方法可以在保持我创建的 BoarderPane 布局的同时为线条设置动画或旋转相机?

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

JavaFX Rotating Camera Around a Pivot

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

【问题讨论】:

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


    【解决方案1】:

    当您想要混合 2D 和 3D(和相机)时,您必须为 3D 内容使用 SubScene container

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

    如果你有一个 BorderPane 容器,你可以完美地将 subScene 添加到它的中心。

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

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

    如果你运行它:

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

    【讨论】:

    • 这绝对是完美的。非常感谢。
    猜你喜欢
    • 2016-10-14
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2012-07-29
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多