Esporta il modello JavaFX in file STL


Vorrei generare alcune forme in JavaFX ed esportarlo in formato STL per la stampa 3D. C'è una biblioteca là fuori per aiutare con l'esportazione?

Author: José Pereda, 2015-04-30

1 answers

Per la prima parte, relativa a JavaFX 3D, ti suggerisco di dare un'occhiata alla libreria FXyz .

Troverete una libreria extense di forme personalizzate come: Cono, Piramide, SegmentedSphere, Sferoide, Toro, SegmentedTorus, Prisma, Primavera, CurvedSpring, Frustum, Icosaedro, Nodo,...

Inoltre, dai un'occhiata al campionatore applicazione, dove puoi provare facilmente tutte queste forme e le diverse opzioni (luci, materiali, trame, ...).

Applicazione campionatore

Un'altra opzione è il progetto JCSG , che creerà forme CSG (Geometria solida costruttiva) con operazioni booleane.

Per la seconda parte, esportando in STL a TriangleMesh, per quanto ne so non esiste alcuna implementazione per JavaFX.

Nella libreria FXyz menzionata puoi trovare un OBJ exporter. Solo se stai lavorando con JCSG, c'è un esportatore STL CSG.toStlString(), oltre a quello OBJ CSG.toObj().

Ad ogni modo, una volta che hai il tuo TriangleMesh, dato il formato STL , è possibile creare facilmente un metodo di esportazione:

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());
        }
    }
}

E ora si può facilmente esportare una qualsiasi delle forme create:

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

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

}

Questa è un'immagine della forma esportata utilizzando il browser del modello 3D da InteractiveMesh per caricare il file STL:

STL

 1
Author: José Pereda, 2015-04-30 16:42:18