sábado, 4 de agosto de 2018

JavaFx - criando e girando cubos 3D

Já que aprendemos desenhar alguns objetos
em 3D, agora precisamos dar vidas a eles,
precisamos fazê-los movimentar,
e o movimento escolhido, é de giro,
poderíamos fazê-los percorrer os quatros cantos
da tela, indo e vindo, subindo e descendo,
mas deixaria o exemplo muito confuso,
então por enquanto assim será melhor.

Veja abaixo um vídeo com os cubos em movimento:


Veja abaixo uma imagem do programa em execução


Veja abaixo o código do programa:


import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

public class PROJETO extends Application {
     Canvas canvas = new Canvas ( 600, 360 );
     GraphicsContext ctx = canvas.getGraphicsContext2D ( );
     // Criando um Group object
     Group root = new Group ( );
     // Criando o scene object
     Scene scene = new Scene ( root, 600, 340 );
     //Desenhando as caixas
     Box box_1 = new Box ( );
     Box box_2 = new Box ( );
     Box box_3 = new Box ( );
     // Criando os  materiais
     PhongMaterial cria_material_1 = new PhongMaterial ( );
     PhongMaterial cria_material_2 = new PhongMaterial ( );
     PhongMaterial cria_material_3 = new PhongMaterial ( );

     RotateTransition rot_1 = new RotateTransition ( );
     RotateTransition rot_2 = new RotateTransition ( );
     RotateTransition rot_3 = new RotateTransition ( );

     Rotate rotateX_1 = new Rotate ( 20.0, Rotate.X_AXIS );
     Rotate rotateZ_1 = new Rotate ( 10.0, Rotate.Z_AXIS );
     Rotate rotateY_1 = new Rotate ( 30.0, Rotate.Y_AXIS );

     Rotate rotateX_2 = new Rotate ( 20.0, Rotate.X_AXIS );
     Rotate rotateZ_2 = new Rotate ( 10.0, Rotate.Z_AXIS );
     Rotate rotateY_2 = new Rotate ( 30.0, Rotate.Y_AXIS );

     Rotate rotateX_3 = new Rotate ( 20.0, Rotate.X_AXIS );
     Rotate rotateZ_3 = new Rotate ( 10.0, Rotate.Z_AXIS );
     Rotate rotateY_3 = new Rotate ( 30.0, Rotate.Y_AXIS );
     // /////////////////////////////////////////////////////////////////////////
     public void Informe ( ) {
         ctx.setFont ( Font.font ( "Arial", FontWeight.NORMAL, 13 ) );
         ctx.setFill ( Color.RED );
         ctx.fillText ( "Por: ", 250, 275 );
         ctx.setFill ( Color.BLUE );
         ctx.fillText ( "Samuel Lima", 280, 275 );
         ctx.setFill ( Color.BLACK );
         ctx.fillText ( "sa_sp10@hotmail.com", 250, 290 );
         ctx.setFill ( Color.RED );
         ctx.fillText ( "MUITO OBRIGADO", 250, 320 );
     }
     // ////////////////////////////////////////////////////////////////////////
     public void cria_cubo_1 ( ) {
         cria_material_1.setDiffuseColor ( Color.BLUE);
         cria_material_1.setSpecularColor ( Color.LIGHTBLUE ); 
         box_1.setMaterial ( cria_material_1 );
         box_1.setWidth ( 50.0 );
         box_1.setHeight ( 50.0 );
         box_1.setDepth ( 50.0 );
         box_1.setTranslateX ( 80 );
         box_1.setTranslateY ( 80 );
         box_1.setTranslateZ ( 140 );
         box_1.setLayoutX ( 80 );
         box_1.setLayoutY ( 100 );
         // Definindo a duração da transição
         rot_1.setDuration ( Duration.millis ( 1000 ) );     
         // Configurando o nó para a transição
         rot_1.setNode ( box_1 );
         // Ajustando o eixo da rotação
         rot_1.setAxis ( Rotate.X_AXIS );
         // Ajustando o ângulo da rotação
         rot_1.setByAngle ( 360 );
         // Definindo a contagem de ciclos
         // para finalizar em 50 segundos
         rot_1.setCycleCount ( 50 );
         // Configurando o valor do reverso automático
         // para falso
         rot_1.setAutoReverse ( false ); 
         // Iniciando a rotaão
         rot_1.play ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void cria_cubo_2 ( ) {
         cria_material_2.setDiffuseColor ( Color.RED );
         cria_material_2.setSpecularColor ( Color.LIGHTCORAL );
         box_2.setMaterial ( cria_material_2 );
         box_2.setWidth ( 50.0 );
         box_2.setHeight ( 50.0 );
         box_2.setDepth ( 50.0 );
         box_2.setTranslateX ( 150 );
         box_2.setTranslateY ( 80 );
         box_2.setTranslateZ ( 150 );
         box_2.setLayoutX ( 150 );
         box_2.setLayoutY ( 100 );
         // Definindo a duração da transição
         rot_2.setDuration ( Duration.millis ( 1000 ) );     
         // Configurando o nó para a transição
         rot_2.setNode ( box_2 );
         // Ajustando o eixo da rotação
         rot_2.setAxis ( Rotate.Z_AXIS );
         // Ajustando o ângulo da rotação
         rot_2.setByAngle ( 360 );
         // Definindo a contagem de ciclos
         // para finalizar em 50 segundos
         rot_2.setCycleCount ( 50 );
         // Configurando o valor do reverso automático
         // para falso
         rot_2.setAutoReverse ( false ); 
         // Iniciando a rotaão
         rot_2.play ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void cria_cubo_3 ( ) {
         cria_material_3.setDiffuseColor ( Color.YELLOW );
         cria_material_3.setSpecularColor ( Color.LIGHTYELLOW );
         box_3.setMaterial ( cria_material_3 );
         box_3.setWidth ( 50.0 );
         box_3.setHeight ( 50.0 );
         box_3.setDepth ( 50.0 );
         box_3.setTranslateX ( 220 );
         box_3.setTranslateY ( 80 );
         box_3.setTranslateZ ( 220 );
         box_3.setLayoutX ( 220 );
         box_3.setLayoutY ( 100 );
         // Definindo a duração da transição
         rot_3.setDuration ( Duration.millis ( 1000 ) );     
         // Configurando o nó para a transição
         rot_3.setNode ( box_3 );
         // Ajustando o eixo da rotação
         rot_3.setAxis ( Rotate.Y_AXIS );
         // Ajustando o ângulo da rotação
         rot_3.setByAngle ( 360 );
         // Definindo a contagem de ciclos
         // para finalizar em 50 segundos
         rot_3.setCycleCount ( 50 );
         // Configurando o valor do reverso automático
         // para falso
         rot_3.setAutoReverse ( false ); 
         // Iniciando a rotaão
         rot_3.play ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void start ( Stage stage ) {
         stage.setTitle ( "JAVAFX - CRIANDO E GIRANDO CUBOS 3D" );
         // Usando fonte em italic
         ctx.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 15 ) );
         // Criando uma moldura retangular em canvas
         ctx.setStroke ( Color.BLACK );
         ctx.setLineWidth ( 10.0 );
         ctx.strokeRoundRect ( 10, 10, 580, 325, 10, 10 );
         ctx.setFill ( Color.RED );
         ctx.fillText ( "JAVAFX - CRIANDO E GIRANDO CUBOS 3D", 160, 50 );
         cria_cubo_1 ( );
         cria_cubo_2 ( );      
         cria_cubo_3 ( );
         Informe ( );
         // Adicionando os ângulos das rotações as suas rspectivas caixas
         box_1.getTransforms ( ).addAll ( rotateX_1, rotateZ_1, rotateY_1 );
         box_2.getTransforms ( ).addAll ( rotateX_2, rotateZ_2, rotateY_2 ); 
         box_3.getTransforms ( ).addAll ( rotateX_3, rotateZ_3, rotateY_3 );
         root.getChildren ( ).addAll ( canvas );      
         // Adicionando as caixas ao layout
         root.getChildren ( ).addAll ( box_1, box_2, box_3 );
         // Adicionando o scene para o satge
         stage.setScene ( scene );
         // Exibindo o conteúdo do stage
         stage.show ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public static void main ( String args [ ] ) {
         launch ( args );
     }
}

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.