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 个双精度数据类型的属性,即 −
|
| 2 | 圆柱体
圆柱体是一个封闭的立体,有两个平行(大多为圆形)的底部,由一个曲面连接。 它由两个参数描述,即其圆形底部的半径和圆柱体的高度。 在 JavaFX 中,圆柱体由名为 Cylinder 的类表示。此类属于包 javafx.scene.shape。 通过实例化此类,您可以在 JavaFX 中创建一个圆柱体节点。此类具有 2 个双精度数据类型的属性,即 −
|
| 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、BACK 和 NONE,如下所示 −
绘制模式
该属性的类型为 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,如下所示 −
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)镜面反射强度,如以下屏幕截图所示 −

