JavaFX - Formas 3D

Nos capítulos anteriores, vimos como desenhar formas 2D em um plano XY. Além dessas formas 2D, podemos desenhar várias outras formas 3D também usando JavaFX.

Forma 3D

Em geral, uma forma 3D é uma figura geométrica que pode ser desenhada no plano XYZ. Isso inclui umCylinder, Sphere e um Box.

Cada uma das formas 3D mencionadas acima é representada por uma classe e todas essas classes pertencem ao pacote javafx.scene.shape. A classe chamadaShape3D é a classe base de todas as formas tridimensionais em JavaFX.

Criação de uma forma 3D

Para criar uma forma tridimensional, você precisa -

  • Instancie a respectiva classe da forma 3D necessária.

  • Defina as propriedades da forma 3D.

  • Adicione o objeto de forma 3D ao grupo.

Instanciando a respectiva classe

Para criar uma forma tridimensional, primeiro de tudo você precisa instanciar sua respectiva classe. Por exemplo, se você deseja criar uma caixa 3D, você precisa instanciar a classe chamada Box da seguinte maneira -

Box box = new Box();

Definindo as propriedades da forma

Depois de instanciar a classe, você precisa definir as propriedades da forma usando os métodos setter.

Por exemplo, para desenhar uma caixa 3D, você precisa passar sua Largura, Altura e Profundidade. Você pode especificar esses valores usando seus respectivos métodos setter da seguinte forma -

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

Adicionando o Objeto Forma ao Grupo

Finalmente, você precisa adicionar o objeto da forma ao grupo, passando-o como um parâmetro do construtor, conforme mostrado abaixo.

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

A tabela a seguir fornece a lista de várias formas 3D fornecidas pelo JavaFX.

S.Não Forma e descrição
1 Caixa

Um cubóide é uma forma tridimensional com um length (profundidade), width, e um height.

No JavaFX, uma caixa tridimensional é representada por uma classe chamada Box. Esta classe pertence ao pacotejavafx.scene.shape.

Ao instanciar essa classe, você pode criar um nó Box no JavaFX.

Esta classe tem 3 propriedades do tipo de dados duplo, a saber -

  • width - A largura da caixa.

  • height - A altura da caixa.

  • depth - A profundidade da caixa.

2 Cilindro

Um cilindro é um sólido fechado que possui duas bases paralelas (principalmente circulares) conectadas por uma superfície curva.

É descrito por dois parâmetros, a saber, o radius de sua base circular e o height do cilindro.

No JavaFX, um cilindro é representado por uma classe chamada Cylinder. Esta classe pertence ao pacotejavafx.scene.shape.

Ao instanciar essa classe, você pode criar um nó de cilindro no JavaFX. Esta classe tem 2 propriedades do tipo de dados duplo, a saber -

  • height - A altura do cilindro.

  • radius - O raio do cilindro.

3 Esfera

Uma esfera é definida como o conjunto de pontos que estão todos à mesma distância r de um determinado ponto em um espaço 3D. Esta distância r é o raio da esfera e o ponto dado é o centro da esfera.

No JavaFX, uma esfera é representada por uma classe chamada Sphere. Esta classe pertence ao pacotejavafx.scene.shape.

Ao instanciar essa classe, você pode criar um nó de esfera no JavaFX.

Esta classe possui uma propriedade chamada radiusde tipo de dados duplo. Ele representa o raio de uma esfera.

Propriedades de objetos 3D

Para todos os objetos tridimensionais, você pode definir várias propriedades, como Cull Face, Modo de desenho, Material.

A seção a seguir discute as propriedades de objetos 3D.

Cull Face

Em geral, seleção é a remoção de partes indevidamente orientadas de uma forma (que não são visíveis na área de visualização).

A propriedade Cull Face é do tipo CullFacee representa a Face Cull de uma forma 3D. Você pode definir a Face de Cull de uma forma usando o métodosetCullFace() como mostrado abaixo -

box.setCullFace(CullFace.NONE);

O tipo de traço de uma forma pode ser -

  • None - Nenhuma seleção é realizada (CullFace.NONE).

  • Front- Todos os polígonos voltados para a frente são selecionados. (CullFace.FRONT).

  • Back- Todos os polígonos voltados para trás são eliminados. (StrokeType.BACK).

Por padrão, a face de separação de uma forma tridimensional é Voltar.

Exemplo

O programa a seguir é um exemplo que demonstra várias faces de eliminação da esfera. Salve este código em um arquivo com o 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); 
   } 
}

Compile e execute o arquivo Java salvo no prompt de comando usando os comandos a seguir.

javac SphereCullFace.java 
java SphereCullFace

Ao ser executado, o programa acima gera uma janela JavaFX exibindo três esferas com valores de face de seleção FRONT, BACK e NONE respectivamente como segue -

Modos de Desenho

É a propriedade é do tipo DrawModee representa o modo de desenho usado para desenhar a forma 3D atual. Você pode escolher o modo de desenho para desenhar uma forma 3D usando o método setDrawMode () da seguinte maneira -

box.setDrawMode(DrawMode.FILL);

No JavaFX, você pode escolher dois modos de desenho para desenhar uma forma 3D, que são -

  • Fill - Este modo desenha e preenche uma forma 2D (DrawMode.FILL).

  • Line - Este modo desenha uma forma 3D usando linhas (DrawMode.LINE).

Por padrão, o modo de desenho de uma forma tridimensional é o preenchimento.

Exemplo

O programa a seguir é um exemplo que demonstra vários modos de desenho de uma caixa 3D. Salve este código em um arquivo com o 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); 
   } 
}

Compile e execute o arquivo java salvo no prompt de comando usando os comandos a seguir.

javac BoxDrawMode.java 
java BoxDrawMode

Ao ser executado, o programa acima gera uma janela JavaFX exibindo duas caixas com valores de modo de desenho LINE e FILL respectivamente, como segue -

Material

A propriedade Cull Face é do tipo Materiale é usado para escolher a superfície do material de uma forma 3D. Você pode definir o material de uma forma 3D usando o métodosetCullFace() como segue -

cylinder.setMaterial(material);

Conforme mencionado acima para este método, você precisa passar um objeto do tipo Material. oPhongMaterial classe do pacote javafx.scene.painté uma subclasse desta classe e fornece 7 propriedades que representam um material sombreado Phong. Você pode aplicar todos esses tipos de materiais à superfície de uma forma 3D usando os métodos de configuração dessas propriedades.

A seguir estão os tipos de materiais disponíveis no JavaFX -

  • bumpMap - Isso representa um mapa normal armazenado como uma imagem RGB.

  • diffuseMap - Isso representa um mapa difuso.

  • selfIlluminationMap - Isso representa um mapa de autoiluminação deste PhongMaterial.

  • specularMap - Isso representa um mapa especular deste PhongMaterial.

  • diffuseColor - Isso representa uma cor difusa deste PhongMaterial.

  • specularColor - Isso representa uma cor especular deste PhongMaterial.

  • specularPower - Isso representa um poder especular deste PhongMaterial.

Por padrão, o material de uma forma tridimensional é um PhongMaterial com uma cor difusa de cinza claro.

Exemplo

A seguir está um exemplo que exibe vários materiais no cilindro. Salve este código em um arquivo com o 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); 
   } 
}

Compile e execute o arquivo java salvo no prompt de comando usando os comandos a seguir.

Javac CylinderMaterials.java 
java CylinderMaterials

Ao ser executado, o programa acima gera uma janela JavaFX exibindo 7 cilindros com materiais, mapa de relevo, mapa difuso, mapa de auto-iluminação, mapa especular, cor difusa, cor especular, (BLANCHEDALMOND) Potência especular, respectivamente, conforme mostrado na imagem a seguir -