为什么 JavaFX 3D 分子示例中使用 3 个 Xform 对象

lhl*_*mgr 4 java javafx-8

我有一个与 Oracle 文档中的 MoleculeSampleApp相关的问题。在该函数中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);
}
Run Code Online (Sandbox Code Playgroud)

The*_*uck 5

诚然,我一直在为看似真空的 JavaFX 3D 资源以及我发现的少数资源缺乏彻底性而苦苦挣扎。不过,我已经得出了一个令人满意的猜测。

转换被分割和嵌套,以便它们按顺序执行。

具体来说,每个Node(并且您使用的每个类都是 的子类Node)都有自己的转换列表。据我所知,该类Group是一个特殊的子类,旨在成为其他 JavaFX 的通用容器。Oracle文档说:NodeNodeGroup

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

因此,另一个内部的实例XFormGroup将所有可能的转换捆绑在一起的子类)XForm将应用外部转换,然后将内部转换应用于内部的任何内容。

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

*据我所知,使用 z 旋转(在示例应用程序中设置一次)是为了使 y 轴向上而不是 JavaFX 默认的 y 向下。这允许以普遍接受的 x/y/z 轴方向添加形状,同时允许它们以 JavaFX 自己的方向呈现。