2

我想在 JavaFX 中生成一些形状并将其导出为 STL 格式以进行 3D 打印。有没有图书馆可以帮助导出?

4

1 回答 1

1

对于与 JavaFX 3D 相关的第一部分,我建议您查看 FXyz

您会发现一个扩展的自定义形状库,例如:锥体、金字塔、分段球体、球体、圆环、分段圆环、棱镜、弹簧、弯曲弹簧、截锥体、二十面体、结……

另外,请查看采样器应用程序,您可以在其中轻松尝试所有这些形状和不同的选项(灯光、材料、纹理……)。

采样器应用

另一种选择是 JCSG项目,它将使用布尔运算创建 CSG(构造实体几何)形状。

对于第二部分,导出到 STL a TriangleMesh,据我所知,JavaFX 没有实现。

在提到的 FXyz 库中,您可以找到一个 OBJ导出器。仅当您使用 JCSG 时CSG.toStlString(),除了 OBJ 之外,还有一个 STL 导出器CSG.toObj()

无论如何,一旦你有了你的TriangleMesh,给定 STL格式,你可以很容易地创建一个导出器方法:

public class MeshUtils {

    public static void mesh2STL(String fileName, Mesh mesh) throws IOException{

        if(!(mesh instanceof TriangleMesh)){
            return;
        }
        // Get faces
        ObservableFaceArray faces = ((TriangleMesh)mesh).getFaces();
        int[] f=new int[faces.size()];
        faces.toArray(f);

        // Get vertices
        ObservableFloatArray points = ((TriangleMesh)mesh).getPoints();
        float[] p = new float[points.size()];
        points.toArray(p);

        StringBuilder sb = new StringBuilder();
        sb.append("solid meshFX\n");

        // convert faces to polygons
        for(int i=0; i<faces.size()/6; i++){
            int i0=f[6*i], i1=f[6*i+2], i2=f[6*i+4];
            Point3D pA=new Point3D(p[3*i0], p[3*i0+1], p[3*i0+2]);
            Point3D pB=new Point3D(p[3*i1], p[3*i1+1], p[3*i1+2]);
            Point3D pC=new Point3D(p[3*i2], p[3*i2+1], p[3*i2+2]);
            Point3D pN=pB.subtract(pA).crossProduct(pC.subtract(pA)).normalize();

            sb.append("  facet normal ").append(pN.getX()).append(" ").append(pN.getY()).append(" ").append(pN.getZ()).append("\n");
            sb.append("    outer loop\n");
            sb.append("      vertex ").append(pA.getX()).append(" ").append(pA.getY()).append(" ").append(pA.getZ()).append("\n");
            sb.append("      vertex ").append(pB.getX()).append(" ").append(pB.getY()).append(" ").append(pB.getZ()).append("\n");
            sb.append("      vertex ").append(pC.getX()).append(" ").append(pC.getY()).append(" ").append(pC.getZ()).append("\n");
            sb.append("    endloop\n");
            sb.append("  endfacet\n");
        }

        sb.append("endsolid meshFX\n");

        // write file
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName), Charset.forName("UTF-8"),
                StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
            writer.write(sb.toString());
        }
    }
}

现在您可以轻松导出您创建的任何形状:

@Override
public void start(Stage primaryStage) throws IOException {

    FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
    MeshUtils.mesh2STL("frustum.stl", cone.getMesh());

}

这是使用InteractiveMesh的 3D 模型浏览器加载 STL 文件的导出形状的图片:

STL

于 2015-04-30T16:42:18.057 回答