JavaFX-3D 모양

이전 장에서 우리는 XY 평면에 2D 모양을 그리는 방법을 보았습니다. 이러한 2D 모양 외에도 JavaFX를 사용하여 여러 다른 3D 모양을 그릴 수 있습니다.

3D 모양

일반적으로 3D 도형은 XYZ 평면에 그릴 수있는 기하학적 도형입니다. 여기에는Cylinder, Sphere 그리고 Box.

위에서 언급 한 각 3D 모양은 클래스로 표현되며 이러한 모든 클래스는 패키지에 속합니다. javafx.scene.shape. 명명 된 클래스Shape3D JavaFX의 모든 3 차원 도형의 기본 클래스입니다.

3D 모양 만들기

3 차원 모양을 만들려면 다음을 수행해야합니다.

  • 필요한 3D 모양의 각 클래스를 인스턴스화합니다.

  • 3D 도형의 속성을 설정합니다.

  • 그룹에 3D 모양 개체를 추가합니다.

각 클래스 인스턴스화

3 차원 모양을 만들려면 먼저 해당 클래스를 인스턴스화해야합니다. 예를 들어 3D 상자를 만들려면 다음과 같이 Box라는 클래스를 인스턴스화해야합니다.

Box box = new Box();

모양의 속성 설정

클래스를 인스턴스화 한 후 setter 메서드를 사용하여 셰이프의 속성을 설정해야합니다.

예를 들어 3D 상자를 그리려면 너비, 높이, 깊이를 전달해야합니다. 다음과 같이 각각의 setter 메서드를 사용하여 이러한 값을 지정할 수 있습니다.

//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에서 제공하는 다양한 3D 모양 목록을 제공합니다.

S. 아니 모양 및 설명
1 상자

입방체는 length (깊이), width, 및 height.

JavaFX에서 3 차원 상자는 다음과 같은 클래스로 표시됩니다. Box. 이 클래스는 패키지에 속합니다.javafx.scene.shape.

이 클래스를 인스턴스화하여 JavaFX에서 Box 노드를 만들 수 있습니다.

이 클래스는 즉 이중 데이터 유형의 3 가지 속성을 가지고 있습니다-

  • width − 상자의 너비.

  • height − 상자의 높이.

  • depth − 상자의 깊이.

2 실린더

원통은 곡면으로 연결된 두 개의 평행 (대부분 원형)베이스가있는 닫힌 솔리드입니다.

두 가지 매개 변수, 즉 radius 원형베이스와 height 실린더의.

JavaFX에서 실린더는 다음과 같은 클래스로 표시됩니다. Cylinder. 이 클래스는 패키지에 속합니다.javafx.scene.shape.

이 클래스를 인스턴스화하여 JavaFX에서 실린더 노드를 만들 수 있습니다. 이 클래스는 즉, 이중 데이터 유형의 두 가지 속성이 있습니다-

  • height − 실린더의 높이.

  • radius − 원통의 반경.

구체

구는 3D 공간의 지정된 점에서 모두 동일한 거리 r에있는 점 집합으로 정의됩니다. 이 거리 r은 구의 반지름이고 주어진 점은 구의 중심입니다.

JavaFX에서 구는 다음과 같은 클래스로 표시됩니다. Sphere. 이 클래스는 패키지에 속합니다.javafx.scene.shape.

이 클래스를 인스턴스화하면 JavaFX에서 구 노드를 만들 수 있습니다.

이 클래스에는 radius이중 데이터 유형의. 구의 반경을 나타냅니다.

3D 개체의 속성

3 차원 개체 모두에 대해 Cull Face, Drawing Mode, Material과 같은 다양한 속성을 설정할 수 있습니다.

다음 섹션에서는 3D 개체의 속성에 대해 설명합니다.

컬 페이스

일반적으로 컬링은 모양에서 방향이 잘못된 부분 (보기 영역에 표시되지 않음)을 제거하는 것입니다.

Cull Face 속성은 CullFace3D 모양의 Cull Face를 나타냅니다. 방법을 사용하여 모양의 Cull Face를 설정할 수 있습니다.setCullFace() 아래와 같이-

box.setCullFace(CullFace.NONE);

모양의 획 유형은 다음과 같습니다.

  • None − 컬링이 수행되지 않습니다 (CullFace.NONE).

  • Front− 전면을 향한 모든 폴리곤이 컬링됩니다. (CullFace.FRONT).

  • Back-뒷면을 향한 모든 다각형이 컬링됩니다. (StrokeType.BACK).

기본적으로 3 차원 모양의 컬면은 뒤로입니다.

다음 프로그램은 구의 다양한 컬면을 보여주는 예제입니다. 이 코드를 이름으로 파일에 저장하십시오.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, BACKNONE 각각 다음과 같이-

그리기 모드

속성이 유형입니다. DrawMode현재 3D 도형을 그리는 데 사용되는 그리기 모드를 나타냅니다. 다음과 같이 setDrawMode () 메서드를 사용하여 3D 모양을 그리는 그리기 모드를 선택할 수 있습니다.

box.setDrawMode(DrawMode.FILL);

JavaFX에서는 두 가지 그리기 모드를 선택하여 3D 모양을 그릴 수 있습니다.

  • Fill −이 모드는 2D 도형 (DrawMode.FILL)을 그리고 채 웁니다.

  • Line −이 모드는 선 (DrawMode.LINE)을 사용하여 3D 도형을 그립니다.

기본적으로 3 차원 도형의 그리기 모드는 채우기입니다.

다음 프로그램은 3D 상자의 다양한 그리기 모드를 보여주는 예제입니다. 이 코드를 이름으로 파일에 저장하십시오.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

실행시 위의 프로그램은 다음과 같이 그리기 모드 값이 LINE과 FILL 인 두 개의 상자를 표시하는 JavaFX 창을 생성합니다.

재료

cull Face 속성은 Material3D 모양의 재질 표면을 선택하는 데 사용됩니다. 방법을 사용하여 3D 모양의 재질을 설정할 수 있습니다.setCullFace() 다음과 같이-

cylinder.setMaterial(material);

이 메서드에 대해 위에서 언급했듯이 Material 유형의 개체를 전달해야합니다. 그만큼PhongMaterial 패키지 클래스 javafx.scene.paint는이 클래스의 하위 클래스이며 Phong 음영 재질을 나타내는 7 개의 속성을 제공합니다. 이러한 속성의 setter 메서드를 사용하여 이러한 모든 유형의 재료를 3D 모양의 표면에 적용 할 수 있습니다.

다음은 JavaFX에서 사용할 수있는 자료의 유형입니다-

  • bumpMap − 이것은 RGB 이미지로 저장된 노멀 맵을 나타냅니다.

  • diffuseMap − 이것은 확산 맵을 나타냅니다.

  • selfIlluminationMap − 이것은이 PhongMaterial의 자체 조명 맵을 나타냅니다.

  • specularMap − 이것은이 PhongMaterial의 스페 큘러 맵을 나타냅니다.

  • diffuseColor − 이것은이 PhongMaterial의 확산 색상을 나타냅니다.

  • specularColor − 이것은이 PhongMaterial의 반사 색상을 나타냅니다.

  • specularPower -이것은이 PhongMaterial의 반사광을 나타냅니다.

기본적으로 3 차원 모양의 재질은 확산 색상이 밝은 회색 인 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

실행시 위의 프로그램은 다음 스크린 샷과 같이 각각 Materials, Bump Map, Diffuse Map, Self-Illumination Map, Specular Map, Diffuse Color, Specular Color, (BLANCHEDALMOND) Specular Power가있는 7 개의 실린더를 표시하는 JavaFX 창을 생성합니다. −