JavaFX - Forme 3D

Nei capitoli precedenti abbiamo visto come disegnare forme 2D su un piano XY. Oltre a queste forme 2D, possiamo disegnare anche molte altre forme 3D usando JavaFX.

Forma 3D

In generale, una forma 3D è una figura geometrica che può essere disegnata sul piano XYZ. Questi includono aCylinder, Sphere e a Box.

Ciascuna delle suddette forme 3D è rappresentata da una classe e tutte queste classi appartengono al pacchetto javafx.scene.shape. La classe denominataShape3D è la classe base di tutte le forme tridimensionali in JavaFX.

Creazione di una forma 3D

Per creare una forma tridimensionale, è necessario:

  • Istanziare la rispettiva classe della forma 3D richiesta.

  • Imposta le proprietà della forma 3D.

  • Aggiungi l'oggetto forma 3D al gruppo.

Istanziare la rispettiva classe

Per creare una forma tridimensionale, prima di tutto devi istanziare la sua rispettiva classe. Ad esempio, se vuoi creare una scatola 3D, devi istanziare la classe denominata Box come segue:

Box box = new Box();

Impostazione delle proprietà della forma

Dopo aver creato un'istanza della classe, è necessario impostare le proprietà per la forma utilizzando i metodi setter.

Ad esempio, per disegnare una scatola 3D è necessario passare la sua Larghezza, Altezza, Profondità. È possibile specificare questi valori utilizzando i rispettivi metodi setter come segue:

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

Aggiunta dell'oggetto forma al gruppo

Infine, è necessario aggiungere l'oggetto della forma al gruppo passandolo come parametro del costruttore come mostrato di seguito.

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

La tabella seguente fornisce l'elenco delle varie forme 3D fornite da JavaFX.

S.No Forma e descrizione
1 Scatola

Un cuboide è una forma tridimensionale con a length (profondità), widthe a height.

In JavaFX una scatola tridimensionale è rappresentata da una classe denominata Box. Questa classe appartiene al pacchettojavafx.scene.shape.

Istanziando questa classe, puoi creare un nodo Box in JavaFX.

Questa classe ha 3 proprietà del tipo di dati doppio, ovvero:

  • width - La larghezza della scatola.

  • height - L'altezza della scatola.

  • depth - La profondità della scatola.

2 Cilindro

Un cilindro è un solido chiuso che ha due basi parallele (per lo più circolari) collegate da una superficie curva.

È descritto da due parametri, vale a dire, il radius della sua base circolare e il height del cilindro.

In JavaFX, un cilindro è rappresentato da una classe denominata Cylinder. Questa classe appartiene al pacchettojavafx.scene.shape.

Istanziando questa classe, è possibile creare un nodo cilindro in JavaFX. Questa classe ha 2 proprietà del doppio tipo di dati, ovvero:

  • height - L'altezza del cilindro.

  • radius - Il raggio del cilindro.

3 Sfera

Una sfera è definita come l'insieme di punti che sono tutti alla stessa distanza r da un dato punto in uno spazio 3D. Questa distanza r è il raggio della sfera e il punto dato è il centro della sfera.

In JavaFX, una sfera è rappresentata da una classe denominata Sphere. Questa classe appartiene al pacchettojavafx.scene.shape.

Istanziando questa classe, è possibile creare un nodo sfera in JavaFX.

Questa classe ha una proprietà denominata radiusdi doppio tipo di dati. Rappresenta il raggio di una Sfera.

Proprietà degli oggetti 3D

Per tutti e 3 gli oggetti dimensionali, puoi impostare varie proprietà come Cull Face, Drawing Mode, Material.

La sezione seguente discute le proprietà degli oggetti 3D.

Cull Face

In generale, l'abbattimento è la rimozione di parti di una forma orientate in modo non corretto (che non sono visibili nell'area di visualizzazione).

La proprietà Cull Face è del tipo CullFacee rappresenta il Cull Face di una forma 3D. È possibile impostare la faccia di esclusione di una forma utilizzando il metodosetCullFace() come mostrato di seguito -

box.setCullFace(CullFace.NONE);

Il tipo di tratto di una forma può essere:

  • None - Non viene eseguito alcun abbattimento (CullFace.NONE).

  • Front- Tutti i poligoni frontali vengono eliminati. (CullFace.FRONT).

  • Back- Tutti i poligoni rivolti verso il retro vengono eliminati. (StrokeType.BACK).

Per impostazione predefinita, la faccia di selezione di una forma tridimensionale è Indietro.

Esempio

Il seguente programma è un esempio che mostra varie facce di abbattimento della sfera. Salva questo codice in un file con il nomeSphereCullFace.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); 
   } 
}

Compilare ed eseguire il file Java salvato dal prompt dei comandi utilizzando i seguenti comandi.

javac SphereCullFace.java 
java SphereCullFace

All'esecuzione, il programma di cui sopra genera una finestra JavaFX che mostra tre sfere con valori nominali di abbattimento FRONT, BACK e NONE rispettivamente come segue -

Modalità di disegno

È la proprietà è del tipo DrawModee rappresenta la modalità di disegno utilizzata per disegnare la forma 3D corrente. Puoi scegliere la modalità di disegno per disegnare una forma 3D usando il metodo setDrawMode () come segue:

box.setDrawMode(DrawMode.FILL);

In JavaFX, puoi scegliere due modalità di disegno per disegnare una forma 3D, che sono:

  • Fill - Questa modalità disegna e riempie una forma 2D (DrawMode.FILL).

  • Line - Questa modalità disegna una forma 3D utilizzando linee (DrawMode.LINE).

Per impostazione predefinita, la modalità di disegno di una forma tridimensionale è riempimento.

Esempio

Il seguente programma è un esempio che mostra le varie modalità di disegno di una scatola 3D. Salva questo codice in un file con il nomeBoxDrawMode.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); 
   } 
}

Compilare ed eseguire il file java salvato dal prompt dei comandi utilizzando i seguenti comandi.

javac BoxDrawMode.java 
java BoxDrawMode

All'esecuzione, il programma di cui sopra genera una finestra JavaFX che mostra due caselle con i valori della modalità di disegno LINE e FILL rispettivamente, come segue:

Materiale

La proprietà Cull Face è del tipo Materialed è usato per scegliere la superficie del materiale di una forma 3D. È possibile impostare il materiale di una forma 3D utilizzando il metodosetCullFace() come segue -

cylinder.setMaterial(material);

Come accennato in precedenza per questo metodo, è necessario passare un oggetto del tipo Material. IlPhongMaterial classe del pacchetto javafx.scene.paintè una sottoclasse di questa classe e fornisce 7 proprietà che rappresentano un materiale ombreggiato Phong. È possibile applicare tutti questi tipi di materiali alla superficie di una forma 3D utilizzando i metodi di impostazione di queste proprietà.

Di seguito sono riportati i tipi di materiali disponibili in JavaFX:

  • bumpMap - Rappresenta una normale mappa memorizzata come immagine RGB.

  • diffuseMap - Questo rappresenta una mappa diffusa.

  • selfIlluminationMap - Questo rappresenta una mappa di autoilluminazione di questo materiale Phong.

  • specularMap - Questo rappresenta una mappa speculare di questo PhongMaterial.

  • diffuseColor - Questo rappresenta un colore diffuso di questo materiale Phong.

  • specularColor - Questo rappresenta un colore speculare di questo materiale Phong.

  • specularPower - Questo rappresenta un potere speculare di questo PhongMaterial.

Per impostazione predefinita, il materiale di una forma tridimensionale è un PhongMaterial con un colore diffuso di grigio chiaro.

Esempio

Di seguito è riportato un esempio che mostra vari materiali sul cilindro. Salva questo codice in un file con il nomeCylinderMaterials.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); 
   } 
}

Compilare ed eseguire il file java salvato dal prompt dei comandi utilizzando i seguenti comandi.

Javac CylinderMaterials.java 
java CylinderMaterials

All'esecuzione, il programma di cui sopra genera una finestra JavaFX che mostra 7 cilindri con Materiali, Bump Map, Diffuse Map, Auto-Illumination Map, Specular Map, Diffuse Color, Specular Color, (BLANCHEDALMOND) Specular Power, rispettivamente, come mostrato nella seguente schermata -