为什么JavaFX 3D Molecule示例中的3个Xform-Objects

时间:2014-04-11 14:43:09

标签: java javafx-8

我有一个与MoleculeSampleApp in the Oracle Documentation相关的问题。在函数buildCamera()中,他们创建了三个Xform类型的对象,并另外将相机添加到第三个对象。为什么我需要这三个嵌套的`Xform-Objects?提前谢谢!

private void buildCamera() {
    root.getChildren().add(cameraXform);
    cameraXform.getChildren().add(cameraXform2);
    cameraXform2.getChildren().add(cameraXform3);
    cameraXform3.getChildren().add(camera);
    cameraXform3.setRotateZ(180.0);

    camera.setNearClip(0.1);
    camera.setFarClip(10000.0);
    camera.setTranslateZ(-cameraDistance);
    cameraXform.ry.setAngle(320.0);
    cameraXform.rx.setAngle(40);
}

2 个答案:

答案 0 :(得分:4)

不可否认,我一直在努力应对JavaFX 3D资源看似真空,以及我发现的少数资源缺乏彻底性。但是,我提出了一个令人满意的猜测。

转换是分割和嵌套的,以便按顺序执行。

具体来说,每个Node(以及您使用的每个类都是Node的子类)都有自己的转换列表。 Group类是Node的一个特殊子类,据我所知,它是其他JavaFX Node的通用容器。 Oracle documentation for Group说:

  

应用于组的任何转换,效果或状态都将应用于该组的所有子项。

结果,在另一个XForm内部的Group(一个XForm子类将所有可能的转换捆绑在一起)的实例将应用外部转换然后内部转换内心的任何事情。

在这种情况下,转换的命名不是很好,但cameraXform专门用于x / y旋转,cameraXform2专门用于x / y转换,{{1专门用于z旋转*。顺序(以及扩展,嵌套)很重要,因为围绕轴进行旋转;首先进行翻译将导致场景以不直观的方式对用户的输入做出反应。

*据我所知,使用z旋转(在示例应用程序中只设置一次),以便y轴指向而不是JavaFX默认的y down。这允许以通常接受的x / y / z轴方向添加形状,同时允许它们以JavaFX自己的方向渲染。

答案 1 :(得分:1)

我相信这就是他们如何能够顺利完成"准确的"转换而不暴露仿射变换(在3D中具有更多相关性)。