top

JavaFX 3D(1)真正的3D物件

分享:

JavaFX特效(1)陰影(Shadow)處理 << 前情

JavaFX 8新增3D功能,與之前JavaFX 2的模擬3D不大一樣,例如新增Shape3D抽象類別,繼承自Shape3D抽象類別的3D物件包括Box, Cylinder, MeshView, Sphere等類別,均為真正的3D物件。

欲執行JavaFX 3D,首先作業系統與瀏覽器須符合JDK 8 Certified System Configurations,可參考此連結,須注意的是JavaFX 8已不支援Windows XP作業系統,若是Windows 7則需SP1以上,此外,系統顯示卡的驅動程式可能也需要更新方可正常執行。

為判斷系統是否支援JavaFX 3D,可使用Platform.isSupported()方法判斷,其參數為ConditionalFeature.SCENE3D,請參考以下程式:

// 判斷系統是否支援JavaFX 3D
if (Platform.isSupported(ConditionalFeature.SCENE3D)) {
  PhongMaterial phongmaterial = new PhongMaterial();
  phongmaterial.setSpecularColor(Color.ORANGE);
  phongmaterial.setDiffuseColor(Color.RED);

  Box box = new Box(400, 400, 400);
  box.setMaterial(phongmaterial);

  Group group = new Group();
  group.getChildren().add(box);

  Scene scene = new Scene(group, 500, 500);

  primaryStage.setTitle("Box 3D");
  primaryStage.setScene(scene);
  primaryStage.show();
}
else {
  System.out.println("System can't support Scene 3D.");
  System.exit(0);
}

Shape3D抽象類別定義以下屬性:

  • cullFace:沿用自OpenGL的GL_CULL_FACE。多邊體 (Polygon) 是由數個面 (Facet) 所組成,每一個面由數個頂點 (Vertex) 所設定,在描繪3D物件時,面對鏡頭的一面稱為Front Face,背對鏡頭的一面稱為Back Face,由於描繪3D物件需要複雜的計算,因此為增加執行效率,通常會省略描繪背對鏡頭的一面,此功能稱為Cull Face。在OpenGL中,以glCullFace()方法設定省略描繪Front Face或Back Face,欲啟用Cull Face功能,則以glEnable(GL_CULL_FACE)方法設定。JavaFX 8的Shape3D抽象類別沿用OpenGL此一功能,以cullFace屬性設定是否省略描繪Front Face或Back Face,分別為CullFace.FRONTCullFace.BACKCullFace.NONE,代表省略描繪Front Face、Back Face或不省略。
  • drawMode:定義3D物件的繪製方式,分別為DrawMode.FILLDrawMode.LINE,代表填滿3D物件表面或以Wireframe方式呈現。
  • material:定義3D物件表面的材質。

Shape3D抽象類別提供以下方法:

  • getCullFace():取得省略描繪的一面,回傳CullFace.FRONTCullFace.BACKCullFace.NONE,代表省略描繪Front Face、Back Face或不省略。
  • setCullFace():設定省略描繪的一面,預設為CullFace.BACK
  • getDrawMode():取得3D物件的繪製方式,回傳DrawMode.FILLDrawMode.LINE,代表填滿3D物件表面或以Wireframe方式呈現。
  • setDrawMode():設定3D物件的繪製方式,預設為DrawMode.FILL
  • getMaterial():取得3D物件表面的材質。
  • setMaterial():設定3D物件表面的材質。

Box類別用以建立3D方塊,其建構函式如下,分別由widthheightdepth設定寬度、高度與深度:

public Box()
public Box(double width, double height, double depth)

並提供以下方法:

  • getDepth():取得方塊的深度。
  • setDepth():設定方塊的深度。
  • getHeight():取得方塊的高度。
  • setHeight():設定方塊的高度。
  • getWidth():取得方塊的寬度。
  • setWidth():設定方塊的寬度。

請參考以下範例分別示範以setCullFace()setDrawMode()方法不同的組合所產生的效果:

// 建立Box物件
Box box = new Box(100, 100, 100); 
// 以Wireframe方式呈現
box.setDrawMode(DrawMode.LINE); 
// 不省略
box.setCullFace(CullFace.NONE); 
// 平移Box物件
box.setLayoutX(150);
box.setLayoutY(150); 
...

【執行結果】
Box-1

// 建立Box物件
Box box = new Box(100, 100, 100); 
// 以Wireframe方式呈現
box.setDrawMode(DrawMode.LINE); 
// 省略Back Face
box.setCullFace(CullFace.BACK); 
...

【執行結果】
Box-2

// 建立Box物件
Box box = new Box(100, 100, 100); 
// 以Wireframe方式呈現
box.setDrawMode(DrawMode.LINE); 
// 省略Front Face
box.setCullFace(CullFace.FRONT); 
...

【執行結果】
Box-3

// 建立Box物件
Box box = new Box(100, 100, 100); 
// 以填滿方式呈現
box.setDrawMode(DrawMode.FILL); 
// 省略Back Face
box.setCullFace(CullFace.BACK); 
...

【執行結果】
Box-4

以下範例示範setMaterial()方法設定物件表面的材質,其中以PhongMaterial類別設定材質的相關顏色:

// 建立Box物件
Box box = new Box(100, 100, 100); 
// 以填滿方式呈現
box.setDrawMode(DrawMode.FILL); 
// 設定材質
PhongMaterial material = new PhongMaterial(); 
// Diffuse Color 
material.setDiffuseColor(Color.YELLOW); 
// Specular Color 
material.setSpecularColor(Color.WHITE); 
// 設定物件表面的材質
box.setMaterial(material);
...

【執行結果】
Box-6
以下範例示範setMaterial()方法設定貼圖:

// 建立Box物件
Box box = new Box(100, 100, 100); 

Image image = new Image(  
  getClass().getResourceAsStream("images/Javafx.png")); 

// 設定材質
PhongMaterial material = new PhongMaterial(); 
// 設定貼圖
material.setDiffuseMap(image);
...

【執行結果】
Box10

【參考資料】
[1] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[2] JavaFX:http://www.oracle.com/technetwork/java/javafx
[3] JavaFX 8.0 API Specification.
[4] Java Platform, Standard Edition 8 API Specification.
[5] JDK 8 Certified System Configurations

分享:
按讚!加入 CodeData Facebook 粉絲群

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

黃嘉輝副教授,目前任職於國立臺北商業大學企業管理學系,喜歡寫程式,特別愛Java,範例可參考教學網站

熱門論壇文章

熱門技術文章