JavaFX - kształty 3D
We wcześniejszych rozdziałach widzieliśmy, jak rysować kształty 2D na płaszczyźnie XY. Oprócz tych kształtów 2D, możemy również narysować kilka innych kształtów 3D za pomocą JavaFX.
Kształt 3D
Ogólnie rzecz biorąc, kształt 3D to figura geometryczna, którą można narysować na płaszczyźnie XYZ. Należą do nichCylinder, Sphere i a Box.
Każdy z wyżej wymienionych kształtów 3D jest reprezentowany przez klasę i wszystkie te klasy należą do pakietu javafx.scene.shape. Klasa o nazwieShape3D jest podstawową klasą wszystkich trójwymiarowych kształtów w JavaFX.
Tworzenie kształtu 3D
Aby stworzyć trójwymiarowy kształt, musisz -
Utwórz instancję odpowiedniej klasy wymaganego kształtu 3D.
Ustaw właściwości kształtu 3D.
Dodaj obiekt kształtu 3D do grupy.
Tworzenie wystąpienia odpowiedniej klasy
Aby utworzyć trójwymiarowy kształt, najpierw musisz utworzyć instancję odpowiedniej klasy. Na przykład, jeśli chcesz utworzyć kostkę 3D, musisz utworzyć wystąpienie klasy o nazwie Box w następujący sposób -
Box box = new Box();
Ustawianie właściwości kształtu
Po utworzeniu wystąpienia klasy należy ustawić właściwości kształtu przy użyciu metod ustawiających.
Na przykład, aby narysować kostkę 3D, musisz podać jej szerokość, wysokość, głębokość. Możesz określić te wartości, używając odpowiednich metod ustawiających w następujący sposób -
//Setting the properties of the Box
box.setWidth(200.0);
box.setHeight(400.0);
box.setDepth(200.0);
Dodawanie obiektu kształtu do grupy
Na koniec musisz dodać obiekt kształtu do grupy, przekazując go jako parametr konstruktora, jak pokazano poniżej.
//Creating a Group object
Group root = new Group(box);
Poniższa tabela zawiera listę różnych kształtów 3D udostępnianych przez JavaFX.
S.Nr | Kształt i opis |
---|---|
1 | Pudełko Prostopadłościan to trójwymiarowy kształt z length (głębokość), widthi a height. W JavaFX trójwymiarowe pudełko jest reprezentowane przez klasę o nazwie Box. Ta klasa należy do pakietujavafx.scene.shape. Tworząc instancję tej klasy, możesz utworzyć węzeł Box w JavaFX. Ta klasa ma 3 właściwości podwójnego typu danych, a mianowicie -
|
2 | Cylinder Cylinder to zamknięta bryła, która ma dwie równoległe (głównie okrągłe) podstawy połączone zakrzywioną powierzchnią. Opisują go dwa parametry, a mianowicie radius jego okrągłej podstawy i height cylindra. W JavaFX cylinder jest reprezentowany przez klasę o nazwie Cylinder. Ta klasa należy do pakietujavafx.scene.shape. Tworząc instancję tej klasy, można utworzyć węzeł cylindra w JavaFX. Ta klasa ma 2 właściwości podwójnego typu danych, a mianowicie -
|
3 | Kula Sfera jest definiowana jako zbiór punktów znajdujących się w tej samej odległości r od danego punktu w przestrzeni 3D. Ta odległość r jest promieniem kuli, a dany punkt jest środkiem kuli. W JavaFX sfera jest reprezentowana przez klasę o nazwie Sphere. Ta klasa należy do pakietujavafx.scene.shape. Tworząc instancję tej klasy, możesz utworzyć węzeł sfery w JavaFX. Ta klasa ma właściwość o nazwie radiuspodwójnego typu danych. Reprezentuje promień Sfery. |
Właściwości obiektów 3D
Dla wszystkich obiektów trójwymiarowych można ustawić różne właściwości, takie jak Cull Face, tryb rysowania, materiał.
W poniższej sekcji omówiono właściwości obiektów 3D.
Cull Face
Ogólnie rzecz biorąc, ubój to usuwanie nieprawidłowo zorientowanych części kształtu (które nie są widoczne w polu widzenia).
Właściwość Cull Face jest typu CullFacei reprezentuje Cull Face w kształcie 3D. Możesz ustawić Cull Face kształtu za pomocą tej metodysetCullFace() jak pokazano poniżej -
box.setCullFace(CullFace.NONE);
Typ obrysu kształtu może być -
None - Brak uboju (CullFace.NONE).
Front- Wszystkie wielokąty skierowane do przodu są usuwane. (CullFace.FRONT).
Back- Wszystkie wielokąty skierowane do tyłu są usuwane. (StrokeType.BACK).
Domyślnie ubytkiem w trójwymiarowym kształcie jest Wstecz.
Przykład
Poniższy program jest przykładem, który demonstruje różne twarze uboju kuli. Zapisz ten kod w pliku o nazwieSphereCullFace.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);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza poleceń, używając następujących poleceń.
javac SphereCullFace.java
java SphereCullFace
Podczas wykonywania powyższego programu generuje okno JavaFX wyświetlające trzy sfery z zerowymi wartościami nominalnymi FRONT, BACK i NONE odpowiednio w następujący sposób -
Tryby rysowania
To jest właściwość tego typu DrawModei reprezentuje tryb rysowania używany do rysowania bieżącego kształtu 3D. Możesz wybrać tryb rysowania, aby narysować kształt 3D za pomocą metody setDrawMode () w następujący sposób -
box.setDrawMode(DrawMode.FILL);
W JavaFX można wybrać dwa tryby rysowania, aby narysować kształt 3D, którymi są:
Fill - Ten tryb rysuje i wypełnia kształt 2D (DrawMode.FILL).
Line - Ten tryb rysuje kształt 3D za pomocą linii (DrawMode.LINE).
Domyślnie tryb rysowania kształtu trójwymiarowego to wypełnienie.
Przykład
Poniższy program jest przykładem pokazującym różne tryby rysowania kostki 3D. Zapisz ten kod w pliku o nazwieBoxDrawMode.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);
}
}
Skompiluj i uruchom zapisany plik java z wiersza poleceń, używając następujących poleceń.
javac BoxDrawMode.java
java BoxDrawMode
Podczas wykonywania powyższy program generuje okno JavaFX wyświetlające dwa pola z wartościami trybu rysowania odpowiednio LINE i FILL, jak poniżej -
Materiał
Właściwość Cull Face jest typu Materiali służy do wyboru powierzchni materiału o kształcie 3D. Za pomocą tej metody można ustawić materiał kształtu 3DsetCullFace() w następujący sposób -
cylinder.setMaterial(material);
Jak wspomniano powyżej dla tej metody, musisz przekazać obiekt typu Material. PlikPhongMaterial klasa pakietu javafx.scene.paintjest podklasą tej klasy i zapewnia 7 właściwości, które reprezentują materiał cieniowany Phong. Możesz zastosować wszystkie tego typu materiały do powierzchni kształtu 3D, używając metod ustawiania tych właściwości.
Poniżej przedstawiono rodzaje materiałów dostępnych w JavaFX -
bumpMap - To przedstawia normalną mapę zapisaną jako obraz RGB.
diffuseMap - To przedstawia rozproszoną mapę.
selfIlluminationMap - To reprezentuje mapę samooświetlenia tego materiału PhongMaterial.
specularMap - To przedstawia zwierciadlaną mapę tego PhongMaterial.
diffuseColor - To reprezentuje rozproszony kolor tego PhongMaterial.
specularColor - To reprezentuje zwierciadlany kolor tego PhongMaterial.
specularPower - To reprezentuje zwierciadlaną moc tego PhongMaterial.
Domyślnie materiałem o trójwymiarowym kształcie jest PhongMaterial o rozproszonym kolorze jasnoszarym.
Przykład
Poniżej znajduje się przykład, który przedstawia różne materiały na cylindrze. Zapisz ten kod w pliku o nazwieCylinderMaterials.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);
}
}
Skompiluj i uruchom zapisany plik java z wiersza poleceń, używając następujących poleceń.
Javac CylinderMaterials.java
java CylinderMaterials
Podczas wykonywania powyższy program generuje okno JavaFX wyświetlające odpowiednio 7 cylindrów z materiałami, mapą wypukłości, mapą rozproszenia, mapą oświetlenia własnego, mapą lustrzaną, kolorem rozproszenia, kolorem lustrzanym, mocą lustrzaną (BLANCHEDALMOND), jak pokazano na poniższym zrzucie ekranu -