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à:
|
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à:
|
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, BACK và NONE 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 -