• JavaFX 简单3D演示样例


      从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);
    	}
    }
      PerspectiveCamera是透视投影的摄像机,基本是3D开发中的标配了。Box是JavaFX 3D中内置的3D物体,通过setMaterial来设置材质,通过setDrawMode来设置绘制方式,有填充和线框两种模式。

      我们也能够通过Camera.getTransforms()来获取全部Object的Transform然后进行Rotate,Translate等变换。

      SubScene是一个子场景,是一个特殊的独立场景。我们能够通过SubScene来通过不同的Camera来渲染场景中的某一部分。比如2D UI,3D场景,整个背景的分离显示,也是非经常见的使用方法。另外,SubScene中能够通过SceneAntialiasing来设置是否抗锯齿。

      在该演示样例中,我们另外通过线程对Camera中的transform进行translate变换,会循环移近移远。

      效果图:


      由于是动态变化的,大家能够自己执行看看效果。

      抗锯齿的效果也非常明显,能够自行改动。

      本文章为个人原创,版权全部,转载请注明出处:http://blog.csdn.net/ml3947。另外我的个人博客:http://www.wjfxgame.com. 

  • 相关阅读:
    Windows:生成环境Word,PPT,EXCEL com+组件配置
    Win10 计算机管理 打不开应急办法
    Js:弹窗剧中
    Asp.net跨域配置
    Centos6系列安装nginx
    Win_oracle_exp/expdp备份
    MSSQL:查看某个账号使用得数据库
    MSSQL:查看作业情况
    MSSQL:账号无法删除方案
    MSSQL:删除系统作业计划
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4237389.html
Copyright © 2020-2023  润新知