我有一个与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);
}
答案 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中具有更多相关性)。