无法将 JavaFX 灯添加到多个子场景
Can't add JavaFX lights to multiple SubScenes
问题
在 JavaFX 中是每个 3D 场景的默认灯光。这是从场景顶部照射的 PointLight。
我试图在我的程序中展示光的不同可能性,但我 运行 遇到了麻烦。如果我只添加默认的 SubScene、PointLight 和 AmbientLight,一切都按方面工作。但是,如果我再添加一个具有环境光和点光组合的 SubScene,我将得到屏幕截图 2 中显示的结果。似乎所有其他 SubScene 都失去了它们的光并回落到它的默认光。也许我遇到了错误?
已测试系统
- OS: Windows 8.1 x64, Windows 7 x64
- 显卡:AMD 4200 高清,英特尔高清 3000
- Java:1.8.0_45 JDK/JRE x86(32 位),1.8.0_60ea x64
具有 3 个子场景的舞台 - 默认、点、环境
具有 4 个子场景的舞台 - 默认、点、环境、(点、环境)
例子
这是一个Minimal, Complete, and Verifiable example
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.*;
import javafx.stage.Stage;
public class Shapes3DViewer extends Application {
PhongMaterial material;
@Override
public void start(Stage stage) {
material = new PhongMaterial();
material.setDiffuseColor(Color.FIREBRICK);
material.setSpecularColor(Color.YELLOW);
PointLight pointLight = new PointLight(Color.WHITE);
pointLight.setTranslateX(100);
pointLight.setTranslateY(100);
pointLight.setTranslateZ(-300);
pointLight.setRotate(90);
AmbientLight ambient = new AmbientLight();
Group g1 = createSphereGroup(100, "Default light");
Group g2 = createSphereGroup(100, "Point light");
Group g3 = createSphereGroup(100, "Ambient light");
Group g4 = createSphereGroup(100, "Ambient & Point light");
g2.getChildren().add(pointLight);
g3.getChildren().add(ambient);
g4.getChildren().addAll(pointLight, ambient);
SubScene s1 = createSubScene(g1, 400, 400);
SubScene s2 = createSubScene(g2, 400, 400);
SubScene s3 = createSubScene(g3, 400, 400);
SubScene s4 = createSubScene(g4, 400, 400);
HBox root = new HBox();
root.getChildren().addAll(s1, s2, s3, s4);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
private Group createSphereGroup(double radius, String text) {
Sphere c = new Sphere(radius);
c.setMaterial(material);
c.setDrawMode(DrawMode.FILL);
c.setTranslateX(radius * 1.33);
c.setTranslateY(radius * 2);
Label lbl = new Label(text);
lbl.setStyle("-fx-text-fill: red;-fx-font-size: 18pt;");
return new Group(c, lbl);
}
private SubScene createSubScene(Group group, double width, double height) {
SubScene s = new SubScene(group, width, height);
s.setCamera(new PerspectiveCamera());
s.setFill(Color.color(.1, .1, .1));
return s;
}
}
MCVE 的输出:
javafx.runtime.version=8.0.45-b11
OS X 10.9.5
2014 Macbook Pro
问题
我做错了吗,或者这是一个错误?有人可以确认相同的行为吗?
更新
我做了一个新测试,我添加了两个新灯:pointLight2 和 ambient2。
我已经添加到第四个领域。此解决方案有效。
PointLight pointLight2 = new PointLight(Color.WHITE);
pointLight.setTranslateX(100);
pointLight.setTranslateY(100);
pointLight.setTranslateZ(-300);
pointLight.setRotate(90);
AmbientLight ambient2 = new AmbientLight();
g4.getChildren().addAll(pointLight2, ambient2);
看来灯光会被合并,并且只添加到一个场景中,并从所有其他场景中移除。
结论
正如 jewselsea 在他的回答中解释的那样,这 不是错误 !但从我的角度来看,他们应该在 Light 类 中再次重复该声明或进行提示,因为它有点令人困惑。
这不是错误。一个PointLight is a Node。 Node javadoc 状态:"If a program adds a child node to a Parent (including Group, Region, etc) and that node is already a child of a different Parent or the root of a Scene, the node is automatically (and silently) removed from its former parent." 所以应用程序似乎按预期运行。
问题
在 JavaFX 中是每个 3D 场景的默认灯光。这是从场景顶部照射的 PointLight。
我试图在我的程序中展示光的不同可能性,但我 运行 遇到了麻烦。如果我只添加默认的 SubScene、PointLight 和 AmbientLight,一切都按方面工作。但是,如果我再添加一个具有环境光和点光组合的 SubScene,我将得到屏幕截图 2 中显示的结果。似乎所有其他 SubScene 都失去了它们的光并回落到它的默认光。也许我遇到了错误?
已测试系统
- OS: Windows 8.1 x64, Windows 7 x64
- 显卡:AMD 4200 高清,英特尔高清 3000
- Java:1.8.0_45 JDK/JRE x86(32 位),1.8.0_60ea x64
具有 3 个子场景的舞台 - 默认、点、环境
具有 4 个子场景的舞台 - 默认、点、环境、(点、环境)
例子
这是一个Minimal, Complete, and Verifiable example
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.*;
import javafx.stage.Stage;
public class Shapes3DViewer extends Application {
PhongMaterial material;
@Override
public void start(Stage stage) {
material = new PhongMaterial();
material.setDiffuseColor(Color.FIREBRICK);
material.setSpecularColor(Color.YELLOW);
PointLight pointLight = new PointLight(Color.WHITE);
pointLight.setTranslateX(100);
pointLight.setTranslateY(100);
pointLight.setTranslateZ(-300);
pointLight.setRotate(90);
AmbientLight ambient = new AmbientLight();
Group g1 = createSphereGroup(100, "Default light");
Group g2 = createSphereGroup(100, "Point light");
Group g3 = createSphereGroup(100, "Ambient light");
Group g4 = createSphereGroup(100, "Ambient & Point light");
g2.getChildren().add(pointLight);
g3.getChildren().add(ambient);
g4.getChildren().addAll(pointLight, ambient);
SubScene s1 = createSubScene(g1, 400, 400);
SubScene s2 = createSubScene(g2, 400, 400);
SubScene s3 = createSubScene(g3, 400, 400);
SubScene s4 = createSubScene(g4, 400, 400);
HBox root = new HBox();
root.getChildren().addAll(s1, s2, s3, s4);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
private Group createSphereGroup(double radius, String text) {
Sphere c = new Sphere(radius);
c.setMaterial(material);
c.setDrawMode(DrawMode.FILL);
c.setTranslateX(radius * 1.33);
c.setTranslateY(radius * 2);
Label lbl = new Label(text);
lbl.setStyle("-fx-text-fill: red;-fx-font-size: 18pt;");
return new Group(c, lbl);
}
private SubScene createSubScene(Group group, double width, double height) {
SubScene s = new SubScene(group, width, height);
s.setCamera(new PerspectiveCamera());
s.setFill(Color.color(.1, .1, .1));
return s;
}
}
MCVE 的输出:
javafx.runtime.version=8.0.45-b11
OS X 10.9.5
2014 Macbook Pro
问题
我做错了吗,或者这是一个错误?有人可以确认相同的行为吗?
更新
我做了一个新测试,我添加了两个新灯:pointLight2 和 ambient2。 我已经添加到第四个领域。此解决方案有效。
PointLight pointLight2 = new PointLight(Color.WHITE);
pointLight.setTranslateX(100);
pointLight.setTranslateY(100);
pointLight.setTranslateZ(-300);
pointLight.setRotate(90);
AmbientLight ambient2 = new AmbientLight();
g4.getChildren().addAll(pointLight2, ambient2);
看来灯光会被合并,并且只添加到一个场景中,并从所有其他场景中移除。
结论
正如 jewselsea 在他的回答中解释的那样,这 不是错误 !但从我的角度来看,他们应该在 Light 类 中再次重复该声明或进行提示,因为它有点令人困惑。
这不是错误。一个PointLight is a Node。 Node javadoc 状态:"If a program adds a child node to a Parent (including Group, Region, etc) and that node is already a child of a different Parent or the root of a Scene, the node is automatically (and silently) removed from its former parent." 所以应用程序似乎按预期运行。