文档



JavaFX:使用JavaFX图形
2 Shape3D(发布版8)

2 Shape3D

本章介绍了JavaFX 3D图形库中可用的Shape3D API。

有两种类型的3D形状:

2 Shape3D(发布版8)

预定义形状

预定义的3D形状提供了便于您快速创建现成的3D对象的功能。这些形状包括盒子、圆柱体和球体。示例用法如图2-1所示。

图2-1 预定义形状

图2-1的描述如下
"图2-1 预定义形状"的描述

示例2-1显示了Shape3D类的层次结构。其中包括定义具有指定3D网格数据的表面的MeshView类。还包括Box、Cylinder和Sphere子类。

示例2-1 Shape3D类层次结构

java.lang.Object
  javafx.scene.Node
     javafx.scene.shape.Shape3D
        javafx.scene.shape.MeshView
        javafx.scene.shape.Box
        javafx.scene.shape.Cylinder
        javafx.scene.shape.Sphere

使用以下信息创建预定义形状:

  • 要创建一个Box对象,请指定宽度、高度和深度。

    Box myBox = new Box(width, height, depth);
    
  • 要创建一个Cylinder对象,请指定半径和高度。

    Cylinder myCylinder = new Cylinder(radius, height);
    Cylinder myCylinder2 = new Cylinder(radius, height, divisions);
    
  • 要创建一个Sphere对象,请指定半径。

    Sphere mySphere = new Sphere(radius);
    Sphere mySphere2 = new Sphere(radius, divisions);
    

示例2-2显示了演示预定义3D形状使用的代码行。

示例2-2 预定义3D形状的示例用法

...
       final PhongMaterial redMaterial = new PhongMaterial();
       redMaterial.setSpecularColor(Color.ORANGE);
       redMaterial.setDiffuseColor(Color.RED);
 
       final PhongMaterial blueMaterial = new PhongMaterial();
       blueMaterial.setDiffuseColor(Color.BLUE);
       blueMaterial.setSpecularColor(Color.LIGHTBLUE);

       final PhongMaterial greyMaterial = new PhongMaterial();
       greyMaterial.setDiffuseColor(Color.DARKGREY);
       greyMaterial.setSpecularColor(Color.GREY);

       final Box red = new Box(400, 400, 400);
       red.setMaterial(redMaterial);
 
       final Sphere blue = new Sphere(200);
       blue.setMaterial(blueMaterial);
 
       final Cylinder grey = new Cylinder(5, 100);
       grey.setMaterial(greyMaterial);
...

用户自定义形状

示例2-3展示了JavaFX Mesh类层次结构,其中包含TriangleMesh子类。三角网格是3D布局中最常见的网格类型。

示例2-3 Mesh类层次结构

java.lang.Object
   javafx.scene.shape.Mesh (抽象类)
   javafx.scene.shape.TriangleMesh

TriangleMesh包含描述三角形几何网格的点、纹理坐标和面的分离数组。平滑组用于将属于同一曲面的三角形分组。不同平滑组的三角形形成硬边。

按照以下步骤创建TriangleMesh实例:

  1. 创建一个TriangleMesh的新实例。

    mesh = new TriangleMesh();
    
  2. 定义点集,即网格的顶点。

    float points[] = { … };
    mesh.getPoints().addAll(points);
    
  3. 描述每个顶点的纹理坐标。

    float texCoords[] = { … };
    mesh.getTexCoords().addAll(texCoords);
    
  4. 使用顶点构建面,即描述拓扑结构的三角形。

    int faces[] = { … };
    mesh.getFaces().addAll(faces);
    
  5. 定义每个面所属的平滑组。

    int smoothingGroups[] = { … };
    mesh.getFaceSmoothingGroups().addAll(smoothingGroups);
    

    平滑组调整面上顶点的法线,使其平滑或者分面。如果每个面都有不同的平滑组,网格将非常分面。如果每个面都有相同的平滑组,网格将看起来非常平滑。

关闭窗口

目录

JavaFX: 使用JavaFX图形

展开 折叠