JavaFX - kształty 3D

We wcześniejszych rozdziałach widzieliśmy, jak rysować kształty 2D na płaszczyźnie XY. Oprócz tych kształtów 2D, możemy również narysować kilka innych kształtów 3D za pomocą JavaFX.

Kształt 3D

Ogólnie rzecz biorąc, kształt 3D to figura geometryczna, którą można narysować na płaszczyźnie XYZ. Należą do nichCylinder, Sphere i a Box.

Każdy z wyżej wymienionych kształtów 3D jest reprezentowany przez klasę i wszystkie te klasy należą do pakietu javafx.scene.shape. Klasa o nazwieShape3D jest podstawową klasą wszystkich trójwymiarowych kształtów w JavaFX.

Tworzenie kształtu 3D

Aby stworzyć trójwymiarowy kształt, musisz -

  • Utwórz instancję odpowiedniej klasy wymaganego kształtu 3D.

  • Ustaw właściwości kształtu 3D.

  • Dodaj obiekt kształtu 3D do grupy.

Tworzenie wystąpienia odpowiedniej klasy

Aby utworzyć trójwymiarowy kształt, najpierw musisz utworzyć instancję odpowiedniej klasy. Na przykład, jeśli chcesz utworzyć kostkę 3D, musisz utworzyć wystąpienie klasy o nazwie Box w następujący sposób -

Box box = new Box();

Ustawianie właściwości kształtu

Po utworzeniu wystąpienia klasy należy ustawić właściwości kształtu przy użyciu metod ustawiających.

Na przykład, aby narysować kostkę 3D, musisz podać jej szerokość, wysokość, głębokość. Możesz określić te wartości, używając odpowiednich metod ustawiających w następujący sposób -

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

Dodawanie obiektu kształtu do grupy

Na koniec musisz dodać obiekt kształtu do grupy, przekazując go jako parametr konstruktora, jak pokazano poniżej.

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

Poniższa tabela zawiera listę różnych kształtów 3D udostępnianych przez JavaFX.

S.Nr Kształt i opis
1 Pudełko

Prostopadłościan to trójwymiarowy kształt z length (głębokość), widthi a height.

W JavaFX trójwymiarowe pudełko jest reprezentowane przez klasę o nazwie Box. Ta klasa należy do pakietujavafx.scene.shape.

Tworząc instancję tej klasy, możesz utworzyć węzeł Box w JavaFX.

Ta klasa ma 3 właściwości podwójnego typu danych, a mianowicie -

  • width - Szerokość pudełka.

  • height - wysokość pudełka.

  • depth - Głębokość pudełka.

2 Cylinder

Cylinder to zamknięta bryła, która ma dwie równoległe (głównie okrągłe) podstawy połączone zakrzywioną powierzchnią.

Opisują go dwa parametry, a mianowicie radius jego okrągłej podstawy i height cylindra.

W JavaFX cylinder jest reprezentowany przez klasę o nazwie Cylinder. Ta klasa należy do pakietujavafx.scene.shape.

Tworząc instancję tej klasy, można utworzyć węzeł cylindra w JavaFX. Ta klasa ma 2 właściwości podwójnego typu danych, a mianowicie -

  • height - wysokość cylindra.

  • radius - Promień cylindra.

3 Kula

Sfera jest definiowana jako zbiór punktów znajdujących się w tej samej odległości r od danego punktu w przestrzeni 3D. Ta odległość r jest promieniem kuli, a dany punkt jest środkiem kuli.

W JavaFX sfera jest reprezentowana przez klasę o nazwie Sphere. Ta klasa należy do pakietujavafx.scene.shape.

Tworząc instancję tej klasy, możesz utworzyć węzeł sfery w JavaFX.

Ta klasa ma właściwość o nazwie radiuspodwójnego typu danych. Reprezentuje promień Sfery.

Właściwości obiektów 3D

Dla wszystkich obiektów trójwymiarowych można ustawić różne właściwości, takie jak Cull Face, tryb rysowania, materiał.

W poniższej sekcji omówiono właściwości obiektów 3D.

Cull Face

Ogólnie rzecz biorąc, ubój to usuwanie nieprawidłowo zorientowanych części kształtu (które nie są widoczne w polu widzenia).

Właściwość Cull Face jest typu CullFacei reprezentuje Cull Face w kształcie 3D. Możesz ustawić Cull Face kształtu za pomocą tej metodysetCullFace() jak pokazano poniżej -

box.setCullFace(CullFace.NONE);

Typ obrysu kształtu może być -

  • None - Brak uboju (CullFace.NONE).

  • Front- Wszystkie wielokąty skierowane do przodu są usuwane. (CullFace.FRONT).

  • Back- Wszystkie wielokąty skierowane do tyłu są usuwane. (StrokeType.BACK).

Domyślnie ubytkiem w trójwymiarowym kształcie jest Wstecz.

Przykład

Poniższy program jest przykładem, który demonstruje różne twarze uboju kuli. Zapisz ten kod w pliku o nazwieSphereCullFace.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); 
   } 
}

Skompiluj i uruchom zapisany plik Java z wiersza poleceń, używając następujących poleceń.

javac SphereCullFace.java 
java SphereCullFace

Podczas wykonywania powyższego programu generuje okno JavaFX wyświetlające trzy sfery z zerowymi wartościami nominalnymi FRONT, BACK i NONE odpowiednio w następujący sposób -

Tryby rysowania

To jest właściwość tego typu DrawModei reprezentuje tryb rysowania używany do rysowania bieżącego kształtu 3D. Możesz wybrać tryb rysowania, aby narysować kształt 3D za pomocą metody setDrawMode () w następujący sposób -

box.setDrawMode(DrawMode.FILL);

W JavaFX można wybrać dwa tryby rysowania, aby narysować kształt 3D, którymi są:

  • Fill - Ten tryb rysuje i wypełnia kształt 2D (DrawMode.FILL).

  • Line - Ten tryb rysuje kształt 3D za pomocą linii (DrawMode.LINE).

Domyślnie tryb rysowania kształtu trójwymiarowego to wypełnienie.

Przykład

Poniższy program jest przykładem pokazującym różne tryby rysowania kostki 3D. Zapisz ten kod w pliku o nazwieBoxDrawMode.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); 
   } 
}

Skompiluj i uruchom zapisany plik java z wiersza poleceń, używając następujących poleceń.

javac BoxDrawMode.java 
java BoxDrawMode

Podczas wykonywania powyższy program generuje okno JavaFX wyświetlające dwa pola z wartościami trybu rysowania odpowiednio LINE i FILL, jak poniżej -

Materiał

Właściwość Cull Face jest typu Materiali służy do wyboru powierzchni materiału o kształcie 3D. Za pomocą tej metody można ustawić materiał kształtu 3DsetCullFace() w następujący sposób -

cylinder.setMaterial(material);

Jak wspomniano powyżej dla tej metody, musisz przekazać obiekt typu Material. PlikPhongMaterial klasa pakietu javafx.scene.paintjest podklasą tej klasy i zapewnia 7 właściwości, które reprezentują materiał cieniowany Phong. Możesz zastosować wszystkie tego typu materiały do ​​powierzchni kształtu 3D, używając metod ustawiania tych właściwości.

Poniżej przedstawiono rodzaje materiałów dostępnych w JavaFX -

  • bumpMap - To przedstawia normalną mapę zapisaną jako obraz RGB.

  • diffuseMap - To przedstawia rozproszoną mapę.

  • selfIlluminationMap - To reprezentuje mapę samooświetlenia tego materiału PhongMaterial.

  • specularMap - To przedstawia zwierciadlaną mapę tego PhongMaterial.

  • diffuseColor - To reprezentuje rozproszony kolor tego PhongMaterial.

  • specularColor - To reprezentuje zwierciadlany kolor tego PhongMaterial.

  • specularPower - To reprezentuje zwierciadlaną moc tego PhongMaterial.

Domyślnie materiałem o trójwymiarowym kształcie jest PhongMaterial o rozproszonym kolorze jasnoszarym.

Przykład

Poniżej znajduje się przykład, który przedstawia różne materiały na cylindrze. Zapisz ten kod w pliku o nazwieCylinderMaterials.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); 
   } 
}

Skompiluj i uruchom zapisany plik java z wiersza poleceń, używając następujących poleceń.

Javac CylinderMaterials.java 
java CylinderMaterials

Podczas wykonywania powyższy program generuje okno JavaFX wyświetlające odpowiednio 7 cylindrów z materiałami, mapą wypukłości, mapą rozproszenia, mapą oświetlenia własnego, mapą lustrzaną, kolorem rozproszenia, kolorem lustrzanym, mocą lustrzaną (BLANCHEDALMOND), jak pokazano na poniższym zrzucie ekranu -