在JavaFX中使3D对象随时间不同地照亮

时间:2017-06-06 21:23:43

标签: javafx 3d light

需要在JavaFX中制作一个球体"闪烁"随着时间的推移,就像淡入淡出一样。可能吗?或者至少改变色调。我设法通过更改我正在使用的PhongMaterial的SelfIlluminationMap属性使其闪烁,使用此代码

import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.image.Image;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.transform.*;
import javafx.stage.Stage;
import javafx.util.Duration;

public class JavaFXApplication15 extends Application {

    Image im = new Image("bump.jpg");
    PhongMaterial ph = new PhongMaterial(Color.GREEN);
    int nums = 0;

    UpdateTimer timer;

    private class UpdateTimer extends AnimationTimer {

        int counter = 0;

        @Override
        public void handle(long now) {
            if (counter == 20) {
                update();
                counter = 0;
            }
            counter++;

        }
    }

    private Parent createContent() throws Exception {

        timer = new UpdateTimer();
        ph = new PhongMaterial(Color.YELLOW, null, null, null, im);

        Box box = new Box(5, 5, 5);
        box.setMaterial(ph);

        // Create and position camera
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll(
                new Rotate(-20, Rotate.X_AXIS),
                new Translate(0, 0, -50)
        );

        // Build the Scene Graph
        Group root = new Group();
        root.getChildren().add(camera);
        root.getChildren().add(box);

        // Use a SubScene
        SubScene subScene = new SubScene(
                root,
                300, 300,
                true,
                SceneAntialiasing.BALANCED
        );
        subScene.setFill(Color.ALICEBLUE);
        subScene.setCamera(camera);
        Group group = new Group();
        group.getChildren().add(subScene);

        return group;
    }

    void update() {

        if (ph.getSelfIlluminationMap() != null) {
            ph.setSelfIlluminationMap(null);
        } else {
            ph.setSelfIlluminationMap(im);
        }

    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setResizable(false);
        Scene scene = new Scene(createContent());
        stage.setScene(scene);
        stage.show();
        timer.start();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

但它可以让它淡入淡出吗?可能会有某种转变?

1 个答案:

答案 0 :(得分:2)

为了看到效果,我尝试为球体specularColor的{​​{1}}设置动画。从这个example开始,我按照显示here的方法获得了一个颜色查找表,其中包含给定色调的等间距亮度值。

PhongMaterial

private final Queue<Color> clut = new LinkedList<>(); 的实施只是在表格中循环。

handle()

如果结果具有吸引力,那么使用Transition的具体子类可能会产生更灵活的方法。

@Override
public void handle(long now) {
    redMaterial.setSpecularColor(clut.peek());
    clut.add(clut.remove());
}

image

private final Animation animation = new Transition() {

     {
         setCycleDuration(Duration.millis(1000));
         setAutoReverse(true);
         setCycleCount(INDEFINITE);
     }

     @Override
     protected void interpolate(double d) {
         redMaterial.setSpecularColor(Color.hsb(LITE.getHue(), 1, d));
         redMaterial.setDiffuseColor(Color.hsb(DARK.getHue(), 1, d / 2));
     }
 };