JavaFX - 3D 图形

  • 简述

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

    通常,3D 形状是可以在 XYZ 平面上绘制的几何图形。这些包括一个Cylinder, Sphere 和一个 Box.
    上面提到的每个 3D 形状都由一个类表示,所有这些类都属于包 javafx.scene.shape. 类名为Shape3D 是 JavaFX 中所有 3 维形状的基类。
  • 创建 3D 形状

    要创建 3 维形状,您需要 -
    • 实例化所需 3D 形状的相应类。
    • 设置 3D 形状的属性。
    • 将 3D 形状对象添加到组中。

    实例化相应的类

    要创建 3 维形状,首先需要实例化其各自的类。例如,如果要创建一个 3D 框,则需要按如下方式实例化名为 Box 的类 -
    
    Box box = new Box();
    

    设置形状的属性

    实例化类后,您需要使用 setter 方法设置形状的属性。
    例如,要绘制一个 3D 框,您需要传递它的 Width、Height、Depth。您可以使用它们各自的 setter 方法指定这些值,如下所示 -
    
    //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 形状。
    序号 形状和描述
    1 方体
    长方体是一个三维形状 length (深度), width, 和 height.
    在 JavaFX 中,一个三维框由一个名为的类表示 Box. 这个类属于包javafx.scene.shape.
    通过实例化此类,您可以在 JavaFX 中创建一个 Box 节点。
    此类具有双数据类型的 3 个属性,即 -
    • width - 盒子的宽度。
    • height - 盒子的高度。
    • depth - 盒子的深度。
    2 圆柱
    圆柱体是一个封闭的实体,它有两个平行的(主要是圆形的)底面,通过曲面连接。
    它由两个参数描述,即 radius 它的圆形底座和 height 气缸的。
    在 JavaFX 中,圆柱体由名为的类表示 Cylinder. 这个类属于包javafx.scene.shape.
    通过实例化此类,您可以在 JavaFX 中创建圆柱节点。此类具有双数据类型的 2 个属性,即 -
    • height - 圆柱体的高度。
    • radius - 圆柱体的半径。
    3 球体
    球体被定义为与 3D 空间中的给定点距离相同的点集。这个距离 r 是球体的半径,给定的点是球体的中心。
    在 JavaFX 中,一个球体由一个名为的类表示 Sphere. 这个类属于包javafx.scene.shape.
    通过实例化此类,您可以在 JavaFX 中创建一个球体节点。
    这个类有一个名为 radius双数据类型。它代表球体的半径。
  • 3D 对象的属性

    对于所有 3 维对象,您可以设置各种属性,如剔除面、绘图模式、材料。
    以下部分讨论 3D 对象的属性。

    剔除面

    一般来说,剔除是去除形状中方向不正确的部分(在视​​图区域中不可见)。
    剔除面属性的类型为 CullFace它代表 3D 形状的剔除面。您可以使用以下方法设置形状的剔除面setCullFace() 如下图所示 -
    
    box.setCullFace(CullFace.NONE);
    
    形状的笔触类型可以是 -
    • None - 不执行剔除(CullFace.NONE)。
    • Front- 所有正面的多边形都被剔除。(CullFace.FRONT)。
    • Back- 所有背面的多边形都被剔除。(StrokeType.BACK)。
    默认情况下,3 维形状的剔除面是后退。

    例子

    以下程序是一个示例,它演示了球体的各种剔除面。将此代码保存在名称为的文件中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 形状,它们是 -
    • Fill − 此模式绘制并填充一个 2D 形状 (DrawMode.FILL)。
    • Line − 此模式使用线条绘制 3D 形状 (DrawMode.LINE)。
    默认情况下,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) { 
          //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 的框,如下所示 -
    绘图模式

    材料

    剔除面属性的类型为 Material它用于选择 3D 形状的材料表面。您可以使用方法设置 3D 形状的材质setCullFace() 如下 -
    
    cylinder.setMaterial(material);
    
    如上所述,对于此方法,您需要传递一个 Material 类型的对象。这PhongMaterial 包的类别 javafx.scene.paint是此类的子类,并提供 7 个表示 Phong 着色材质的属性。您可以使用这些属性的 setter 方法将所有这些类型的材料应用于 3D 形状的表面。
    以下是 JavaFX 中可用的材料类型 -
    • bumpMap - 这表示存储为 RGB 图像的法线贴图。
    • diffuseMap - 这代表一个漫反射贴图。
    • selfIlluminationMap - 这表示此 PhongMaterial 的自发光贴图。
    • specularMap - 这表示此 PhongMaterial 的高光贴图。
    • diffuseColor - 这表示此 PhongMaterial 的漫反射颜色。
    • specularColor - 这表示此 PhongMaterial 的镜面颜色。
    • specularPower - 这表示此 PhongMaterial 的镜面反射能力。
    默认情况下,3维形状的材质是漫反射颜色为浅灰色的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.cainiaoya.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.cainiaoya.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.cainiaoya.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.cainiaoya.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) 高光强度,如下图所示-
    气缸材质