JavaFX 3D中的框缩放不正确地反射光

时间:2018-06-19 15:23:46

标签: java javafx perspectivecamera javafx-3d phong

我的目标是在JavaFX中重现gif

一切都很棒,除了一次更改如此多的盒子高度时,它会降低机器的速度。

我已决定通过y轴缩放来解决此问题,而不是更改高度以便可以对其进行缓存。现在,它运行非常顺畅,但是照明已关闭。当盒子伸出时,它们似乎变得更暗。

这仅在缩放转换期间发生,如herehere所示,而不是height change

我已经尝试了一些方法:环境照明,每帧设置新的PhongMaterial并添加镜面颜色以及更改其功率。

代码(单个灰色框)

public void start(Stage primaryStage) throws Exception{
    Group root= new Group();
    Scene scene = new Scene(root,400,400,true, SceneAntialiasing.BALANCED);
    PerspectiveCamera camera = new PerspectiveCamera(true);
    scene.setCamera(camera);
    camera.setFarClip(1000);
    Group trans = new Group();
    root.getChildren().add(trans);

    Box box = new Box(10,10,10);
    box.setCache(true);
    box.setCacheHint(CacheHint.SCALE);


    PhongMaterial material = new PhongMaterial(Color.GRAY);
    box.setMaterial(material);
    trans.getChildren().add(box);
    Scale scale = new Scale();
    box.getTransforms().add(scale);

    PointLight light = new PointLight(Color.WHITE);
    light.setTranslateZ(50);
    light.setTranslateX(-50);
    root.getChildren().add(light);
    light.setTranslateY(-25);



    new AnimationTimer(){
        @Override
        public void handle(long now) {
            scale.setY(Math.sin(angle)+2);
            angle += .05;
            //the line of code that works with the lighting, but doesn't support caching.
            //box.setHeight(40*Math.sin(angle)+50);
        }
    }.start();

    Rotate rotateX = new Rotate(0,Rotate.X_AXIS);
    Rotate rotateY = new Rotate(0,Rotate.Y_AXIS);

    trans.getTransforms().addAll(rotateX,rotateY);
    trans.setTranslateZ(200);
    rotateY.setAngle(45);
    rotateX.setAngle(35);

    primaryStage.setScene(scene);
    primaryStage.show();

}

0 个答案:

没有答案