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