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