JavaFX - 3D-Formen
In den vorherigen Kapiteln haben wir gesehen, wie 2D-Formen auf einer XY-Ebene gezeichnet werden. Zusätzlich zu diesen 2D-Formen können wir mit JavaFX auch mehrere andere 3D-Formen zeichnen.
3D-Form
Im Allgemeinen ist eine 3D-Form eine geometrische Figur, die in der XYZ-Ebene gezeichnet werden kann. Dazu gehören aCylinder, Sphere und ein Box.
Jede der oben genannten 3D-Formen wird durch eine Klasse dargestellt, und alle diese Klassen gehören zum Paket javafx.scene.shape. Die benannte KlasseShape3D ist die Basisklasse aller dreidimensionalen Formen in JavaFX.
Erstellen einer 3D-Form
Um eine dreidimensionale Form zu erstellen, müssen Sie -
Instanziieren Sie die jeweilige Klasse der gewünschten 3D-Form.
Legen Sie die Eigenschaften der 3D-Form fest.
Fügen Sie der Gruppe das 3D-Formobjekt hinzu.
Instanziieren der jeweiligen Klasse
Um eine dreidimensionale Form zu erstellen, müssen Sie zunächst die jeweilige Klasse instanziieren. Wenn Sie beispielsweise eine 3D-Box erstellen möchten, müssen Sie die Klasse Box wie folgt instanziieren:
Box box = new Box();
Festlegen der Eigenschaften der Form
Nach dem Instanziieren der Klasse müssen Sie die Eigenschaften für die Form mithilfe der Setter-Methoden festlegen.
Um beispielsweise eine 3D-Box zu zeichnen, müssen Sie deren Breite, Höhe und Tiefe übergeben. Sie können diese Werte mit den jeweiligen Setter-Methoden wie folgt angeben:
//Setting the properties of the Box
box.setWidth(200.0);
box.setHeight(400.0);
box.setDepth(200.0);
Hinzufügen des Formobjekts zur Gruppe
Schließlich müssen Sie das Objekt der Form zur Gruppe hinzufügen, indem Sie es wie unten gezeigt als Parameter des Konstruktors übergeben.
//Creating a Group object
Group root = new Group(box);
In der folgenden Tabelle finden Sie eine Liste der verschiedenen von JavaFX bereitgestellten 3D-Formen.
S.No. | Form & Beschreibung |
---|---|
1 |
Box
Ein Quader ist eine dreidimensionale Form mit a length (Tiefe), width, und ein height. In JavaFX wird eine dreidimensionale Box durch eine Klasse mit dem Namen dargestellt Box. Diese Klasse gehört zum Paketjavafx.scene.shape. Durch Instanziieren dieser Klasse können Sie einen Box-Knoten in JavaFX erstellen. Diese Klasse hat 3 Eigenschaften des doppelten Datentyps, nämlich -
|
2 | Zylinder
Ein Zylinder ist ein geschlossener Festkörper mit zwei parallelen (meist kreisförmigen) Basen, die durch eine gekrümmte Oberfläche verbunden sind. Es wird durch zwei Parameter beschrieben, nämlich die radius seiner kreisförmigen Basis und der height des Zylinders. In JavaFX wird ein Zylinder durch eine Klasse mit dem Namen dargestellt Cylinder. Diese Klasse gehört zum Paketjavafx.scene.shape. Durch Instanziieren dieser Klasse können Sie in JavaFX einen Zylinderknoten erstellen. Diese Klasse hat 2 Eigenschaften des doppelten Datentyps, nämlich -
|
3 | Kugel
Eine Kugel ist definiert als die Menge von Punkten, die sich alle im gleichen Abstand r von einem bestimmten Punkt in einem 3D-Raum befinden. Dieser Abstand r ist der Radius der Kugel und der gegebene Punkt ist der Mittelpunkt der Kugel. In JavaFX wird eine Kugel durch eine Klasse mit dem Namen dargestellt Sphere. Diese Klasse gehört zum Paketjavafx.scene.shape. Durch Instanziieren dieser Klasse können Sie einen Kugelknoten in JavaFX erstellen. Diese Klasse hat eine Eigenschaft namens radiusvom doppelten Datentyp. Es repräsentiert den Radius einer Kugel. |
Eigenschaften von 3D-Objekten
Für alle dreidimensionalen Objekte können Sie verschiedene Eigenschaften festlegen, z. B. Keulfläche, Zeichenmodus, Material.
Im folgenden Abschnitt werden die Eigenschaften von 3D-Objekten erläutert.
Keulgesicht
Beim Keulen werden im Allgemeinen nicht richtig ausgerichtete Teile einer Form entfernt (die im Ansichtsbereich nicht sichtbar sind).
Die Cull Face-Eigenschaft ist vom Typ CullFaceund es repräsentiert das Cull Face einer 3D-Form. Mit der Methode können Sie die Keulfläche einer Form festlegensetCullFace() wie unten gezeigt -
box.setCullFace(CullFace.NONE);
Der Strichart einer Form kann sein -
None - Es wird kein Keulen durchgeführt (CullFace.NONE).
Front- Alle nach vorne gerichteten Polygone werden ausgesondert. (CullFace.FRONT).
Back- Alle nach hinten gerichteten Polygone werden ausgesondert. (StrokeType.BACK).
Standardmäßig ist die Keulfläche einer dreidimensionalen Form Zurück.
Beispiel
Das folgende Programm ist ein Beispiel, das verschiedene Keulungsflächen der Kugel zeigt. Speichern Sie diesen Code in einer Datei mit dem NamenSphereCullFace.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);
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie mit den folgenden Befehlen an der Eingabeaufforderung aus.
javac SphereCullFace.java
java SphereCullFace
Bei der Ausführung generiert das obige Programm ein JavaFX-Fenster, in dem drei Kugeln mit Keulungsflächenwerten angezeigt werden FRONT, BACK und NONE jeweils wie folgt -
Zeichenmodi
Es ist die Eigenschaft vom Typ DrawModeund es stellt den Zeichenmodus dar, der zum Zeichnen der aktuellen 3D-Form verwendet wird. Sie können den Zeichenmodus zum Zeichnen einer 3D-Form mit der Methode setDrawMode () wie folgt auswählen:
box.setDrawMode(DrawMode.FILL);
In JavaFX können Sie zwei Zeichenmodi auswählen, um eine 3D-Form zu zeichnen:
Fill - Dieser Modus zeichnet und füllt eine 2D-Form (DrawMode.FILL).
Line - Dieser Modus zeichnet eine 3D-Form mithilfe von Linien (DrawMode.LINE).
Standardmäßig ist der Zeichenmodus einer 3D-dimensionalen Form gefüllt.
Beispiel
Das folgende Programm ist ein Beispiel, das verschiedene Zeichenmodi einer 3D-Box demonstriert. Speichern Sie diesen Code in einer Datei mit dem NamenBoxDrawMode.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);
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie mit den folgenden Befehlen an der Eingabeaufforderung aus.
javac BoxDrawMode.java
java BoxDrawMode
Bei der Ausführung generiert das obige Programm ein JavaFX-Fenster, in dem zwei Felder mit den Zeichenmoduswerten LINE bzw. FILL wie folgt angezeigt werden:
Material
Die Eigenschaft cull Face ist vom Typ Materialund es wird verwendet, um die Oberfläche des Materials einer 3D-Form auszuwählen. Mit der Methode können Sie das Material einer 3D-Form festlegensetCullFace() wie folgt -
cylinder.setMaterial(material);
Wie oben für diese Methode erwähnt, müssen Sie ein Objekt vom Typ Material übergeben. DasPhongMaterial Klasse des Pakets javafx.scene.paintist eine Unterklasse dieser Klasse und bietet 7 Eigenschaften, die ein Phong-schattiertes Material darstellen. Sie können alle diese Arten von Materialien mit den Setter-Methoden dieser Eigenschaften auf die Oberfläche einer 3D-Form anwenden.
Im Folgenden sind die Materialien aufgeführt, die in JavaFX verfügbar sind:
bumpMap - Dies stellt eine normale Karte dar, die als RGB-Bild gespeichert ist.
diffuseMap - Dies ist eine diffuse Karte.
selfIlluminationMap - Dies ist eine Selbstbeleuchtungskarte dieses PhongMaterials.
specularMap - Dies ist eine spiegelnde Karte dieses PhongMaterials.
diffuseColor - Dies ist eine diffuse Farbe dieses PhongMaterials.
specularColor - Dies ist eine Spiegelfarbe dieses PhongMaterials.
specularPower - Dies repräsentiert eine spiegelnde Kraft dieses PhongMaterials.
Standardmäßig ist das Material einer dreidimensionalen Form ein PhongMaterial mit einer diffusen hellgrauen Farbe.
Beispiel
Das folgende Beispiel zeigt verschiedene Materialien auf dem Zylinder. Speichern Sie diesen Code in einer Datei mit dem NamenCylinderMaterials.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);
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie mit den folgenden Befehlen an der Eingabeaufforderung aus.
Javac CylinderMaterials.java
java CylinderMaterials
Bei der Ausführung generiert das obige Programm ein JavaFX-Fenster, in dem 7 Zylinder mit Materialien, Bump Map, Diffuse Map, Selbstbeleuchtungskarte, Specular Map, Diffuse Color, Specular Color (BLANCHEDALMOND) Specular Power angezeigt werden (siehe folgenden Screenshot) - -