5 光照
本章介绍了JavaFX 3D图形库中包含的光照API。
现在,光照也被定义为场景图中的一个节点。如果场景中包含的活动光源集合为空,则提供默认光源。每个光源包含一组受影响的节点。如果节点集合为空,则所有场景(或子场景)上的节点都受到影响。如果父节点在该节点集合中,那么它的所有子节点也会受到影响。
光源与Shape3D对象的几何形状和材质相互作用,提供渲染结果。目前,有两种类型的光源:
-
AmbientLight- 似乎来自所有方向的光源。 -
PointLight- 在空间中有一个固定点,并向所有方向均匀辐射光线的光源。
示例5-1显示了光照类层次结构。
示例5-1 光照类层次结构
javafx.scene.Node
javafx.scene.LightBase (抽象类)
javafx.scene.AmbientLight
javafx.scene.PointLight
创建和使用光照
要创建点光源并将其添加到场景中,请执行以下操作:
PointLight light = new PointLight();
light.setColor(Color.RED);
使用以下代码将光源添加到场景图中:
Group lightGroup = new Group();
lightGroup.getChildren().add(light);
root.getChildren().add(lightGroup);
使用以下代码将光源旋转45度:
light.rotate(45);
要移动lightGroup并使光源随之移动,请使用类似以下代码的方法。
lightGroup.setTranslateZ(-75);
setTranslateZ()方法设置属性translateZ的值,在上面的示例代码中设置为-75。该值将添加到由transforms ObservableList和layoutZ定义的任何平移。
示例5-2显示了从MSAAApp.java应用程序中提取的代码片段,演示了如何使用PointLight API。
示例5-2 MSAAApp.java代码片段使用PointLight API
...
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);
...

