从Java8开始,在JavaFX中便增加了3D部分的内容,包括Camera,Material,Light,Shape3D等基础内容。
当然,JavaFX 3D应该是OpenJFX里目前正在补充和完善的一个模块,很多地方还不尽如人意,所以该示例仅供参考。另外,OpenJFX目前已经有人通过RovoVM运行在Android和IOS的设备上了。不过,个人认为这个只是小打小闹,还远远不能进入实际运用当中。
下面是JavaFX 3D示例,我会逐一解释:
- import javafx.application.Application;
- import javafx.application.Platform;
- import javafx.scene.Group;
- import javafx.scene.Parent;
- import javafx.scene.PerspectiveCamera;
- import javafx.scene.Scene;
- import javafx.scene.SceneAntialiasing;
- import javafx.scene.SubScene;
- import javafx.scene.paint.Color;
- import javafx.scene.paint.PhongMaterial;
- import javafx.scene.shape.Box;
- import javafx.scene.shape.DrawMode;
- import javafx.scene.transform.Rotate;
- import javafx.scene.transform.Translate;
- import javafx.stage.Stage;
- public class Main extends Application {
- private Thread thread;
- private boolean isRunning = true;
- private PerspectiveCamera camera;
- private int speed = -1;
- private int count = 1;
- private int maxCount = 50;
- public Parent createContent() throws Exception {
- // Box
- Box testBox = new Box(5, 5, 5);
- testBox.setMaterial(new PhongMaterial(Color.BLUE));
- testBox.setDrawMode(DrawMode.FILL);
- // Create and position camera
- camera = new PerspectiveCamera(true);
- camera.getTransforms().addAll (
- new Rotate(-20, Rotate.Y_AXIS),
- new Rotate(-20, Rotate.X_AXIS),
- new Translate(0, 0, -20));
- // Build the Scene Graph
- Group root = new Group();
- root.getChildren().add(camera);
- root.getChildren().add(testBox);
- // Use a SubScene
- SubScene subScene = new SubScene(root, 310,310, true, SceneAntialiasing.BALANCED);
- subScene.setFill(Color.ALICEBLUE);
- subScene.setCamera(camera);
- Group group = new Group();
- group.getChildren().add(subScene);
- return group;
- }
- @Override
- public void start(Stage primaryStage) throws Exception {
- primaryStage.setResizable(false);
- Scene scene = new Scene(createContent(), 300, 300);
- thread = new Thread(new Runnable() {
- @Override
- public void run() {
- while(isRunning){
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- camera.getTransforms().addAll(
- new Translate(0, 0,speed));
- count++;
- if(count >= maxCount){
- speed = -speed;
- count = 0;
- }
- }
- });
- }
- }
- });
- thread.start();
- primaryStage.setScene(scene);
- primaryStage.show();
- }
- public static void main(String[] args) {
- launch(args);
- }
- }
我们也可以通过Camera.getTransforms()来获取所有Object的Transform然后进行Rotate,Translate等变换。
SubScene是一个子场景,是一个特殊的独立场景。我们可以通过SubScene来通过不同的Camera来渲染场景中的某一部分。例如2D UI,3D场景,整个背景的分离显示,也是很常见的用法。另外,SubScene中可以通过SceneAntialiasing来设置是否抗锯齿。
在该示例中,我们另外通过线程对Camera中的transform进行translate变换,会循环移近移远。
效果图:
因为是动态变化的,大家可以自己运行看看效果。
抗锯齿的效果也很明显,可以自行修改。