我的目标是在JavaFX
中重现gif。
一切都很棒,除了一次更改如此多的盒子高度时,它会降低机器的速度。
我已决定通过y轴缩放来解决此问题,而不是更改高度以便可以对其进行缓存。现在,它运行非常顺畅,但是照明已关闭。当盒子伸出时,它们似乎变得更暗。
这仅在缩放转换期间发生,如here和here所示,而不是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();
}