从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.
原文地址:http://blog.csdn.net/wingfourever/article/details/41208993