📜  JavaFX-3D形状

📅  最后修改于: 2020-11-14 07:14:40             🧑  作者: Mango


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

3D形状

通常,3D形状是可以在XYZ平面上绘制的几何图形。其中包括圆柱体,球体盒子

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

创建3D形状

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

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

  • 设置3D形状的属性。

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

实例化相应的类

要创建三维形状,首先需要实例化其相应的类。例如,如果要创建3D框,则需要实例化名为Box的类,如下所示:

Box box = new Box();

设置形状的属性

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

例如,要绘制3D框,您需要传递其Width,Height,Depth。您可以使用它们各自的设置方法来指定这些值,如下所示:

//Setting the properties of the 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 Shape & Description
1 Box

A cuboid is a three-dimensional shape with a length (depth), width, and a height.

In JavaFX a three-dimensional box is represented by a class named Box. This class belongs to the package javafx.scene.shape.

By instantiating this class, you can create a Box node in JavaFX.

This class has 3 properties of the double datatype namely −

  • width − The width of the box.

  • height − The height of the box.

  • depth − The depth of the box.

2 Cylinder

A cylinder is a closed solid that has two parallel (mostly circular) bases connected by a curved surface.

It is described by two parameters, namely, the radius of its circular base and the height of the cylinder.

In JavaFX, a cylinder is represented by a class named Cylinder. This class belongs to the package javafx.scene.shape.

By instantiating this class, you can create a cylinder node in JavaFX. This class has 2 properties of the double datatype namely −

  • height − The height of the Cylinder.

  • radius − The radius of the Cylinder.

3 Sphere

A sphere is defined as the set of points that are all at the same distance r from a given point in a 3D space. This distance r is the radius of the sphere and the given point is the centre of the sphere.

In JavaFX, a sphere is represented by a class named Sphere. This class belongs to the package javafx.scene.shape.

By instantiating this class, you can create a sphere node in JavaFX.

This class has a property named radius of double datatype. It represents the radius of a Sphere.

3D对象的属性

对于所有3维对象,您可以设置各种属性,例如“剔除面”,“绘图模式”,“材质”。

下一节讨论3D对象的属性。

阴暗面

通常,剔除是去除形状不正确的部分(在视图区域中不可见)。

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

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,BACKNONE的球体,如下所示-

阴险的面孔

绘图模式

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

box.setDrawMode(DrawMode.FILL); 

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

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

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

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

下面的程序是一个示例,演示了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的框,如下所示-

绘图模式

材料

剔除的“面”属性的类型为“材质” ,用于选择3D形状的材质的表面。您可以使用setCullFace()方法如下设置3D形状的材料-

cylinder.setMaterial(material);

如上所述,此方法需要传递类型为Material的对象。软件包javafx.scene.paintPhongMaterial类是此类的子类,并提供7个表示Phong着色材质的属性。您可以使用这些属性的设置器方法将所有这些类型的材料应用于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.tutorialspoint.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.tutorialspoint.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.tutorialspoint.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.tutorialspoint.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)镜面反射力,如以下屏幕快照所示-

气缸材质