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)镜面反射强度,如以下屏幕截图所示 −