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