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 -

  • width - Die Breite der Box.

  • height - Die Höhe der Box.

  • depth - Die Tiefe der Box.

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 -

  • height - Die Höhe des Zylinders.

  • radius - Der Radius des Zylinders.

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) - -