JavaFX - 3D 形状

在前面的章节中,我们已经了解了如何在 XY 平面上绘制 2D 形状。除了这些 2D 形状之外,我们还可以使用 JavaFX 绘制其他几个 3D 形状。

3D 形状

一般来说,3D 形状是可以在 XYZ 平面上绘制的几何图形。这些包括 圆柱体、球体盒子

上述每个 3D 形状都由一个类表示,所有这些类都属于 javafx.scene.shape 包。名为 Shape3D 的类是 JavaFX 中所有 3 维形状的基类。

创建 3D 形状

要创建 3 维形状,您需要 −

  • 实例化所需 3D 形状的相应类。

  • 设置 3D 形状的属性。

  • 将 3D 形状对象添加到组中。

实例化相应类

要创建 3 维形状,首先您需要实例化其相应类。例如,如果您想创建一个 3D 框,您需要按如下方式实例化名为 Box 的类 −

Box box = new Box();

设置形状的属性

实例化类后,您需要使用 setter 方法设置形状的属性。

例如,要绘制 3D 框,您需要传递其宽度、高度、深度。您可以使用它们各自的 setter 方法指定这些值,如下所示 −

//设置框的属性
box.setWidth(200.0);
box.setHeight(400.0);
box.setDepth(200.0);

将形状对象添加到组中

最后,您需要通过将形状对象作为构造函数的参数传递来将其添加到组中,如下所示。

//创建组对象
Group root = new Group(box);

下表列出了 JavaFX 提供的各种 3D 形状。

S.No 形状和描述
1 盒子

长方体是一种三维形状,具有长度(深度)、宽度高度

在 JavaFX 中,三维盒子由名为 Box 的类表示。此类属于包 javafx.scene.shape

通过实例化此类,您可以在 JavaFX 中创建一个 Box 节点。

此类具有 3 个双精度数据类型的属性,即 −

  • width −盒子的宽度。

  • height − 盒子的高度。

  • depth − 盒子的深度。

2 圆柱体

圆柱体是一个封闭的立体,有两个平行(大多为圆形)的底部,由一个曲面连接。

它由两个参数描述,即其圆形底部的半径和圆柱体的高度

在 JavaFX 中,圆柱体由名为 Cylinder 的类表示。此类属于包 javafx.scene.shape

通过实例化此类,您可以在 JavaFX 中创建一个圆柱体节点。此类具有 2 个双精度数据类型的属性,即 −

  • height − 圆柱体的高度。

  • radius − 圆柱体的半径。

3 球体

球体定义为与 3D 空间中给定点距离均为 r 的点集。这个距离 r 是球体的半径,给定的点是球体的中心。

在 JavaFX 中,球体由名为 Sphere 的类表示。此类属于 javafx.scene.shape 包。

通过实例化此类,您可以在 JavaFX 中创建一个球体节点。

此类具有一个名为 radius 的双精度数据类型属性。它表示球体的半径。

3D 对象的属性

对于所有 3 维对象,您可以设置各种属性,如 Cull Face、绘制模式、材质。

以下部分讨论 3D 对象的属性。

Cull Face

一般而言,剔除是指移除形状中方向不正确的部分(在视​​图区域中不可见)。

Cull Face 属性的类型为 CullFace,它表示 3D 形状的 Cull Face。您可以使用方法 setCullFace() 设置形状的 Cull Face,如下所示 −

box.setCullFace(CullFace.NONE);

形状的描边类型可以是 −

  • None − 不执行任何剔除 (CullFace.NONE)。

  • Front − 所有正面的多边形都被剔除。 (CullFace.FRONT)。

  • Back − 所有背面的多边形都被剔除。 (StrokeType.BACK)。

默认情况下,三维形状的剔除面为 Back。

示例

以下程序是一个示例,演示了球体的各种剔除面。将此代码保存在名为 SphereCullFace.java 的文件中。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.shape.CullFace; 
import javafx.stage.Stage; 
import javafx.scene.shape.Sphere; 
         
public class SphereCullFace extends Application { 
   @Override 
    public void start(Stage stage) {
    //绘制球体1
    球体 sphere1 = new Sphere();
    
    //设置球体的半径
    sphere1.setRadius(50.0);
    
    //设置球体的位置
    sphere1.setTranslateX(100);
    sphere1.setTranslateY(150);
    
    //将球体的剔除面设置为正面
    sphere1.setCullFace(CullFace.FRONT);
    
    //绘制球体2
    球体 sphere2 = new Sphere();
    
    //设置球体的半径
    sphere2.setRadius(50.0);
    
    //设置球体的位置
    sphere2.setTranslateX(300);
    sphere2.setTranslateY(150);
    
    //将球体的剔除面设置为背面
    sphere2.setCullFace(CullFace.BACK);
    
    //绘制Sphere3
    Sphere sphere3 = new Sphere();
    
    //设置球体的半径
    sphere3.setRadius(50.0);
    
    //设置球体的位置
    sphere3.setTranslateX(500);
    sphere3.setTranslateY(150);
    
    //将球体的剔除面设置为无
    sphere2.setCullFace(CullFace.NONE);
    
    //创建Group对象
    Group root = new Group(sphere1, sphere2, sphere3);
    
    //创建Scene对象
    Scene scene = new Scene(root, 600, 300);
    
    //设置舞台(Stage)标题
    stage.setTitle("绘制球体");
    
    //将场景添加到舞台(Stage)
    stage.setScene(scene);
    
    //显示舞台(Stage)内容
    stage.show();
    }
   public static void main(String args[]){ 
      launch(args); 
   } 
}

使用以下命令从命令提示符编译并执行保存的 java 文件。

javac SphereCullFace.java 
java SphereCullFace 

执行时,上述程序会生成一个 JavaFX 窗口,其中显示三个球体,其剔除面值分别为 FRONT、BACKNONE,如下所示 −

Cull Faces

绘制模式

该属性的类型为 DrawMode,表示用于绘制当前 3D 形状的绘制模式。您可以使用方法 setDrawMode () 选择绘制模式来绘制 3D 形状,如下所示 −

box.setDrawMode(DrawMode.FILL);

在 JavaFX 中,您可以选择两种绘制模式来绘制 3D 形状,即 −

  • 填充 − 此模式绘制并填充 2D 形状 (DrawMode.FILL)。

  • 线条 − 此模式使用线条 (DrawMode.LINE) 绘制 3D 形状。

默认情况下,3D 形状的绘制模式为填充。

示例

以下程序是一个示例,演示了 3D 框的各种绘制模式。将此代码保存在名为 BoxDrawMode.java 的文件中。

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 BoxDrawMode extends Application { 
   @Override 
    public void start(Stage stage) {
    //绘制一个盒子
    Box box1 = new Box();
    
    //设置盒子的属性
    box1.setWidth(100.0);
    box1.setHeight(100.0);
    box1.setDepth(100.0);
    
    //设置盒子的位置
    box1.setTranslateX(200);
    box1.setTranslateY(150);
    box1.setTranslateZ(0);
    
    //设置盒子的绘制模式
    box1.setDrawMode(DrawMode.LINE);
    
    //绘制一个盒子
    Box box2 = new Box();
    
    //设置盒子的属性
    box2.setWidth(100.0);
    box2.setHeight(100.0);
    box2.setDepth(100.0);
    
    //设置盒子的位置
    box2.setTranslateX(450); //450
    box2.setTranslateY(150);//150
    box2.setTranslateZ(300);
    
    //设置盒子的绘制模式
    box2.setDrawMode(DrawMode.FILL);
    
    //创建一个 Group 对象
    Group root = new Group(box1, box2);
    
    //创建一个场景对象
    Scene scene = new Scene(root, 600, 300);
    
    //设置相机
    PerspectiveCamera camera = new PerspectiveCamera(false);
    camera.setTranslateX(0);
    camera.setTranslateY(0);
    camera.setTranslateZ(0);
    scene.setCamera(camera);
    
    //设置舞台(Stage)标题
    stage.setTitle("绘制盒子");
    
    //将场景添加到舞台(Stage)
    stage.setScene(scene);
    
    //显示舞台(Stage)内容
    stage.show();
    }     
   public static void main(String args[]){ 
      launch(args); 
   } 
}

使用以下命令从命令提示符编译并执行保存的 java 文件。

javac BoxDrawMode.java 
java BoxDrawMode 

执行时,上述程序会生成一个 JavaFX 窗口,其中显示两个框,绘制模式分别为 LINE 和 FILL,如下所示 −

Drawing Modes

Material

cull Face 属性属于 Material 类型,用于选择 3D 形状材质的表面。您可以使用方法 setCullFace() 设置 3D 形状的材质,如下所示 −

cylinder.setMaterial(material);

如上所述,对于此方法,您需要传递一个 Material 类型的对象。包 javafx.scene.paint 中的 PhongMaterial 类是此类的子类,提供 7 个表示 Phong 着色材质的属性。您可以使用这些属性的 setter 方法将所有这些类型的材质应用于 3D 形状的表面。

以下是 JavaFX 中可用的材质类型 −

  • bumpMap − 这表示以 RGB 图像形式存储的法线贴图。

  • diffuseMap − 这表示漫反射贴图。

  • selfIlluminationMap − 这表示此 PhongMaterial 的自发光贴图。

  • specularMap −这表示此 PhongMaterial 的镜面反射贴图。

  • diffuseColor − 这表示此 PhongMaterial 的漫反射颜色。

  • specularColor − 这表示此 PhongMaterial 的镜面反射颜色。

  • specularPower − 这表示此 PhongMaterial 的镜面反射功率。

默认情况下,三维形状的材质是漫反射颜色为浅灰色的 PhongMaterial。

示例

以下是在圆柱体上显示各种材质的示例。将此代码保存在名为 CylinderMaterials.java 的文件中。

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.stage.Stage;

public class CylinderMaterials extends Application {  
   @Override 
    public void start(Stage stage) {
    //绘制圆柱体 1
    Cylinder cylinder1 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder1.setHeight(130.0f);
    cylinder1.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder1.setTranslateX(100);
    cylinder1.setTranslateY(75);
    
    //准备凹凸贴图类型的 phong 材质
    PhongMaterialmaterial1 = new PhongMaterial();
    material1.setBumpMap(new Image
    ("http://www.tutorialspoint.com/images/tplogo.gif"));
    
    //将凹凸贴图材质设置为圆柱体
    cylinder1.setMaterial(material1);
    
    //绘制圆柱体 2
    Cylinder cylinder2 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder2.setHeight(130.0f);
    cylinder2.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder2.setTranslateX(200);
    cylinder2.setTranslateY(75);
    
    //准备漫反射贴图类型的 phong 材质
    PhongMaterialmaterial2 = new PhongMaterial();
    material2.setDiffuseMap(new Image
    ("http://www.tutorialspoint.com/images/tp-logo.gif"));
    
    //将漫反射贴图材质设置为圆柱体2
    cylinder2.setMaterial(material2);
    
    //绘制圆柱体3
    圆柱体 cylinder3 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder3.setHeight(130.0f);
    cylinder3.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder3.setTranslateX(300);
    cylinder3.setTranslateY(75);
    
    //准备自发光贴图类型的 phong 材质
    PhongMaterialmaterial3 = new PhongMaterial();
    material3.setSelfIlluminationMap(new Image
    ("http://www.tutorialspoint.com/images/tp-logo.gif"));
    
    //将自发光贴图材质设置为圆柱体3
    cylinder3.setMaterial(material3);
    
    //绘制圆柱体4
    圆柱体 cylinder4 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder4.setHeight(130.0f);
    cylinder4.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder4.setTranslateX(400);
    cylinder4.setTranslateY(75);
    
    //准备镜面贴图类型的 phong 材质
    PhongMaterialmaterial4 = new PhongMaterial();
    material4.setSpecularMap(new Image
    ("http://www.tutorialspoint.com/images/tp-logo.gif"));
    
    //将镜面贴图材质设置为圆柱体
    cylinder4.setMaterial(material4);
    
    //绘制圆柱体 5
    cylinder cylinder5 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder5.setHeight(130.0f);
    cylinder5.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder5.setTranslateX(100);
    cylinder5.setTranslateY(300);
    
    //准备漫反射颜色类型的 phong 材质
    PhongMaterialmaterial5 = new PhongMaterial();
    material5.setDiffuseColor(Color.BLANCHEDALMOND);
    
    //将漫反射颜色材质设置为 Cylinder5
    cylinder5.setMaterial(material5);
    
    //绘制 Cylinder6
    Cylinder cylinder6 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder6.setHeight(130.0f);
    cylinder6.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder6.setTranslateX(200);
    cylinder6.setTranslateY(300);
    
    //准备镜面反射颜色类型的 phong 材质
    PhongMaterialmaterial6 = new PhongMaterial();
    
    //将镜面反射颜色图设置为材质
    material6.setSpecularColor(Color.BLANCHEDALMOND);
    
    //将镜面反射颜色材质设置为圆柱体6
    cylinder6.setMaterial(material6);
    
    //绘制圆柱体7
    cylinder cylinder7 = new Cylinder();
    
    //设置圆柱体的属性
    cylinder7.setHeight(130.0f);
    cylinder7.setRadius(30.0f);
    
    //设置圆柱体的位置
    cylinder7.setTranslateX(300);
    cylinder7.setTranslateY(300);
    
    //准备镜面反射强度类型的 phong 材质
    PhongMaterialmaterial7 = new PhongMaterial();
    material7.setSpecularPower(0.1);
    
    //将镜面反射强度材质设置为圆柱体
    cylinder7.setMaterial(material7);
    
    //创建一个 Group 对象
    Group root = new Group(cylinder1 ,cylinder2, cylinder3,
    cylinder4, cylinder5, cylinder6, cylinder7);
    
    //创建一个场景对象
    Scene scene = new Scene(root, 600, 400);
    
    //设置相机
    PerspectiveCamera camera = new Persp     
   public static void main(String args[]){ 
      launch(args); 
   } 
}

使用以下命令从命令提示符编译并执行保存的 java 文件。

Javac CylinderMaterials.java 
java CylinderMaterials 

执行时,上述程序会生成一个 JavaFX 窗口,其中显示 7 个圆柱体,分别具有材质、凹凸贴图、漫反射贴图、自发光贴图、镜面反射贴图、漫反射颜色、镜面反射颜色、(BLANCHEDALMOND)镜面反射强度,如以下屏幕截图所示 −

圆柱体材质