gpt4 book ai didi

javafx - 无法将 JavaFX 灯光添加到多个子场景

转载 作者:行者123 更新时间:2023-12-01 02:07:57 25 4
gpt4 key购买 nike

问题

在 JavaFX 中,每个 3D 场景都有一个默认灯。这是一个从场景顶部发光的 PointLight。

我试图在我的程序中展示光的不同可能性,但我遇到了麻烦。如果我只添加一个带有默认值、PointLight 和 AmbientLight 的 SubScene,那么一切都会按方面进行。但是,如果我再添加一个带有环境光和点组合光的 SubScene,我将得到屏幕截图 2 中显示的结果。似乎所有其他 SubScene 都失去了它们的光并回落到它的默认光。也许我遇到了错误?

系统测试

  • 操作系统:Windows 8.1 x64、Windows 7 x64
  • 显卡:AMD 4200 HD、Intel HD 3000
  • Java:1.8.0_45 JDK/JRE x86(32 位),1.8.0_60ea x64

  • 具有 3 个子场景的舞台 - 默认、点、环境

    3Lights

    具有 4 个子场景的舞台 - 默认、点、环境、(点、环境)

    4Lights

    例子

    这是一个 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

    mac test



    我做错了,还是这是一个错误?有人可以确认相同的行为吗?

    更新

    我做了一个新的测试,我添加了两个新的灯光: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);

    4Lights-new

    似乎灯光将被合并并且只添加到一个场景中并从所有其他场景中删除。

    结论

    正如jewselsea在他的回答中解释的那样,这是 不是错误 !但从我的角度来看,他们应该在 Light Classes 中再次重复该声明或进行提示,因为这有点令人困惑。

    SubScene需要一个 Parent作为他的构造函数中的 root,所以你别无选择。

    最佳答案

    这不是一个错误。 PointLightNode .节点 javadoc 声明:“如果程序将子节点添加到父节点(包括组、区域等),并且该节点已经是不同父节点的子节点或场景的根节点,则该节点将自动(静默)删除来自它的前 parent 。”因此该应用程序似乎按预期运行。

    关于javafx - 无法将 JavaFX 灯光添加到多个子场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31175585/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com