La mise à l'échelle de la boîte dans JavaFX 3D reflète mal la lumière


Mon but est de reproduire un gif dans JavaFX.

Tout est génial, sauf lorsque vous changez autant de hauteurs de boîte à la fois, cela ralentit la machine.

J'ai décidé de remédier à cela en mettant à l'échelle l'axe Y au lieu de modifier la hauteur afin qu'ils puissent être mis en cache. Maintenant, il fonctionne parfaitement lisse, mais l'éclairage est éteint. Lorsque les boîtes s'étirent, elles semblent s'assombrir.

Cela ne se produit que pendant la transformation de mise à l'échelle, comme on le voit ici et ici, et pas la changement de hauteur de.

J'ai essayé quelques choses: l'éclairage ambiant, la définition d'un nouveau PhongMaterial chaque image et l'ajout d'une couleur spéculaire, ainsi que la modification de sa puissance.

Code (case grise singulière)

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

}
Author: Michael Coppola, 2018-06-19