开发手册 欢迎您!
软件开发者资料库

JavaFX - 3D形状

JavaFX 3D形状 - 从简单和简单的步骤学习JavaFX,从基本到高级概念,包括概述,环境,架构,应用程序,2D形状,文本,效果,转换,动画,颜色,图像,3D形状,事件处理,UI控件,图表,布局窗格,CSS。

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

3D形状

一般来说,3D形状是可以在XYZ平面上绘制的几何图形.这些包括 Cylinder,Sphere Box .

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

创建3D形状

要创建三维形状,您需要 :

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

  • 设置3D形状的属性.

  • 将3D形状对象添加到小组.

实例化各个类

要创建三维形状,请先您需要实例化其各自的类.例如,如果要创建3D框,则需要实例化名为Box的类,如下所示;

 Box box = new Box ();

设置形状的属性

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

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

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

将形状对象添加到组

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

//Creating a Group object  Group root = new Group(box);

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

S.No形状和放大器;描述
1Box

长方体是三维形状,长度 (深度),宽度高度.

在JavaFX中,三维框由名为

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

这个类有3个double数据类型的属性,即 :

  • width : 盒子的宽度.

  • 身高 : 盒子的高度.

  • 深度 : 盒子的深度.

2Cylinder

圆柱体是一个封闭的实体,有两个平行的(大部分是圆形的)基座,由曲面连接.

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

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

通过实例化此类,您可以在JavaFX中创建柱面节点.此类具有double数据类型的2个属性,即 :

  • height : 圆柱的高度.

  • 半径 : 圆柱的半径.

3Sphere

球体定义为距离3D空间中给定点的距离r相同的点集.此距离r是球体的半径,给定点是球体的中心.

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

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

此类具有double数据类型的名为 radius 的属性.它代表球体的半径.

3D物体的属性

对于所有3维对象,您可以设置各种属性,如剔脸,绘图模式,材质.

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

剔除面

通常,剔除是去除形状中不正确定向的部分(在视图区域中不可见)./p>

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

box.setCullFace(CullFace.NONE);

形状的笔划类型可以是 :

  • : 没有进行剔除(CullFace.NONE).

  • 前面 : 所有正面饰面都被剔除. (CullFace.FRONT).

  • 返回 : 所有背面多边形都被剔除. (StrokeType.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) {       //Drawing Sphere1       Sphere sphere1 = new Sphere();            //Setting the radius of the Sphere       sphere1.setRadius(50.0);               //Setting the position of the sphere       sphere1.setTranslateX(100);       sphere1.setTranslateY(150);             //setting the cull face of the sphere to front       sphere1.setCullFace(CullFace.FRONT);              //Drawing Sphere2       Sphere sphere2 = new Sphere();             //Setting the radius of the Sphere       sphere2.setRadius(50.0);               //Setting the position of the sphere       sphere2.setTranslateX(300);        sphere2.setTranslateY(150);             //Setting the cull face of the sphere to back       sphere2.setCullFace(CullFace.BACK);                    //Drawing Sphere3       Sphere sphere3 = new Sphere();             //Setting the radius of the Sphere       sphere3.setRadius(50.0);               //Setting the position of the sphere       sphere3.setTranslateX(500);       sphere3.setTranslateY(150);             //Setting the cull face of the sphere to none       sphere2.setCullFace(CullFace.NONE);                       //Creating a Group object        Group root = new Group(sphere1, sphere2, sphere3);                //Creating a scene object       Scene scene = new Scene(root, 600, 300);              //Setting title to the Stage      stage.setTitle("Drawing a Sphere");                //Adding scene to the stage       stage.setScene(scene);                //Displaying the contents of the stage       stage.show();    }    public static void main(String args[]){       launch(args);    } }

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

 javac SphereCullFace.java  java SphereCullFace

执行时,上述程序生成一个JavaFX窗口,分别显示三个具有剔除面值 FRONT,BACK NONE 的球体,如下所示;

Cull Faces

绘图模式

属性属于 DrawMode 并且它表示用于绘制当前3D形状的绘图模式.您可以选择绘制模式使用方法setDrawMode()绘制3D形状,如下所示 :

 box.setDrawMode(DrawMode.FILL) ;

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

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

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

默认情况下,3Dimensional形状的绘制模式为fill.

示例

以下程序演示了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) {       //Drawing a Box       Box box1 = new Box();             //Setting the properties of the Box       box1.setWidth(100.0);       box1.setHeight(100.0);         box1.setDepth(100.0);             //Setting the position of the box       box1.setTranslateX(200);       box1.setTranslateY(150);       box1.setTranslateZ(0);            //Setting the drawing mode of the box       box1.setDrawMode(DrawMode.LINE);              //Drawing a Box       Box box2 = new Box();             //Setting the properties of the Box       box2.setWidth(100.0);       box2.setHeight(100.0);         box2.setDepth(100.0);             //Setting the position of the box       box2.setTranslateX(450); //450       box2.setTranslateY(150);//150       box2.setTranslateZ(300);         //Setting the drawing mode of the box       box2.setDrawMode(DrawMode.FILL);                    //Creating a Group object         Group root = new Group(box1, box2);                //Creating a scene object       Scene scene = new Scene(root, 600, 300);              //Setting camera       PerspectiveCamera camera = new PerspectiveCamera(false);       camera.setTranslateX(0);       camera.setTranslateY(0);       camera.setTranslateZ(0);       scene.setCamera(camera);              //Setting title to the Stage       stage.setTitle("Drawing a Box");                //Adding scene to the stage       stage.setScene(scene);            //Displaying the contents of the stage       stage.show();    }         public static void main(String args[]){       launch(args);    } }

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

 javac BoxDrawMode.java  java BoxDrawMode

执行时,上述程序生成一个JavaFX窗口,分别显示两个带有绘图模式值LINE和FILL的框,如下所示;

绘图模式

材料

剔除Face属性属于材质,它用于选择材质的表面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) {       //Drawing Cylinder1       Cylinder cylinder1 = new Cylinder();                  //Setting the properties of the Cylinder       cylinder1.setHeight(130.0f);       cylinder1.setRadius(30.0f);              //Setting the position of the Cylinder       cylinder1.setTranslateX(100);       cylinder1.setTranslateY(75);               //Preparing the phong material of type bump map        PhongMaterial material1 = new PhongMaterial();        material1.setBumpMap(new Image         ("http://www.IT屋.com/images/tplogo.gif"));               //Setting the bump map material to Cylinder1       cylinder1.setMaterial(material1);                 //Drawing Cylinder2       Cylinder cylinder2 = new Cylinder();                     //Setting the properties of the Cylinder       cylinder2.setHeight(130.0f);       cylinder2.setRadius(30.0f);               //Setting the position of the Cylinder       cylinder2.setTranslateX(200);       cylinder2.setTranslateY(75);              //Preparing the phong material of type diffuse map       PhongMaterial material2 = new PhongMaterial();      material2.setDiffuseMap(new Image         ("http://www.IT屋.com/images/tp-logo.gif"));             //Setting the diffuse map material to Cylinder2       cylinder2.setMaterial(material2);                      //Drawing Cylinder3       Cylinder cylinder3 = new Cylinder();                     //Setting the properties of the Cylinder       cylinder3.setHeight(130.0f);       cylinder3.setRadius(30.0f);           //Setting the position of the Cylinder       cylinder3.setTranslateX(300);       cylinder3.setTranslateY(75);              //Preparing the phong material of type Self Illumination Map       PhongMaterial material3 = new PhongMaterial();        material3.setSelfIlluminationMap(new Image         ("http://www.IT屋.com/images/tp-logo.gif"));              //Setting the Self Illumination Map material to Cylinder3       cylinder3.setMaterial(material3);               //Drawing Cylinder4       Cylinder cylinder4 = new Cylinder();                     //Setting the properties of the Cylinder       cylinder4.setHeight(130.0f);       cylinder4.setRadius(30.0f);               //Setting the position of the Cylinder       cylinder4.setTranslateX(400);       cylinder4.setTranslateY(75);              //Preparing the phong material of type Specular Map        PhongMaterial material4 = new PhongMaterial();        material4.setSpecularMap(new Image         ("http://www.IT屋.com/images/tp-logo.gif"));             //Setting the Specular Map material to Cylinder4       cylinder4.setMaterial(material4);               //Drawing Cylinder5       Cylinder cylinder5 = new Cylinder();                     //Setting the properties of the Cylinder       cylinder5.setHeight(130.0f);       cylinder5.setRadius(30.0f);               //Setting the position of the Cylinder       cylinder5.setTranslateX(100);       cylinder5.setTranslateY(300);              //Preparing the phong material of type diffuse color       PhongMaterial material5 = new PhongMaterial();        material5.setDiffuseColor(Color.BLANCHEDALMOND);             //Setting the diffuse color material to Cylinder5       cylinder5.setMaterial(material5);                //Drawing Cylinder6        Cylinder cylinder6 = new Cylinder();                     //Setting the properties of the Cylinder       cylinder6.setHeight(130.0f);       cylinder6.setRadius(30.0f);               //Setting the position of the Cylinder       cylinder6.setTranslateX(200);       cylinder6.setTranslateY(300);              //Preparing the phong material of type specular color       PhongMaterial material6 = new PhongMaterial();              //setting the specular color map to the material       material6.setSpecularColor(Color.BLANCHEDALMOND);             //Setting the specular color material to Cylinder6       cylinder6.setMaterial(material6);                 //Drawing Cylinder7       Cylinder cylinder7 = new Cylinder();            //Setting the properties of the Cylinder       cylinder7.setHeight(130.0f);       cylinder7.setRadius(30.0f);               //Setting the position of the Cylinder       cylinder7.setTranslateX(300);       cylinder7.setTranslateY(300);              //Preparing the phong material of type Specular Power       PhongMaterial material7 = new PhongMaterial();        material7.setSpecularPower(0.1);             //Setting the Specular Power material to the Cylinder       cylinder7.setMaterial(material7);                     //Creating a Group object        Group root = new Group(cylinder1 ,cylinder2, cylinder3,       cylinder4, cylinder5, cylinder6, cylinder7);                 //Creating a scene object       Scene scene = new Scene(root, 600, 400);              //Setting camera       PerspectiveCamera camera = new PerspectiveCamera(false);       camera.setTranslateX(0);       camera.setTranslateY(0);       camera.setTranslateZ(-10);       scene.setCamera(camera);              //Setting title to the Stage       stage.setTitle("Drawing a cylinder");                //Adding scene to the stage       stage.setScene(scene);                //Displaying the contents of the stage       stage.show();    }         public static void main(String args[]){       launch(args);    } }

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

 Javac CylinderMaterials.java  java CylinderMaterials

执行时,上述程序生成一个JavaFX窗口,分别显示7个圆柱体,包括材质,凹凸贴图,漫反射贴图,自发光贴图,高光贴图,漫反射颜色,镜面反射颜色,(BLANCHEDALMOND)镜面反射功率,如下面的截图 :

Cylinder Material