JavaFX - 3D-фигуры

В предыдущих главах мы видели, как рисовать 2D-фигуры на плоскости XY. В дополнение к этим 2D-формам мы можем рисовать несколько других 3D-фигур с помощью JavaFX.

3D форма

В общем, трехмерная фигура - это геометрическая фигура, которую можно нарисовать на плоскости XYZ. К ним относятсяCylinder, Sphere и Box.

Каждая из вышеупомянутых трехмерных фигур представлена ​​классом, и все эти классы принадлежат пакету javafx.scene.shape. Класс с именемShape3D является базовым классом всех трехмерных фигур в JavaFX.

Создание 3D-формы

Чтобы создать трехмерную форму, вам необходимо:

  • Создайте экземпляр соответствующего класса требуемой 3D-формы.

  • Задайте свойства 3D-формы.

  • Добавьте объект 3D-формы в группу.

Создание соответствующего класса

Чтобы создать трехмерную форму, прежде всего вам необходимо создать экземпляр соответствующего класса. Например, если вы хотите создать 3D-блок, вам необходимо создать экземпляр класса с именем Box следующим образом:

Box box = new Box();

Установка свойств формы

После создания экземпляра класса вам необходимо установить свойства формы с помощью методов установки.

Например, чтобы нарисовать трехмерный блок, вам нужно передать его ширину, высоту, глубину. Вы можете указать эти значения, используя соответствующие методы установки, следующим образом:

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

Добавление объекта формы в группу

Наконец, вам нужно добавить объект формы в группу, передав его в качестве параметра конструктора, как показано ниже.

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

В следующей таблице представлен список различных трехмерных фигур, предоставляемых JavaFX.

S.No Форма и описание
1 Коробка

Кубоид - это трехмерная фигура с length (глубина), width, а height.

В JavaFX трехмерный блок представлен классом с именем Box. Этот класс принадлежит пакетуjavafx.scene.shape.

Создавая экземпляр этого класса, вы можете создать узел Box в JavaFX.

Этот класс имеет 3 свойства двойного типа данных, а именно:

  • width - Ширина коробки.

  • height - Высота ящика.

  • depth - Глубина ящика.

2 Цилиндр

Цилиндр - это замкнутое твердое тело, имеющее два параллельных (в основном круглых) основания, соединенных изогнутой поверхностью.

Он описывается двумя параметрами, а именно: radius его круглого основания и height цилиндра.

В JavaFX цилиндр представлен классом с именем Cylinder. Этот класс принадлежит пакетуjavafx.scene.shape.

Создавая экземпляр этого класса, вы можете создать узел цилиндра в JavaFX. Этот класс имеет 2 свойства двойного типа данных, а именно:

  • height - Высота цилиндра.

  • radius - Радиус цилиндра.

3 Сфера

Сфера определяется как набор точек, находящихся на одинаковом расстоянии r от данной точки в трехмерном пространстве. Это расстояние r - радиус сферы, а данная точка - центр сферы.

В JavaFX сфера представлена ​​классом с именем Sphere. Этот класс принадлежит пакетуjavafx.scene.shape.

Создавая экземпляр этого класса, вы можете создать узел сферы в JavaFX.

У этого класса есть свойство с именем radiusдвойного типа данных. Он представляет радиус Сферы.

Свойства 3D-объектов

Для всех 3-х мерных объектов вы можете установить различные свойства, такие как Cull Face, Drawing Mode, Material.

В следующем разделе обсуждаются свойства 3D-объектов.

Cull Face

В общем случае отбраковка - это удаление неправильно ориентированных частей фигуры (которые не видны в области просмотра).

Свойство Cull Face имеет тип CullFaceи представляет собой отбракованную грань трехмерной формы. Вы можете установить Cull Face формы, используя методsetCullFace() как показано ниже -

box.setCullFace(CullFace.NONE);

Тип обводки фигуры может быть -

  • None - Отбор не производится (CullFace.NONE).

  • Front- Все полигоны лицевой стороны отбракованы. (CullFace.FRONT).

  • Back- Все полигоны обратной стороны отбракованы. (StrokeType.BACK).

По умолчанию граница отсечения трехмерной формы - Назад.

пример

Следующая программа представляет собой пример, демонстрирующий различные грани отсечения сферы. Сохраните этот код в файле с именемSphereCullFace.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); 
   } 
}

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.

javac SphereCullFace.java 
java SphereCullFace

При выполнении вышеуказанная программа генерирует окно JavaFX, отображающее три сферы с выбранными номиналами. FRONT, BACK и NONE соответственно следующим образом -

Режимы рисования

Это свойство типа DrawModeи представляет собой режим рисования, используемый для рисования текущей 3D-формы. Вы можете выбрать режим рисования для рисования 3D-формы с помощью метода setDrawMode () следующим образом:

box.setDrawMode(DrawMode.FILL);

В JavaFX вы можете выбрать два режима рисования для рисования 3D-формы, а именно:

  • Fill - Этот режим рисует и заполняет 2D-форму (DrawMode.FILL).

  • Line - В этом режиме трехмерная фигура рисуется с помощью линий (DrawMode.LINE).

По умолчанию режим рисования трехмерной формы - заливка.

пример

Следующая программа представляет собой пример, демонстрирующий различные режимы рисования трехмерного блока. Сохраните этот код в файле с именемBoxDrawMode.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); 
   } 
}

Скомпилируйте и выполните сохраненный файл java из командной строки, используя следующие команды.

javac BoxDrawMode.java 
java BoxDrawMode

При выполнении вышеупомянутая программа генерирует окно JavaFX, отображающее два поля со значениями режима рисования LINE и FILL соответственно, как показано ниже:

Материал

Свойство cull Face имеет тип Materialи используется для выбора поверхности материала трехмерной формы. Вы можете задать материал 3D-формы, используя методsetCullFace() следующим образом -

cylinder.setMaterial(material);

Как упоминалось выше для этого метода, вам необходимо передать объект типа Material. ВPhongMaterial класс пакета javafx.scene.paintявляется подклассом этого класса и предоставляет 7 свойств, которые представляют материал затенения Фонга. Вы можете применить все эти типы материалов к поверхности 3D-формы, используя методы установки этих свойств.

Ниже приведены типы материалов, доступных в JavaFX:

  • bumpMap - Это представляет собой карту нормалей, сохраненную как изображение RGB.

  • diffuseMap - Это представляет собой диффузную карту.

  • selfIlluminationMap - Это представляет собой карту самоосвещения этого материала PhongMaterial.

  • specularMap - Это представляет собой зеркальную карту этого материала PhongMaterial.

  • diffuseColor - Это диффузный цвет этого материала PhongMaterial.

  • specularColor - Представляет зеркальный цвет этого материала PhongMaterial.

  • specularPower - Это отражает зеркальную силу этого материала PhongMaterial.

По умолчанию материал трехмерной формы - это материал PhongMaterial диффузного светло-серого цвета.

пример

Ниже приведен пример, показывающий различные материалы на цилиндре. Сохраните этот код в файле с именемCylinderMaterials.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); 
   } 
}

Скомпилируйте и выполните сохраненный файл java из командной строки, используя следующие команды.

Javac CylinderMaterials.java 
java CylinderMaterials

При выполнении вышеупомянутая программа генерирует окно JavaFX, отображающее 7 цилиндров с материалами, картой рельефа, картой рассеивания, картой самосветления, картой отражения, цветом диффузии, цветом отражения, (BLANCHEDALMOND) отражательной силой, соответственно, как показано на следующем снимке экрана. -