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