4 SubScene
本章介绍了在JavaFX中使用SubScene API的信息。
SubScene节点是场景图中内容的容器。它是用于场景分离的特殊节点。它可以用于使用不同的相机渲染场景的一部分。如果您希望在布局中将3D对象的Y轴朝上,而2D UI对象的Y轴朝下,可以使用SubScene节点。
一些可能的SubScene用例包括:
-
用于UI控件的覆盖层(需要静态相机)
-
用于背景的底图(静态或更新频率较低)
-
“抬头”显示
-
将3D对象的Y轴朝上,将2D UI的Y轴朝下。
创建SubScene
示例4-1显示了在应用程序中创建SubScene节点的两个构造函数。
示例4-1 SubScene构造函数
//
// 使用特定大小的根节点创建SubScene。
//
public SubScene(Parent root, double width, double height)
//
// 构造一个由根节点组成的SubScene,具有宽度和高度的尺寸,指定是否为此场景创建深度缓冲区,
// 并指定是否请求场景抗锯齿。
public SubScene(Parent root, double width, double height, boolean depthBuffer,
SceneAntialiasing antiAliasing)
创建了SubScene之后,您可以使用可用的方法来修改它,以指定或获取SubScene的高度、根节点、宽度、背景填充、用于渲染SubScene的相机类型,以及SubScene是否抗锯齿。
SubScene的示例用法
在示例4-2中展示的CreateSubScene()方法演示了如何使用上述第二个SubScene构造函数。该方法是MSAAApp.java示例应用程序的一部分,该示例应用程序在附录A中列出。
示例4-2 使用SubScene的代码示例
...
SubScene msaa = createSubScene("MSAA = true", cylinder2,
Color.TRANSPARENT,
new PerspectiveCamera(), true);
...
...
private static SubScene createSubScene(String title, Node node,
Paint fillPaint, Camera camera, boolean msaa) {
Group root = new Group();
PointLight light = new PointLight(Color.WHITE);
light.setTranslateX(50);
light.setTranslateY(-300);
light.setTranslateZ(-400);
PointLight light2 = new PointLight(Color.color(0.6, 0.3, 0.4));
light2.setTranslateX(400);
light2.setTranslateY(0);
light2.setTranslateZ(-400);
AmbientLight ambientLight = new AmbientLight(Color.color(0.2, 0.2, 0.2));
node.setRotationAxis(new Point3D(2, 1, 0).normalize());
node.setTranslateX(180);
node.setTranslateY(180);
root.getChildren().addAll(setTitle(title), ambientLight, light, light2, node);
SubScene subScene = new SubScene(root, 500, 400, true,
msaa ? SceneAntialiasing.BALANCED : SceneAntialiasing.DISABLED);
subScene.setFill(fillPaint);
subScene.setCamera(camera);
return subScene;
}
在Ensemble 8示例集的Graphics 3D部分中,还有3D Cubes和Xylophone示例展示了SubScene API的使用。您可以从JavaFX Demos and Samples部分的http://www.oracle.com/technetwork/java/javase/downloads/下载Ensemble 8示例。

