JavaFX - Formas 3D

En los capítulos anteriores, hemos visto cómo dibujar formas 2D en un plano XY. Además de estas formas 2D, también podemos dibujar otras formas 3D utilizando JavaFX.

Forma 3D

En general, una forma 3D es una figura geométrica que se puede dibujar en el plano XYZ. Estos incluyen unCylinder, Sphere y un Box.

Cada una de las formas 3D mencionadas anteriormente está representada por una clase y todas estas clases pertenecen al paquete javafx.scene.shape. La clase nombradaShape3D es la clase base de todas las formas tridimensionales en JavaFX.

Crear una forma 3D

Para crear una forma tridimensional, necesita:

  • Cree una instancia de la clase respectiva de la forma 3D requerida.

  • Establezca las propiedades de la forma 3D.

  • Agregue el objeto de forma 3D al grupo.

Instanciar la clase respectiva

Para crear una forma tridimensional, primero debe crear una instancia de su clase respectiva. Por ejemplo, si desea crear un cuadro 3D, debe crear una instancia de la clase llamada Cuadro de la siguiente manera:

Box box = new Box();

Establecer las propiedades de la forma

Después de crear una instancia de la clase, debe establecer las propiedades de la forma utilizando los métodos de establecimiento.

Por ejemplo, para dibujar un cuadro 3D debe pasar su Ancho, Alto, Profundidad. Puede especificar estos valores utilizando sus respectivos métodos de establecimiento de la siguiente manera:

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

Agregar el objeto de forma al grupo

Finalmente, debe agregar el objeto de la forma al grupo pasándolo como un parámetro del constructor como se muestra a continuación.

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

La siguiente tabla le ofrece la lista de varias formas 3D proporcionadas por JavaFX.

S. No Forma y descripción
1 Caja

Un cuboide es una forma tridimensional con un length (profundidad), widthy un height.

En JavaFX, una caja tridimensional está representada por una clase llamada Box. Esta clase pertenece al paquetejavafx.scene.shape.

Al crear una instancia de esta clase, puede crear un nodo Box en JavaFX.

Esta clase tiene 3 propiedades del tipo de datos doble, a saber:

  • width - El ancho de la caja.

  • height - La altura de la caja.

  • depth - La profundidad de la caja.

2 Cilindro

Un cilindro es un sólido cerrado que tiene dos bases paralelas (en su mayoría circulares) conectadas por una superficie curva.

Se describe mediante dos parámetros, a saber, el radius de su base circular y el height del cilindro.

En JavaFX, un cilindro está representado por una clase llamada Cylinder. Esta clase pertenece al paquetejavafx.scene.shape.

Al crear una instancia de esta clase, puede crear un nodo de cilindro en JavaFX. Esta clase tiene 2 propiedades del tipo de datos doble, a saber:

  • height - La altura del cilindro.

  • radius - El radio del cilindro.

3 Esfera

Una esfera se define como el conjunto de puntos que están todos a la misma distancia r de un punto dado en un espacio 3D. Esta distancia r es el radio de la esfera y el punto dado es el centro de la esfera.

En JavaFX, una esfera está representada por una clase llamada Sphere. Esta clase pertenece al paquetejavafx.scene.shape.

Al crear una instancia de esta clase, puede crear un nodo de esfera en JavaFX.

Esta clase tiene una propiedad llamada radiusde doble tipo de datos. Representa el radio de una esfera.

Propiedades de los objetos 3D

Para todos los objetos tridimensionales, puede establecer varias propiedades como Cull Face, Drawing Mode, Material.

La siguiente sección analiza las propiedades de los objetos 3D.

Cara de sacrificio

En general, la selección es la eliminación de partes mal orientadas de una forma (que no son visibles en el área de visualización).

La propiedad Cull Face es del tipo CullFacey representa la cara de eliminación de una forma 3D. Puede establecer la cara de selección de una forma utilizando el métodosetCullFace() como se muestra a continuación -

box.setCullFace(CullFace.NONE);

El tipo de trazo de una forma puede ser:

  • None - No se realiza ningún sacrificio (CullFace.NONE).

  • Front- Se eliminan todos los polígonos del frente. (CullFace.FRENTE).

  • Back- Se eliminan todos los polígonos del reverso. (StrokeType.BACK).

De forma predeterminada, la cara de selección de una forma tridimensional es Atrás.

Ejemplo

El siguiente programa es un ejemplo que muestra varias caras de eliminación de la esfera. Guarde este código en un archivo con el nombreSphereCullFace.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); 
   } 
}

Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos.

javac SphereCullFace.java 
java SphereCullFace

Al ejecutarse, el programa anterior genera una ventana JavaFX que muestra tres esferas con valores faciales de eliminación FRONT, BACK y NONE respectivamente como sigue -

Modos de dibujo

Es la propiedad es del tipo DrawModey representa el modo de dibujo utilizado para dibujar la forma 3D actual. Puede elegir el modo de dibujo para dibujar una forma 3D utilizando el método setDrawMode () de la siguiente manera:

box.setDrawMode(DrawMode.FILL);

En JavaFX, puede elegir dos modos de dibujo para dibujar una forma 3D, que son:

  • Fill - Este modo dibuja y rellena una forma 2D (DrawMode.FILL).

  • Line - Este modo dibuja una forma 3D usando líneas (DrawMode.LINE).

Por defecto, el modo de dibujo de una forma tridimensional es relleno.

Ejemplo

El siguiente programa es un ejemplo que muestra varios modos de dibujo de una caja 3D. Guarde este código en un archivo con el nombreBoxDrawMode.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); 
   } 
}

Compile y ejecute el archivo java guardado desde el símbolo del sistema utilizando los siguientes comandos.

javac BoxDrawMode.java 
java BoxDrawMode

Al ejecutarse, el programa anterior genera una ventana JavaFX que muestra dos cuadros con los valores del modo de dibujo LINE y FILL respectivamente, de la siguiente manera:

Material

La propiedad Cull Face es del tipo Materialy se utiliza para elegir la superficie del material de una forma 3D. Puede configurar el material de una forma 3D utilizando el métodosetCullFace() como sigue -

cylinder.setMaterial(material);

Como se mencionó anteriormente para este método, debe pasar un objeto del tipo Material. losPhongMaterial clase del paquete javafx.scene.paintes una subclase de esta clase y proporciona 7 propiedades que representan un material sombreado Phong. Puede aplicar todo este tipo de materiales a la superficie de una forma 3D utilizando los métodos de establecimiento de estas propiedades.

A continuación se muestran los tipos de materiales que están disponibles en JavaFX:

  • bumpMap - Esto representa un mapa normal almacenado como una imagen RGB.

  • diffuseMap - Esto representa un mapa difuso.

  • selfIlluminationMap - Esto representa un mapa de autoiluminación de este PhongMaterial.

  • specularMap - Esto representa un mapa especular de este PhongMaterial.

  • diffuseColor - Esto representa un color difuso de este PhongMaterial.

  • specularColor - Esto representa un color especular de este PhongMaterial.

  • specularPower - Esto representa un poder especular de este PhongMaterial.

Por defecto, el material de una forma tridimensional es un PhongMaterial con un color difuso de gris claro.

Ejemplo

A continuación se muestra un ejemplo que muestra varios materiales en el cilindro. Guarde este código en un archivo con el nombreCylinderMaterials.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); 
   } 
}

Compile y ejecute el archivo java guardado desde el símbolo del sistema utilizando los siguientes comandos.

Javac CylinderMaterials.java 
java CylinderMaterials

Al ejecutarse, el programa anterior genera una ventana JavaFX que muestra 7 cilindros con Materiales, Mapa de relieve, Mapa difuso, Mapa de autoiluminación, Mapa especular, Color difuso, Color especular, (BLANCHEDALMOND) Potencia especular, respectivamente, como se muestra en la siguiente captura de pantalla -