JavaFX - Hình dạng 3D

Trong các chương trước, chúng ta đã biết cách vẽ các hình 2D trên mặt phẳng XY. Ngoài các hình dạng 2D này, chúng ta có thể vẽ một số hình dạng 3D khác bằng cách sử dụng JavaFX.

Hình dạng 3D

Nói chung, hình dạng 3D là hình dạng hình học có thể được vẽ trên mặt phẳng XYZ. Chúng bao gồm mộtCylinder, Sphere và một Box.

Mỗi hình dạng 3D được đề cập ở trên được đại diện bởi một lớp và tất cả các lớp này đều thuộc về gói javafx.scene.shape. Lớp có tênShape3D là lớp cơ sở của tất cả các hình dạng 3 chiều trong JavaFX.

Tạo hình dạng 3D

Để tạo hình dạng 3 chiều, bạn cần -

  • Tạo lớp tương ứng của hình dạng 3D được yêu cầu.

  • Đặt các thuộc tính của hình dạng 3D.

  • Thêm đối tượng hình dạng 3D vào nhóm.

Khởi tạo lớp tương ứng

Để tạo hình 3 chiều, trước hết bạn cần khởi tạo lớp tương ứng của nó. Ví dụ: nếu bạn muốn tạo một hộp 3D, bạn cần khởi tạo lớp có tên Hộp như sau:

Box box = new Box();

Đặt thuộc tính của hình dạng

Sau khi khởi tạo lớp, bạn cần đặt các thuộc tính cho hình dạng bằng các phương thức setter.

Ví dụ, để vẽ một hộp 3D, bạn cần phải vượt qua Chiều rộng, Chiều cao, Chiều sâu của nó. Bạn có thể chỉ định các giá trị này bằng cách sử dụng các phương thức setter tương ứng của chúng như sau:

//Setting the properties of the Box 
box.setWidth(200.0); 
box.setHeight(400.0);   
box.setDepth(200.0);

Thêm đối tượng hình dạng vào nhóm

Cuối cùng, bạn cần thêm đối tượng của shape vào nhóm bằng cách chuyển nó dưới dạng tham số của hàm tạo như hình dưới đây.

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

Bảng sau cung cấp cho bạn danh sách các hình dạng 3D khác nhau được cung cấp bởi JavaFX.

S. không Hình dạng & Mô tả
1 Cái hộp

Hình khối là hình dạng ba chiều với length (chiều sâu), width, và một height.

Trong JavaFX một hộp ba chiều được đại diện bởi một lớp có tên Box. Lớp này thuộc về góijavafx.scene.shape.

Bằng cách khởi tạo lớp này, bạn có thể tạo một nút Hộp trong JavaFX.

Lớp này có 3 thuộc tính của kiểu dữ liệu kép là:

  • width - Chiều rộng của hộp.

  • height - Chiều cao của hộp.

  • depth - Chiều sâu của hộp.

2 Hình trụ

Hình trụ là một vật rắn kín có hai đáy song song (chủ yếu là hình tròn) được nối với nhau bằng một mặt cong.

Nó được mô tả bởi hai tham số, cụ thể là, radius của cơ sở tròn của nó và height của hình trụ.

Trong JavaFX, một hình trụ được đại diện bởi một lớp có tên Cylinder. Lớp này thuộc về góijavafx.scene.shape.

Bằng cách khởi tạo lớp này, bạn có thể tạo một nút hình trụ trong JavaFX. Lớp này có 2 thuộc tính của kiểu dữ liệu kép là:

  • height - Chiều cao của xi lanh.

  • radius - Bán kính của xi lanh.

3 Quả cầu

Hình cầu được định nghĩa là tập hợp các điểm cách một điểm đã cho ở cùng một khoảng cách r trong không gian 3D. Khoảng cách r này là bán kính của mặt cầu và điểm đã cho là tâm của mặt cầu.

Trong JavaFX, một hình cầu được đại diện bởi một lớp có tên Sphere. Lớp này thuộc về góijavafx.scene.shape.

Bằng cách khởi tạo lớp này, bạn có thể tạo một nút hình cầu trong JavaFX.

Lớp này có thuộc tính có tên radiuscủa kiểu dữ liệu kép. Nó đại diện cho bán kính của một Sphere.

Thuộc tính của đối tượng 3D

Đối với tất cả 3 đối tượng Chiều, bạn có thể đặt các thuộc tính khác nhau như Mặt rỗng, Chế độ vẽ, Chất liệu.

Phần sau đây thảo luận về các thuộc tính của các đối tượng 3D.

Mặt rỗng

Nói chung, chọn lọc là loại bỏ các phần được định hướng không phù hợp của một hình dạng (không thể nhìn thấy trong vùng xem).

Thuộc tính Cull Face thuộc loại CullFacevà nó đại diện cho Mặt rỗng của một hình dạng 3D. Bạn có thể đặt Mặt rỗng của một hình dạng bằng phương phápsetCullFace() như hình dưới đây -

box.setCullFace(CullFace.NONE);

Kiểu đột quỵ của một hình dạng có thể là -

  • None - Không thực hiện tiêu hủy (CullFace.NONE).

  • Front- Tất cả các đa giác mặt trước đều được cắt bỏ. (CullFace.FRONT).

  • Back- Tất cả các đa giác mặt sau đều được cắt bỏ. (StrokeType.BACK).

Theo mặc định, mặt cull của hình dạng 3 chiều là Quay lại.

Thí dụ

Chương trình sau đây là một ví dụ minh họa các mặt cull khác nhau của hình cầu. Lưu mã này trong một tệp có tênSphereCullFace.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); 
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ dấu nhắc lệnh bằng các lệnh sau.

javac SphereCullFace.java 
java SphereCullFace

Khi thực thi, chương trình trên tạo một cửa sổ JavaFX hiển thị ba hình cầu với các giá trị mặt cull FRONT, BACKNONE tương ứng như sau -

Chế độ vẽ

Đó là tài sản thuộc loại DrawModevà nó đại diện cho chế độ vẽ được sử dụng để vẽ hình dạng 3D hiện tại. Bạn có thể chọn chế độ vẽ để vẽ hình 3D bằng phương thức setDrawMode () như sau:

box.setDrawMode(DrawMode.FILL);

Trong JavaFX, bạn có thể chọn hai chế độ vẽ để vẽ hình dạng 3D, đó là:

  • Fill - Chế độ này vẽ và điền vào một hình dạng 2D (DrawMode.FILL).

  • Line - Chế độ này vẽ một hình dạng 3D bằng cách sử dụng các đường (DrawMode.LINE).

Theo mặc định, chế độ vẽ của một hình dạng 3Dimensional là tô màu.

Thí dụ

Chương trình sau đây là một ví dụ minh họa các chế độ vẽ khác nhau của hộp 3D. Lưu mã này trong một tệp có tênBoxDrawMode.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); 
   } 
}

Biên dịch và thực thi tệp java đã lưu từ dấu nhắc lệnh bằng các lệnh sau.

javac BoxDrawMode.java 
java BoxDrawMode

Khi thực thi, chương trình trên tạo một cửa sổ JavaFX hiển thị hai hộp với các giá trị chế độ vẽ LINE và FILL tương ứng, như sau:

Vật chất

Thuộc tính Cull Face thuộc loại Materialvà nó được sử dụng để chọn bề mặt của vật liệu có hình dạng 3D. Bạn có thể đặt vật liệu của hình dạng 3D bằng phương phápsetCullFace() như sau -

cylinder.setMaterial(material);

Như đã đề cập ở trên đối với phương thức này, bạn cần truyền một đối tượng có kiểu Material. CácPhongMaterial lớp của gói javafx.scene.paintlà một lớp con của lớp này và cung cấp 7 thuộc tính đại diện cho một vật liệu bóng mờ Phong. Bạn có thể áp dụng tất cả các loại vật liệu này lên bề mặt của hình dạng 3D bằng cách sử dụng các phương pháp setter của các thuộc tính này.

Sau đây là các loại vật liệu có sẵn trong JavaFX:

  • bumpMap - Điều này đại diện cho một bản đồ bình thường được lưu trữ dưới dạng Hình ảnh RGB.

  • diffuseMap - Điều này thể hiện một bản đồ khuếch tán.

  • selfIlluminationMap - Đây là bản đồ tự phát sáng của PhongMaterial này.

  • specularMap - Đây là một bản đồ cụ thể của PhongMaterial này.

  • diffuseColor - Điều này thể hiện một màu lan tỏa của PhongMaterial này.

  • specularColor - Điều này thể hiện một màu đặc trưng của PhongMaterial này.

  • specularPower - Điều này thể hiện một sức mạnh đầu cơ của PhongMaterial này.

Theo mặc định, vật liệu của hình dạng 3 chiều là Vật liệu Phong với màu khuếch tán là xám nhạt.

Thí dụ

Sau đây là một ví dụ hiển thị các vật liệu khác nhau trên hình trụ. Lưu mã này trong một tệp có tênCylinderMaterials.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); 
   } 
}

Biên dịch và thực thi tệp java đã lưu từ dấu nhắc lệnh bằng các lệnh sau.

Javac CylinderMaterials.java 
java CylinderMaterials

Khi thực hiện, chương trình trên tạo ra một cửa sổ JavaFX hiển thị 7 hình trụ với Vật liệu, Bản đồ Bump, Bản đồ khuếch tán, Bản đồ tự chiếu sáng, Bản đồ đặc điểm, Màu khuếch tán, Màu đặc trưng, ​​(BLANCHEDALMOND) Công suất đặc biệt, như được hiển thị trong ảnh chụp màn hình sau -