我有一个与 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)
诚然,我一直在为看似真空的 JavaFX 3D 资源以及我发现的少数资源缺乏彻底性而苦苦挣扎。不过,我已经得出了一个令人满意的猜测。
具体来说,每个Node
(并且您使用的每个类都是 的子类Node
)都有自己的转换列表。据我所知,该类Group
是一个特殊的子类,旨在成为其他 JavaFX 的通用容器。Oracle文档说:Node
Node
Group
应用于组的任何变换、效果或状态都将应用于该组的所有子项。
因此,另一个内部的实例XForm
(Group
将所有可能的转换捆绑在一起的子类)XForm
将应用外部转换,然后将内部转换应用于内部的任何内容。
在这种情况下,变换的命名不太好,但cameraXform
专门用于 x/y 旋转、cameraXform2
专门用于 x/y 平移、cameraXform3
专门用于 z 旋转*。顺序(以及扩展的嵌套)很重要,因为旋转是绕轴执行的;首先翻译将导致场景以不直观的方式对用户的输入做出反应。
*据我所知,使用 z 旋转(在示例应用程序中设置一次)是为了使 y 轴向上而不是 JavaFX 默认的 y 向下。这允许以普遍接受的 x/y/z 轴方向添加形状,同时允许它们以 JavaFX 自己的方向呈现。