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); ...