本文概述
JavaFX允许我们设置3D对象的各种属性。 JavaFX中为每个属性定义了特殊的类。在本教程的这一部分中, 我们将讨论可以应用于3D对象以获得更好外观的属性类型。
阴暗面
剔除可以简单地定义为删除3D对象在视图区域中不可见的部分的过程。在JavaFX中, 3D形状包含CullFace类型的属性。通过使用以下在3D形状类对象上调用的实例方法, 可以将此属性设置为适当的值。 。
setCullFace(CullFace值)
在CullFace类中定义了三种笔触类型:
- 无:不执行剔除
- 前:所有面向前的多边形都会被剔除
- 背面:所有背面多边形都会被剔除
例
在下面的示例中, 我们创建了三个球体, 并为每个球体设置了三个剔除面。
package application;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.SubScene;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;
public class SphereTest extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
//Creating the first sphere
Sphere sphere = new Sphere();
sphere.setRadius(50);
sphere.setTranslateX(100);
sphere.setTranslateY(200);
//Setting cullface for the sphere 1
sphere.setCullFace(CullFace.BACK);
//creating second sphere
Sphere sphere1 = new Sphere();
sphere1.setRadius(50);
sphere1.setTranslateX(250);
sphere1.setTranslateY(200);
//setting CullFace for the sphere 2
sphere1.setCullFace(CullFace.FRONT);
//creating third sphere
Sphere sphere2 = new Sphere();
sphere2.setRadius(50);
sphere2.setTranslateX(400);
sphere2.setTranslateY(200);
//setting CullFace for the sphere 3
sphere2.setCullFace(CullFace.NONE);
//Configuring Group and Scene
Group root = new Group();
root.getChildren().addAll(sphere, sphere1, sphere2);
Scene scene = new Scene(root, 500, 400);
primaryStage.setScene(scene);
primaryStage.setTitle("CullFaces");
primaryStage.show();
}
publicstaticvoid main(String[] args) {
launch(args);
}
}
3D对象材质
JavaFX提供了可以应用于3D形状表面的各种材料。包javafx.scene.paint的Material类提供了用于处理3D形状的材料的所有类。 PhongMaterial类是Material类的子类。我们只需要实例化此类即可创建所需的材料。
此类提供了各种类型的材料作为此类的属性, 可以使用setter方法将其设置为特定值。但是, 可以使用以下方法将材料应用于形状。
shape.setMaterial(<material-type>)
物产
下表描述了类javafx.scene.paint.PhongMaterial的属性及其设置方法。
属性 | 描述 | 设置方法 |
---|---|---|
bumpMap | 此属性的类型为Image。这表示材料的凹凸贴图。 | setBumpMap(Image URL) |
diffuseColor | 这是一种颜色类型属性。这代表了材料的漫反射颜色。 | setDiffuseColor(Color color) |
diffuseMap | 这是图像类型属性。这表示材质的DiffuseMap。 | setDiffuseMap(Image URL) |
selfIlluminationMap | 这是图像类型属性。这代表了材料的自发光图 | setSelfIlluminationMap(Image URL) |
specularColor | 这是一种颜色类型属性。这代表了材料的镜面颜色。 | setSpecularColor(Color value) |
specularPower | 这是一个双精度类型的属性。这代表了材质的镜面反射能力。 | setSpecularPower(Double value) |
例
package application;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Cylinder;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;
public class MaterialExample extends Application{
@Override
publicvoid start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
//Creating Cylinder 1
Cylinder cyn = new Cylinder();
cyn.setRadius(70);
cyn.setHeight(200);
cyn.setTranslateX(180);
cyn.setTranslateY(150);
//Creating cylinder 2
Cylinder cyn1=new Cylinder();
cyn1.setRadius(70);
cyn1.setHeight(200);
cyn1.setTranslateX(380);
cyn1.setTranslateY(150);
//Creating cylinder 3
Cylinder cyn2=new Cylinder();
cyn2.setRadius(70);
cyn2.setHeight(200);
cyn2.setTranslateX(580);
cyn2.setTranslateY(150);
//Creating Sphere
Sphere s=new Sphere();
s.setRadius(70);
s.setTranslateX(780);
s.setTranslateY(150);
//Setting Material 1
Image img1 = new Image("https://www.srcmini02.com/kotlin/images/kotlin- tutorial.png");
PhongMaterial mat = new PhongMaterial();
mat.setDiffuseMap(img1);
mat.setDiffuseColor(Color.WHITE);
//Setting Material 2
PhongMaterial mat2 = new PhongMaterial();
mat2.setSelfIlluminationMap(img1);
//Setting Material 3
PhongMaterial mat3 = new PhongMaterial();
mat3.setSpecularMap(img1);
//Setting Material for sphere
PhongMaterial mat4 = new PhongMaterial();
mat4.setDiffuseColor(Color.BLUE);
// Applying Material to mat4.setBumpMap(img1);the shape
cyn.setMaterial(mat);
cyn1.setMaterial(mat2);
cyn2.setMaterial(mat3);
s.setMaterial(mat4);
//Setting Camera mat4.setBumpMap(img1);
PerspectiveCamera camera = new PerspectiveCamera();
camera.setTranslateX(20);
camera.setTranslateY(10);
camera.setTranslateZ(50);
//setting group and stage
Group root = new Group();
root.getChildren().addAll(cyn, cyn1, cyn2, s);
Scene scene = new Scene(root, 900, 300, Color.WHITE);
scene.setCamera(camera);
primaryStage.setScene(scene);
primaryStage.setTitle("Material Example");
primaryStage.show();
}
publicstaticvoid main(String[] args) {
launch(args);
}
}
绘图模式
JavaFX提供了各种绘制模式来绘制3D形状。此属性的类型为DrawMode。该类中定义了以下DrawMode类型。
- 填充:此模式绘制并填充3D形状。它由DrawMode.Fill表示
- 线条:此模式仅使用线条绘制3D形状。它由DrawMode.Line表示
使用以下setter方法为3D形状设置绘制模式。
Shape3D.setDrawMode(<DrawMode value>)
例
在下面的示例中, 我们创建了两个框, 一个是使用DrawMode Fill, 另一个是使用DrawMode Line。
package application;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.stage.Stage;
public class DrawModeExample extends Application{
@Override
publicvoid start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
//Creating Boxes
Box box1 = new Box();
Box box2 = new Box();
//Setting properties for second box
box2.setTranslateX(450);
box2.setTranslateY(300);
box2.setTranslateZ(100);
box2.setHeight(150);
box2.setWidth(50);
box2.setDepth(400);
//Setting properties for first box
box1.setHeight(100);
box1.setWidth(100);
box1.setDepth(400);
box1.setTranslateX(200);
box1.setTranslateY(200);
box1.setTranslateZ(200);
//Setting DrawModes for the boxes
box1.setDrawMode(DrawMode.FILL);
box2.setDrawMode(DrawMode.LINE);
//Setting the perspective camera
PerspectiveCamera camera = new PerspectiveCamera();
camera.setTranslateX(100);
camera.setTranslateY(100);
camera.setTranslateZ(50);
//Configuring Group, Scene and Stage
Group root = new Group();
root.getChildren().addAll(box1, box2);
Scene scene = new Scene(root, 450, 350);
scene.setCamera(camera);
primaryStage.setScene(scene);
primaryStage.setTitle("Setting DrawMode");
primaryStage.show();
}
publicstaticvoid main(String[] args) {
launch(args);
}
}
JavaFX相机
在JavaFX中, 相机被视为可以在3D布局中移动并相应地更改“场景”视图的对象。类javafx.scene.Camera表示相机。但是, 它与2D空间不同, 在2D空间中, 我们不需要在屏幕上移动相机。
在JavaFX中, 相机坐标系的X坐标指向右侧, Y坐标指向下方, Z坐标指向远离查看者或进入屏幕的位置。
为了创建相机并将其添加到场景中, 我们必须使用以下代码行。
//创建javafx.scene.Camera的实例
Camera camera = new Camera();
//将相机沿正确的X方向设置为50
camera.setTranslateX(50);
camera.setTranslateX(50);
camera.setTranslateY(100);
//将相机设置为20进入屏幕
camera.setTranslateZ(20);
//将相机添加到场景中
scene.setCamera(camera);
JavaFX子场景
子场景节点可以定义为一个容器, 可以容纳场景中需要为其指定摄像机角度的某些节点。用于场景分离。如果需要为场景的一部分设置不同的摄像机, 则可以使用子场景节点。可以在以下情况之一中使用Subscene。
- 如果我们需要用于场景的UI控件的静态相机(覆盖)。
- 3D对象为Y向上, 而2D UI为Y向下。
- 背景底纹
使用以下语法实例化一个子场景。
SubScene <reference> = new SubScene(Parent root, double width, double height, boolean depthbuffer, boolean antiAliasing)
评论前必须登录!
注册