JavaFX - Formes 3D

Dans les chapitres précédents, nous avons vu comment dessiner des formes 2D sur un plan XY. En plus de ces formes 2D, nous pouvons également dessiner plusieurs autres formes 3D en utilisant JavaFX.

Forme 3D

En général, une forme 3D est une figure géométrique qui peut être dessinée sur le plan XYZ. Ceux-ci comprennent unCylinder, Sphere et un Box.

Chacune des formes 3D mentionnées ci-dessus est représentée par une classe et toutes ces classes appartiennent au package javafx.scene.shape. La classe nomméeShape3D est la classe de base de toutes les formes tridimensionnelles de JavaFX.

Créer une forme 3D

Pour créer une forme en 3 dimensions, vous devez -

  • Instanciez la classe respective de la forme 3D requise.

  • Définissez les propriétés de la forme 3D.

  • Ajoutez l'objet de forme 3D au groupe.

Instanciation de la classe respective

Pour créer une forme en 3 dimensions, vous devez tout d'abord instancier sa classe respective. Par exemple, si vous souhaitez créer une boîte 3D, vous devez instancier la classe nommée Box comme suit -

Box box = new Box();

Définition des propriétés de la forme

Après avoir instancié la classe, vous devez définir les propriétés de la forme à l'aide des méthodes setter.

Par exemple, pour dessiner une boîte 3D, vous devez passer sa largeur, sa hauteur et sa profondeur. Vous pouvez spécifier ces valeurs en utilisant leurs méthodes de réglage respectives comme suit -

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

Ajout de l'objet Shape au groupe

Enfin, vous devez ajouter l'objet de la forme au groupe en le passant comme paramètre du constructeur comme indiqué ci-dessous.

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

Le tableau suivant vous donne la liste des différentes formes 3D fournies par JavaFX.

S. Non Forme et description
1 Boîte

Un cuboïde est une forme tridimensionnelle avec un length (profondeur), width, et un height.

Dans JavaFX, une boîte en trois dimensions est représentée par une classe nommée Box. Cette classe appartient au packagejavafx.scene.shape.

En instanciant cette classe, vous pouvez créer un nœud Box dans JavaFX.

Cette classe a 3 propriétés du double type de données à savoir -

  • width - La largeur de la boîte.

  • height - La hauteur de la boîte.

  • depth - La profondeur de la boîte.

2 Cylindre

Un cylindre est un solide fermé qui a deux bases parallèles (principalement circulaires) reliées par une surface courbe.

Il est décrit par deux paramètres, à savoir, le radius de sa base circulaire et du height du cylindre.

Dans JavaFX, un cylindre est représenté par une classe nommée Cylinder. Cette classe appartient au packagejavafx.scene.shape.

En instanciant cette classe, vous pouvez créer un nœud de cylindre dans JavaFX. Cette classe a 2 propriétés du double type de données à savoir -

  • height - La hauteur du cylindre.

  • radius - Le rayon du cylindre.

3 Sphère

Une sphère est définie comme l'ensemble de points qui sont tous à la même distance r d'un point donné dans un espace 3D. Cette distance r est le rayon de la sphère et le point donné est le centre de la sphère.

Dans JavaFX, une sphère est représentée par une classe nommée Sphere. Cette classe appartient au packagejavafx.scene.shape.

En instanciant cette classe, vous pouvez créer un nœud de sphère dans JavaFX.

Cette classe a une propriété nommée radiusde double type de données. Il représente le rayon d'une sphère.

Propriétés des objets 3D

Pour tous les objets 3 dimensions, vous pouvez définir diverses propriétés telles que la face de coupe, le mode de dessin, le matériau.

La section suivante décrit les propriétés des objets 3D.

Visage de réforme

En général, le tri est l'élimination des parties mal orientées d'une forme (qui ne sont pas visibles dans la zone de visualisation).

La propriété Cull Face est du type CullFaceet il représente la face de coupe d'une forme 3D. Vous pouvez définir la face de coupe d'une forme à l'aide de la méthodesetCullFace() comme indiqué ci-dessous -

box.setCullFace(CullFace.NONE);

Le type de trait d'une forme peut être -

  • None - Aucun abattage n'est effectué (CullFace.NONE).

  • Front- Tous les polygones de face sont éliminés. (CullFace.FRONT).

  • Back- Tous les polygones orientés vers l'arrière sont éliminés. (StrokeType.BACK).

Par défaut, la face d'abattage d'une forme tridimensionnelle est Arrière.

Exemple

Le programme suivant est un exemple illustrant les différentes faces d'abattage de la sphère. Enregistrez ce code dans un fichier avec le nomSphereCullFace.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); 
   } 
}

Compilez et exécutez le fichier Java enregistré à partir de l'invite de commande à l'aide des commandes suivantes.

javac SphereCullFace.java 
java SphereCullFace

Lors de l'exécution, le programme ci-dessus génère une fenêtre JavaFX affichant trois sphères avec des valeurs faciales de suppression FRONT, BACK et NONE respectivement comme suit -

Modes de dessin

C'est la propriété est du type DrawModeet il représente le mode de dessin utilisé pour dessiner la forme 3D actuelle. Vous pouvez choisir le mode de dessin pour dessiner une forme 3D en utilisant la méthode setDrawMode () comme suit -

box.setDrawMode(DrawMode.FILL);

Dans JavaFX, vous pouvez choisir deux modes de dessin pour dessiner une forme 3D, qui sont -

  • Fill - Ce mode dessine et remplit une forme 2D (DrawMode.FILL).

  • Line - Ce mode dessine une forme 3D à l'aide de lignes (DrawMode.LINE).

Par défaut, le mode de dessin d'une forme 3D dimensionnelle est Remplissage.

Exemple

Le programme suivant est un exemple illustrant différents modes de dessin d'une boîte 3D. Enregistrez ce code dans un fichier avec le nomBoxDrawMode.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); 
   } 
}

Compilez et exécutez le fichier java enregistré à partir de l'invite de commande à l'aide des commandes suivantes.

javac BoxDrawMode.java 
java BoxDrawMode

Lors de l'exécution, le programme ci-dessus génère une fenêtre JavaFX affichant deux boîtes avec les valeurs de mode de dessin LINE et FILL respectivement, comme suit -

Matériel

La propriété Cull Face est du type Materialet il est utilisé pour choisir la surface du matériau d'une forme 3D. Vous pouvez définir le matériau d'une forme 3D à l'aide de la méthodesetCullFace() comme suit -

cylinder.setMaterial(material);

Comme mentionné ci-dessus pour cette méthode, vous devez passer un objet de type Material. lePhongMaterial classe du package javafx.scene.paintest une sous-classe de cette classe et fournit 7 propriétés qui représentent un matériau ombré Phong. Vous pouvez appliquer tous ces types de matériaux à la surface d'une forme 3D en utilisant les méthodes de réglage de ces propriétés.

Voici le type de matériaux disponibles dans JavaFX -

  • bumpMap - Ceci représente une carte normale stockée sous forme d'image RVB.

  • diffuseMap - Ceci représente une carte diffuse.

  • selfIlluminationMap - Ceci représente une carte d'auto-illumination de ce PhongMaterial.

  • specularMap - Ceci représente une carte spéculaire de ce PhongMaterial.

  • diffuseColor - Cela représente une couleur diffuse de ce PhongMaterial.

  • specularColor - Cela représente une couleur spéculaire de ce PhongMaterial.

  • specularPower - Ceci représente une puissance spéculaire de ce PhongMaterial.

Par défaut, le matériau d'une forme en 3 dimensions est un PhongMaterial avec une couleur diffuse de gris clair.

Exemple

Voici un exemple qui affiche divers matériaux sur le cylindre. Enregistrez ce code dans un fichier avec le nomCylinderMaterials.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); 
   } 
}

Compilez et exécutez le fichier java enregistré à partir de l'invite de commande à l'aide des commandes suivantes.

Javac CylinderMaterials.java 
java CylinderMaterials

Lors de l'exécution, le programme ci-dessus génère une fenêtre JavaFX affichant 7 cylindres avec Matériaux, Bump Map, Diffuse Map, Self-Illumination Map, Specular Map, Diffuse Color, Specular Color, (BLANCHEDALMOND) Specular Power, respectivement, comme indiqué dans la capture d'écran suivante -