JavaFX 3D形状属性

JavaFX 允许我们设置 3D 对象的各种属性。JavaFX 中为每个属性定义了特殊的类。在本教程的这一部分中,我们将讨论可应用于 3D 对象以获得更好外观的属性类型。

1 面剔除

面剔除可以简单地定义为移除在视图区域中不可见的部分 3D 对象的过程。在 JavaFX 中,3D 形状包含类型CullFace的属性。可以使用以下实例方法将此属性设置为适当的值,该方法将在 3D 形状类对象上调用。

setCullFace(CullFace value)

在 CullFace 类中定义了三种类型的笔画,它们是:

  1. None:不执行剔除
  2. Front :所有正面的多边形都被剔除
  3. Back :所有背面的多边形都被剔除

2 面剔除的例子

在以下示例中,我们创建了三个球体并为每个球体设置了三个面剔除。

package com.yiidian;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
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 {
        //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();
    }  
    public static void main(String[] args) {
        launch(args);  
    }  
  
}  

输出结果为:

3 3D 物体材质

JavaFX 提供了可以应用于 3D 形状表面的不同种类的材料。包javafx.scene.paint 的Material类提供了处理 3D 形状材质的所有类。类PhongMaterial是类的子类材料。我们只需要实例化这个类来创建所需的材料。

该类提供了各种类型的材料作为该类的属性,可以使用 setter 方法将其设置为某个值。但是,可以使用以下方法将材料应用于形状。

shape.setMaterial(<material-type>)  

4 PhongMaterial类的属性

属性 描述 setter方法
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)

5 PhongMaterial类的例子

package com.yiidian;

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
    public void start(Stage primaryStage) throws Exception {

        //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("http://www.yiidian.com/statics/images/logo.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();
    }
    public static void main(String[] args) {
        launch(args);
    }
}  

输出结果为:

6 DrawMode绘图模式

JavaFX 提供了多种绘图模式来绘制 3D 形状。此属性属于DrawMode类型。类中定义了以下类型的 DrawMode。

  1. Fill :此模式绘制并填充 3D 形状。它由 DrawMode.Fill 表示
  2. Line :此模式仅使用 Lines 绘制 3D 形状。它由 DrawMode.Line 表示

使用以下 setter 方法设置 3D 形状的绘制模式。

Shape3D.setDrawMode(<DrawMode value>)  

7 DrawMode类的例子

在下面的示例中,我们创建了两个框,一个使用 DrawMode Fill,另一个使用 DrawMode Line。

package com.yiidian;

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  
    public void start(Stage primaryStage) throws Exception {  
        //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();  
     }  
     public static void main(String[] args) {  
         launch(args);  
     }  
}  

输出结果为:

8 JavaFX 相机

在 JavaFX 中,Camera 相机被视为可以在 3D 布局周围移动并相应地更改场景视图的对象。类javafx.scene.Camera表示相机。然而,它不同于我们不需要在屏幕周围移动相机的 2D 空间。

在 JavaFX 相机坐标系中,X 坐标指向右侧,Y 坐标指向下方,Z 坐标指向远离观察者或进入屏幕的方向。

为了创建相机并将其添加到场景中,我们必须使用以下代码行。

// 创建 javafx.scene.Camera 的实例

Camera  camera = new Camera();  

//将相机设置为右侧 X 方向的 50

camera.setTranslateX(50);  

//将相机设置为右侧 Y 方向的 100

camera.setTranslateY(100);

//将相机设置为20进入屏幕

camera.setTranslateZ(20);  

//将摄像机添加到场景中

scene.setCamera(camera);

9 JavaFX 子场景

子场景节点可以定义为一个容器,它可以容纳需要指定摄像机角度的场景的某个节点。它用于场景分离。如果我们需要为场景的一部分设置不同的相机,我们可以使用子场景节点。子场景可用于以下情况之一。

  1. 如果我们在场景中使用的 UI 控件需要静态相机(覆盖)。
  2. Y-up 表示 3D 对象,Y-down 表示 2D UI。
  3. 背景垫

使用以下语法来实例化子场景。

SubScene <reference> = new SubScene(Parent root, double width, double height, boolean depthbuffer, boolean antiAliasing)

 

热门文章

优秀文章